Stress Test et Benchmarking SAS Viya : Comment saturer vos CPU CAS efficacement
Simon 149 Aufrufe
Schwierigkeitsgrad
Expert
Veröffentlicht am :
Expertenrat
Michael
Un benchmark pertinent sur SAS Viya doit impérativement isoler la puissance de calcul pure des goulots d'étranglement de stockage. En privilégiant l'instruction DATA / single=no couplée à des fonctions transcendantes, vous validez non seulement la scalabilité de vos processeurs, mais aussi l'efficacité de l'interconnexion réseau lors du transfert de données entre nœuds (shuffling). Ma recommandation : surveillez toujours le ratio CPU User vs CPU System durant ces tests pour identifier d'éventuels problèmes de configuration de l'hyperviseur ou du noyau Linux.
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;
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.