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 (SIN, COS, TAN, EXP, LOG) 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.
/******************************************************************************
* STRESS TEST SAS VIYA (CAS) AVEC RAPPORT DE PERFORMANCE
******************************************************************************/
/* --- BLOC INITIALISATION DU CHRONO --- */
/* On crée une table vide pour stocker les résultats */
data work.time_log;
length Etape $50;
Start_Time = .;
End_Time = .;
Duration = .;
format Start_Time End_Time datetime20. Duration time13.2;
stop;
run;
/* Variable globale pour stocker le temps de départ */
%global start_tick;
/* Macro pour démarrer le chrono */
%macro tick;
%let start_tick = %sysfunc(datetime());
%mend;
/* Macro pour arrêter le chrono et enregistrer l'étape */
%macro tock(step_name);
data _null_;
start = &start_tick;
end = datetime();
duration = end - start;
/* Insertion dans la table de log */
call execute("data work.temp_log;");
call execute("Etape = '&step_name';");
call execute("Start_Time = " || start || ";");
call execute("End_Time = " || end || ";");
call execute("Duration = " || duration || ";");
call execute("format Start_Time End_Time datetime20. Duration time13.2;");
call execute("run;");
call execute("proc append base=work.time_log data=work.temp_log force; run;");
call execute("proc delete data=work.temp_log; run;");
run;
%mend;
/* --- DEBUT DU PROGRAMME UTILISATEUR --- */
/* 1. Démarrage de la session CAS */
%tick; /* Démarrage chrono */
cas mySession sessopts=(caslib=casuser timeout=3600 locale="fr_FR");
libname mycas cas caslib=casuser;
%tock(1. Connexion CAS); /* Fin chrono étape 1 */
/* 2. Création du jeu de données "Big Data" en mémoire */
%let duplication_factor = 100000;
%tick; /* Démarrage chrono */
data mycas.big_data_stress / single=no;
set sashelp.cars;
/* On duplique chaque ligne N fois */
do i = 1 to &duplication_factor.;
unique_id = catx('_', make, model, i, _n_);
/* SECTION STRESS CPU */
u1 = rand('Uniform');
u2 = rand('Normal', 50, 10);
stress_val1 = sin(invoice) * cos(msrp) + log(abs(weight)+1);
stress_val2 = exp(u1) * sqrt(invoice) / (tan(u1) + 2);
output;
end;
keep make model type origin invoice msrp unique_id stress_val1 stress_val2;
run;
%tock(2. Generation Data (x&duplication_factor)); /* Fin chrono étape 2 */
/* Vérification taille (CASUTIL) */
%tick;
proc casutil;
contents casdata="big_data_stress";
run;
%tock(3. CASUTIL Contents);
/* 3. Application de la procédure pour "Stresser" le CPU */
%tick;
PROC MDSUMMARY DATA=mycas.big_data_stress;
groupby make origin type;
var stress_val1 stress_val2 invoice msrp;
OUTPUT out=mycas.summary_results;
RUN;
%tock(4. MDSUMMARY Stress Test);
/* --- RAPPORT FINAL --- */
title "Rapport de Performance - Stress Test CAS";
proc print data=work.time_log noobs;
var Etape Start_Time End_Time Duration;
sum Duration; /* Affiche le temps total en bas */
run;
title;
/* Fin de la session */
cas mySession terminate;
keep make model type origin invoice msrp unique_id stress_val1 stress_val2;
77
RUN;
78
%tock(2. Generation DATA (x&duplication_factor)); /* Fin chrono étape 2 */
79
80
81
/* Vérification taille (CASUTIL) */
82
%tick;
83
PROC CASUTIL;
84
contents casdata="big_data_stress";
85
RUN;
86
%tock(3. CASUTIL Contents);
87
88
89
/* 3. Application de la procédure pour "Stresser" le CPU */
90
%tick;
91
PROC MDSUMMARYDATA=mycas.big_data_stress;
92
groupby make origin type;
93
var stress_val1 stress_val2 invoice msrp;
94
OUTPUT out=mycas.summary_results;
95
RUN;
96
%tock(4. MDSUMMARY Stress Test);
97
98
99
/* --- RAPPORT FINAL --- */
100
title "Rapport de Performance - Stress Test CAS";
101
PROC PRINTDATA=work.time_log noobs;
102
var Etape Start_Time End_Time Duration;
103
sum Duration; /* Affiche le temps total en bas */
104
RUN;
105
title;
106
107
/* Fin de la session */
108
cas mySession terminate;
Important Disclaimer
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.