Acesta este mai mult un comentariu lung decât un răspuns. Poate că va stimula alte sugestii. Ideea de bază este să rezerve și să aloce memorie astfel încât sysbench trebuie să folosească apoi o zonă diferită de memorie pentru buffer-ul blocului de memorie pentru a observa dacă performanța este aceeași pe toată memoria.
Sistemul de testare are doar 32G de memorie pe DIMM-uri 4X8G.
Mai întâi, rulați sysbench în mod normal, dar creșteți durata testului suficient pentru a obține timp pentru a obține câteva informații în timp ce se execută:
doug@s19:~/c$ sysbench --test=memorie --memory-block-size=4G --memory-total-size=512G --num-threads=1 --time=60 run
AVERTISMENT: opțiunea --test este depreciată. Puteți trece un nume de script sau o cale pe linia de comandă fără opțiuni.
sysbench 1.0.18 (folosind sistemul LuaJIT 2.1.0-beta3)
Rularea testului cu următoarele opțiuni:
Numar de fire: 1
Inițializarea generatorului de numere aleatoare din ora curentă
Rularea testului de viteză a memoriei cu următoarele opțiuni:
dimensiune bloc: 4194304KiB
dimensiune totală: 524288 MiB
operatie: scrie
domeniul de aplicare: global
Se inițializează firele de lucru...
Au început firele!
Total operațiuni: 128 (3,05 pe secundă)
524288,00 MiB transferați (12509,51 MiB/sec)
Statistici generale:
timp total: 41,9101s
numărul total de evenimente: 128
Latență (ms):
min: 327,22
medie: 327,42
max: 328,09
Percentila 95: 325,98
suma: 41909,72
Corectitudinea firelor:
evenimente (avg/stddev): 128,0000/0,00
timp de execuție (avg/stddev): 41,9097/0,00
Și în cele 41 de secunde în care testul a durat să se execute și într-un alt terminal am făcut asta:
doug@s19:~$ ps aux | grep sysbench
doug 10489 92,2 12,8 4227496 4204436 puncte/1 Sl+ 09:48 0:03 sysbench --test=memory --memory-block-size=4G --memory-total-size=512G --num-threads =60 de alergare
doug 10492 0,0 0,0 9040 732 puncte/2 S+ 09:48 0:00 grep --color=auto sysbench
doug@s19:~$ pmap 10489 | grep anon | grep "4195"
00007f25cbb5a000 4195456K rw--- [ anon ]
Am facut tot ciclul de cateva ori:
00007fa4bd7b4000 4195456K rw--- [ anon ]
00007f32c9878000 4195456K rw--- [ anon ]
00007f4837211000 4195456K rw--- [ anon ]
ceea ce arată că nu știm cu adevărat ce memorie este folosită sau maparea înapoi la DIMM. Să continuăm oricum.
EDITARE: cele de mai sus pot fi făcute repetabile, dezactivând Randomizarea spațiului de adrese (ASLR):
sudo sysctl kernel.randomize_va_space=0
Acum, rezervați o bucată de memorie pentru a forța ca tamponul sysbench să fie alocat în altă parte. Cineva poate avea o idee mai bună, dar am scris un program:
doug@s19:~/c$ cat reservem.c
/************************************************ ****************************
*
* rezervăm.c 2021.07.20 Smythies
* alocă o bucată de memorie pentru un timp.
* utilizarea curentă este de a forța un alt program să folosească o zonă diferită
* de memorie.
* vezi și: https://askubuntu.com/questions/1352756/ram-has-become-very-slow-low-write-speed-and-high-latency
* vezi slao testm.c de la care a pornit acest cod.
*
**************************************************** ***************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char *fptr;
i lung, k;
/* Ajustați după cum este necesar pentru cerințele de utilizare */
i = 8589934592;
if(( fptr = (char *)malloc(i)) == NULL){
printf("rezervă: alocare memorie eșuată, Ieșire...\n");
ieșire(-1);
}
în timp ce (( fptr == NULL) && (i > 0));
for(k = 0; k <i; k++){ /* astfel încât memoria să fie într-adevăr alocată și nu doar rezervată */
fptr[k] = (char) (k & 255);
} /* final pentru */
printf("reservem: memorie rezervata si alocata. acum inactiv...\n");
somn (180); /* astfel încât să se poată face alte teste și observații. Ajustați după cum este necesar. */
gratuit(fptr);
printf("rezerva: memoria a fost liberata. Terminat si se ies...\n");
return(0);
} /* program final */
A compilat:
doug@s19:~/c$ cc reservem.c -o reservem
apoi a rulat-o și apoi a refăcut pașii anteriori în timp ce blocul de memorie a fost rezervat și alocat. Obținere:
doug@s19:~$ ps aux | grep sysbench
doug 11324 93,8 12,8 4227496 4204340 puncte/1 Sl+ 13:58 0:09 sysbench --test=memory --memory-block-size=4G --memory-total-size=512G --num-threads =60 de alergare
doug 11327 0,0 0,0 9040 664 puncte/2 S+ 13:59 0:00 grep --color=auto sysbench
doug@s19:~$ pmap 11324 | grep anon | grep "4195"
00007fc5f2df8000 4195456K rw--- [ anon ]
Și pentru memoria rezervată:
doug@s19:~$ ps aux | grep reservem
doug 11314 55,0 25,6 8391108 8389584 puncte/0 S+ 13:57 0:11 ./rezervă
doug 11318 0.0 0.0 9040 740 pts/2 S+ 13:57 0:00 grep --color=auto reservem
doug@s19:~$ pmap 11314 | grep anon | grep " 8388612K"
00007f11a6bfc000 8388612K rw--- [ anon ]
Și:
524288,00 MiB transferați (12499,79 MiB/sec)
În mod similar pentru rezervarea și alocarea de 2 și 3 ori 8G:
doug@s19:~$ ps aux | grep reservem
doug 11335 85,0 25,6 8391108 8389704 puncte/0 S 14:07 0:11 ./rezervă
doug 11336 92,0 25,6 8391108 8389672 puncte/0 S 14:07 0:11 ./rezervă
doug 11340 0.0 0.0 9040 736 pts/2 S+ 14:08 0:00 grep --color=auto reservem
doug@s19:~$ pmap 11335 | grep anon | grep " 8388612K"
00007fae2ce3f000 8388612K rw--- [ anon ]
doug@s19:~$ pmap 11336 | grep anon | grep " 8388612K"
00007f20cb627000 8388612K rw--- [ anon ]
doug@s19:~$ ps aux | grep sysbench
doug 11347 96,6 12,8 4227496 4204468 puncte/1 Sl+ 14:08 0:12 sysbench --test=memory --memory-block-size=4G --memory-total-size=512G --num-threads =60 de alergare
doug 11350 0,0 0,0 9040 740 puncte/2 S+ 14:08 0:00 grep --color=auto sysbench
doug@s19:~$ pmap 11347 | grep anon | grep "4195"
00007f37dbe3c000 4195456K rw--- [ anon ]
și:
524288,00 MiB transferați (12521,74 MiB/sec)
3X:
doug@s19:~$ ps aux | grep reservem
doug 11388 100 21,0 8391108 6889064 puncte/0 R 14:12 0:09 ./rezervă
doug 11389 103 19,2 8391108 6292368 puncte/0 R 14:12 0:08 ./rezervă
doug 11390 100 16,3 8391108 5334328 puncte/0 R 14:12 0:07 ./rezervă
doug 11392 0.0 0.0 9040 724 puncte/2 S+ 14:12 0:00 grep --color=auto reservem
doug@s19:~$ pmap 11388 | grep anon | grep " 8388612K"
00007f2b83d2d000 8388612K rw--- [ anon ]
doug@s19:~$ pmap 11389 | grep anon | grep " 8388612K"
00007f2921e0c000 8388612K rw--- [ anon ]
doug@s19:~$ pmap 11390 | grep anon | grep " 8388612K"
00007f2a23f2b000 8388612K rw--- [ anon ]
doug@s19:~$ ps aux | grep sysbench
doug 11402 107 12,8 4227496 4204420 puncte/1 Sl+ 14:12 0:07 sysbench --test=memorie --memory-block-size=4G --memory-total-size=512G --num-thread =60 de alergare
doug 11405 0,0 0,0 9040 672 puncte/2 S+ 14:12 0:00 grep --color=auto sysbench
doug@s19:~$ pmap 11402 | grep anon | grep "4195"
00007fe64b54b000 4195456K rw--- [ anon ]
și:
524288,00 MiB transferați (12504,34 MiB/sec)
Pentru referință, performanța pe acest sistem față de dimensiunea blocului de memorie:
Dimensiunea blocului: performanță (MiB/sec):
256 2750,99
512 4937,70
1K 8216.82
2K 12290,93
4K 16334,92
8K 19498.37
16K 21663,68
32K 22514,94
64K 23372,45
128K 23815.14
256K 23967,98
512K 24126.43
1M 24226,70
2M 24279,93
4M 24310.19
8M 23632.07
16M 20622.04
32M 16149,71
64M 14206.06
128M 13303.15
256M 12853.12
512M 12720,34
1G 12584.68
2G 12538.66
4G 12502.66
8G 12490.63
16G 12482.25