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;
Avertissement important
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.