Cand vine vorba de sisteme de calcul puse in productie e important sa ne asiguram ca sunt testate minutios toate cele trei caracteristici principale: CPU, RAM si HDD. Pentru asta putem folosi o aplicatie de testare numita stress. Aplicatia se poate descarca de pe pagina oficiala sau, in FreeBSD, poate fi instalata din porturi (/usr/ports/sysutils/stress).
Hai sa vedem cateva exemple pentru fiecare caracteristica testata:
%stress --cpu 4 --timeout 5s --verbose stress: info: [42155] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd stress: dbug: [42155] using backoff sleep of 12000us stress: dbug: [42155] setting timeout to 5s stress: dbug: [42155] --> hogcpu worker 4 [42156] forked stress: dbug: [42155] using backoff sleep of 9000us stress: dbug: [42155] setting timeout to 5s stress: dbug: [42155] --> hogcpu worker 3 [42157] forked stress: dbug: [42155] using backoff sleep of 6000us stress: dbug: [42155] setting timeout to 5s stress: dbug: [42155] --> hogcpu worker 2 [42158] forked stress: dbug: [42155] using backoff sleep of 3000us stress: dbug: [42155] setting timeout to 5s stress: dbug: [42155] --> hogcpu worker 1 [42159] forked stress: dbug: [42155] < -- worker 42159 signalled normally stress: dbug: [42155] <-- worker 42158 signalled normally stress: dbug: [42155] <-- worker 42157 signalled normally stress: dbug: [42155] <-- worker 42156 signalled normally stress: info: [42155] successful run completed in 5s %
Pentru testarea procesorului, stress foloseste functia sqrt(). Folosind parametrul –cpu 4 ii spunem aplicatiei sa porneasca 4 instante in paralel. Pentru un test eficient e bine ca numarul de instante sa fie mai mare sau cel putin egal cu numarul de procesoare instalate in sistem.
Parametrul –timeout 5s ii spune aplicatiei sa ruleze timp de 5 secunde iar –verbose ne afiseaza detaliile testarii – liniile care contin [dbug]. Acesti parametri ii vom folosi si pentru testarea HDD-ului si a memoriei RAM.
%stress --vm 1 --vm-bytes 128M --timeout 3s --verbose stress: info: [42628] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd stress: dbug: [42628] using backoff sleep of 3000us stress: dbug: [42628] setting timeout to 3s stress: dbug: [42628] --> hogvm worker 1 [42629] forked stress: dbug: [42629] allocating 134217728 bytes ... stress: dbug: [42629] touching bytes in strides of 4096 bytes ... stress: dbug: [42629] freed 134217728 bytes stress: dbug: [42629] allocating 134217728 bytes ... stress: dbug: [42629] touching bytes in strides of 4096 bytes ... ................................................................. stress: dbug: [42628] < -- worker 42629 signalled normally stress: info: [42628] successful run completed in 3s %
Pentru testarea memoriei se foloseste functia malloc(). Parametrul --vm 1 ii spune aplicatiei cate instante vor fi rulate in paralel. Parametrul --vm-bytes 128M specifica marimea zonei de memorie alocate pe fiecare instanta. Optional putem adauga si parametrul --vm-hang 2 care ii spune aplicatiei cate secunde sa astepte inainte de a aloca memoria - parametru foarte util daca dorim sa testam sistemul in conditii cu foarte putina memorie disponibila.
Daca pana aici stress s-a dovedit o aplicatie utila, e momentul sa dezamageasca putin. Testarea discurilor este de fapt o testare superficiala a discului pe care e instalat sistemul de operare. O metoda prin care sa alegem discul care ne intereseaza sa-l testam nu a fost implementata inca. Deci testarea HDD-ului va fi de fapt testarea operatiilor I/O iar rezultatul va fi relevant doar din punct de vedere al comunicarii cu HDD-ul, nu si din punct de vedere al calitatii acestuia.
%stress --hdd 1 --hdd-bytes 1 --timeout 3s --verbose stress: info: [42699] dispatching hogs: 0 cpu, 0 io, 0 vm, 1 hdd stress: dbug: [42699] using backoff sleep of 3000us stress: dbug: [42699] setting timeout to 3s stress: dbug: [42699] --> hoghdd worker 1 [42700] forked stress: dbug: [42700] seeding 1048575 byte buffer with random data stress: dbug: [42700] opened ./stress.8fHbLc for writing 1 bytes stress: dbug: [42700] unlinking ./stress.8fHbLc stress: dbug: [42700] fast writing to ./stress.8fHbLc stress: dbug: [42700] slow writing to ./stress.8fHbLc stress: dbug: [42700] closing ./stress.8fHbLc after 1 bytes ............................................................ stress: dbug: [42700] opened ./stress.yQEHnM for writing 1 bytes stress: dbug: [42700] unlinking ./stress.yQEHnM stress: dbug: [42700] fast writing to ./stress.yQEHnM stress: dbug: [42700] slow writing to ./stress.yQEHnM stress: dbug: [42700] closing ./stress.yQEHnM after 1 bytes stress: dbug: [42699] < -- worker 42700 signalled normally stress: info: [42699] successful run completed in 3s %
Pentru testarea HDD-ului se foloseste functia write(). Testarea presupune crearea de fisiere in directorul curent si rularea unor teste pe aceste fisiere - singurul mod de a testa un HDD anume fiind, de fapt, pornirea testarii dintr-un director de pe HDD-ul in cauza.
Parametrul --hdd 1 ii spune aplicatiei cate instante vor fi rulate in paralel. Cu --hdd-bytes 1 putem seta numarul de bytes care vor fi scrisi in fisierele pentru testare.
Cele trei teste le-am prezentat separat pentru a izola testele intre ele. Daca ne intereseaza un test cu adevarat relevan, putem combina cele trei teste intr-unul singur pentru ca sistemul sa fie intr-adevar forjat iar rezultatele finale sa fie relevante. Un exemplu de test relevant pentru un sistem cu patru core-uri Xeon si 8GB RAM ar fi urmatorul:
%stress --cpu 8 --io 4 --hdd 4 --hdd-bytes 2048 --vm 20 --vm-bytes 512M --vm-hang 1 --timeout 5m stress: info: [42996] dispatching hogs: 8 cpu, 4 io, 20 vm, 4 hdd stress: info: [42996] successful run completed in 301s %
Un astfel de test consuma foarte repede toate resursele sistemului (inclusiv swap) si ii creste incarcarea la cel putin 25 de puncte apropiindu-se astfel de situatiile critice intalnite in viata reala.