Guide SAS VIYA

Stress Test et Benchmarking SAS Viya : Comment saturer vos CPU CAS efficacement

Simon 23/12/2025 80 views

Introduction

Lors du déploiement ou de la maintenance d'un environnement SAS© Viya, une question revient systématiquement : "L'infrastructure peut-elle encaisser la charge ?".

Souvent, les tests se limitent à charger de gros fichiers CSV (test d'I/O disque) ou à lancer des modèles complexes sur de petites tables. Cependant, pour véritablement éprouver la puissance de calcul (CPU) et la gestion de la mémoire distribuée des nœuds CAS (Cloud Analytic Services), il faut une approche différente.

Cet article présente une méthodologie "Pure Code" pour générer un stress test massif, sans dépendance à des fichiers externes, et entièrement exécuté en mémoire RAM.

La Méthodologie

Notre approche repose sur trois piliers techniques pour garantir que le test sollicite l'infrastructure et non le disque dur.

1. La "Data Factory" en mémoire (In-Memory Generation)

Plutôt que de charger des téraoctets de données depuis un disque (ce qui testerait la bande passante réseau/stockage), nous utilisons le moteur CAS pour générer la donnée.

  • Technique : Utilisation de l'instruction data / single=no.

  • Effet : Le code s'exécute en parallèle sur tous les workers CAS. Chaque cœur de processeur disponible est utilisé pour fabriquer des lignes de données.

  • Volume : À partir de la petite table sashelp.cars, nous appliquons un facteur de multiplication (ex: x100 000) pour atteindre instantanément des dizaines de millions de lignes.

2. Saturation de l'ALU et du FPU (Stress CPU)

Déplacer des données ne suffit pas à faire chauffer les processeurs. Il faut leur donner des calculs complexes.

  • Technique : Injection de fonctions mathématiques transcendantes (SINCOSTANEXPLOG) et génération de nombres aléatoires (RAND).

  • Effet : Ces opérations forcent l'unité de calcul en virgule flottante (FPU) du processeur à travailler à 100%, simulant des charges de travail de type Machine Learning ou Scoring complexe.

3. Le "Shuffle" Réseau et l'Agrégation

Une fois les données créées, il faut tester la capacité du cluster à communiquer.

  • Technique : Utilisation de PROC MDSUMMARY avec un GROUP BY sur plusieurs variables.

  • Effet : Pour grouper les données, CAS doit redistribuer les lignes entre les différents nœuds (Shuffling). Cela teste la latence inter-nœuds et la bande passante mémoire, tout en continuant à consommer du CPU pour les calculs statistiques (Moyenne, Écart-type).

4. Métrologie Intégrée

Le code inclut un système de macros (%tick / %tock) qui capture le temps exact d'exécution de chaque étape et génère un rapport final automatique.


Le Code Complet

Voici le programme complet. Il est autonome (n'a besoin d'aucune donnée externe autre que sashelp) et peut être copié-collé directement dans SAS© Studio.

1/******************************************************************************
2 * STRESS TEST SAS VIYA (CAS) AVEC RAPPORT DE PERFORMANCE
3 ******************************************************************************/
4 
5/* --- BLOC INITIALISATION DU CHRONO --- */
6/* On crée une table vide pour stocker les résultats */
7DATA work.time_log;
8 LENGTH Etape $50;
9 Start_Time = .;
10 End_Time = .;
11 Duration = .;
12 FORMAT Start_Time End_Time datetime20. Duration time13.2;
13 stop;
14RUN;
15 
16/* Variable globale pour stocker le temps de départ */
17%global start_tick;
18 
19/* Macro pour démarrer le chrono */
20%macro tick;
21 %let start_tick = %sysfunc(datetime());
22%mend;
23 
24/* Macro pour arrêter le chrono et enregistrer l'étape */
25%macro tock(step_name);
26 DATA _null_;
27 start = &start_tick;
28 END = datetime();
29 duration = END - start;
30
31 /* Insertion dans la table de log */
32 call execute("data work.temp_log;");
33 call execute("Etape = '&step_name';");
34 call execute("Start_Time = " || start || ";");
35 call execute("End_Time = " || END || ";");
36 call execute("Duration = " || duration || ";");
37 call execute("format Start_Time End_Time datetime20. Duration time13.2;");
38 call execute("run;");
39
40 call execute("proc append base=work.time_log data=work.temp_log force; run;");
41 call execute("proc delete data=work.temp_log; run;");
42 RUN;
43%mend;
44 
45/* --- DEBUT DU PROGRAMME UTILISATEUR --- */
46 
47/* 1. Démarrage de la session CAS */
48%tick; /* Démarrage chrono */
49cas mySession sessopts=(caslib=casuser timeout=3600 locale="fr_FR");
50LIBNAME mycas cas caslib=casuser;
51%tock(1. Connexion CAS); /* Fin chrono étape 1 */
52 
53 
54/* 2. Création du jeu de données "Big Data" en mémoire */
55%let duplication_factor = 100000;
56 
57%tick; /* Démarrage chrono */
58DATA mycas.big_data_stress / single=no;
59 SET sashelp.cars;
60
61 /* On duplique chaque ligne N fois */
62 DO i = 1 to &duplication_factor.;
63
64 unique_id = catx('_', make, model, i, _n_);
65
66 /* SECTION STRESS CPU */
67 u1 = rand('Uniform');
68 u2 = rand('Normal', 50, 10);
69
70 stress_val1 = sin(invoice) * cos(msrp) + log(abs(weight)+1);
71 stress_val2 = exp(u1) * sqrt(invoice) / (tan(u1) + 2);
72
73 OUTPUT;
74 END;
75
76 keep make model type origin invoice msrp unique_id stress_val1 stress_val2;
77RUN;
78%tock(2. Generation DATA (x&duplication_factor)); /* Fin chrono étape 2 */
79 
80 
81/* Vérification taille (CASUTIL) */
82%tick;
83PROC CASUTIL;
84 contents casdata="big_data_stress";
85RUN;
86%tock(3. CASUTIL Contents);
87 
88 
89/* 3. Application de la procédure pour "Stresser" le CPU */
90%tick;
91PROC MDSUMMARY DATA=mycas.big_data_stress;
92 groupby make origin type;
93 var stress_val1 stress_val2 invoice msrp;
94 OUTPUT out=mycas.summary_results;
95RUN;
96%tock(4. MDSUMMARY Stress Test);
97 
98 
99/* --- RAPPORT FINAL --- */
100title "Rapport de Performance - Stress Test CAS";
101PROC PRINT DATA=work.time_log noobs;
102 var Etape Start_Time End_Time Duration;
103 sum Duration; /* Affiche le temps total en bas */
104RUN;
105title;
106 
107/* Fin de la session */
108cas mySession terminate;