GNU-sjov med 48 cores og 0.5 TB RAM
Hvormange processer kan man egentlig køre på en GNU/Linux server?
Nå, jeg skal jo bruge min nye, brugte server til et eller andet. Så hvorfor ikke finde ud af, hvormange samtidige processer den kan klare?
Jeg starter med at ramme i nogle begrænsninger, men når de er ryddet af vejen så kan jeg køre:
#!/bin/bash
s() {
perl -e 'for(1..shift){ if(not fork()) { sleep 10000; exit } }' $@;
}
export -f s
seq 193 | parallel s 10000
Det starter 193 * 10000 processer. OK, det er ikke det mest interessante program, men er programmet meget større, så løber jeg tør for RAM.
Herefter rammer jeg en grænse igen. Ved 1935253 +- 1000 går det galt: Der er en hård grænse, som jeg ikke kan finde ud af grunden til. Den er ikke den samme fra gang til gang.
Men det er en grænse per bruger, så hvis jeg logger ind som en anden bruger, kan jeg igen køre:
#!/bin/bash
s() {
perl -e 'for(1..shift){ if(not fork()) { sleep 10000; exit } }' $@;
}
export -f s
seq 67 | parallel s 10000
Så er vi oppe på 2600000 processer, og så begynder der at komme en global grænse:
Processer | Status |
---|---|
2640682 | problemfrit - næsten alt kører normalt (se nedenfor) |
2670685 | langsommere at starte og stoppe processer |
2672266 | serveren stopper med at svare i visse terminaler og kan ikke køre flere programmer |
2678008 | presset men overlever |
2700727 | presset men overlever |
2708174 | serveren stopper med at svare i visse terminaler og kan ikke køre flere programmer |
Her er grænsen endnu mindre præcis end de 1935253.
Man kunne tro, at det skyldtes manglende RAM, men jeg kan køre:
$ \time -v perl -e '$a="x"x1000_000_000; for (1..10) { push @a,$t++.$a; }'
som bruger 10 GB RAM på 40 sekunder.
Når processerne alle dør på samme tid, så får maskinen lidt travlt:
18:56:13 up 22 min, load average: 2035025.72, 1167147.72, 482550.11
(Ja: et load på TO MILLIONER!)
Men skægt nok er den fint responsiv ved 2.6 Mproc.
Dog ikke, hvis man laver noget, der kikker på alle processer:
$ ls /proc | LC_ALL wc -l
tager 12 (tolv!) sekunder.
$ ps aux | LC_ALL wc -l
tager 4.5 minut.
Ctrl-C eller Ctrl-Z til en million processer tager også ret lang tid.
Nogle programmer går itu: pstree
er helt død - det virker som om den laver noget O(n*n), og det går galt langt tidligere end 1 Mproc.
top
og specielt htop
piver gevaldigt. top
kan opdatere hvert 10. minut - htop
endnu sjældnere.
Under max load ser det sådan ud:
top 20:20:36 up 1:46 load average: 2707746.05, 2687605.06, 2184768.12
Tasks: 2708372 total, 72623 running, 2635504 sleeping, 0 stopped
%Cpu(s): 1.5 us, 97.5 sy, 0.0 ni, 0.0 id, 1.0 wa, 0.0 hi
GiB Mem : 472.397 total, 16.104 free, 456.077 used, 0.215 cache
GiB Swap: 300.098 total, 286.845 free, 13.254 used. 14.796 avail
3562017 bash 27964 4420 4076 R 100.0 0.0 1:25.50 perl
1267231 tange 3115520 2.898g 2360 R 37.9 0.6 29:02.45 top
380 root 0 0 0 D 14.4 0.0 6:16.22 kswapd3
384 root 0 0 0 S 14.2 0.0 6:07.50 kswapd7
381 root 0 0 0 D 12.2 0.0 5:11.82 kswapd4
382 root 0 0 0 S 10.7 0.0 4:00.30 kswapd5
1807120 parallel 27964 288 0 D 7.8 0.0 1:41.64 perl
1767502 parallel 27964 336 0 D 7.7 0.0 1:40.19 perl
1745951 parallel 27964 292 0 D 6.3 0.0 1:22.81 perl
1693199 parallel 27964 288 0 D 5.4 0.0 1:10.85 perl
383 root 0 0 0 S 5.4 0.0 3:38.04 kswapd6
1733547 parallel 27964 332 0 D 4.4 0.0 0:57.30 perl
1740658 parallel 27964 348 0 D 4.4 0.0 0:57.19 perl
377 root 0 0 0 S 4.1 0.0 2:19.27 kswapd0
1776134 parallel 27964 328 0 D 3.1 0.0 0:40.75 perl
1768307 bash 27964 348 0 D 2.6 0.0 0:33.72 perl
1713869 parallel 27964 340 0 D 2.4 0.0 0:31.66 perl
1729947 parallel 27964 344 0 D 1.5 0.0 0:20.23 perl
2330 gdm 7907136 48320 19128 S 1.5 0.0 6:32.17 gnome-sh
1790073 parallel 27964 292 0 D 1.3 0.0 0:16.57 perl
1760296 parallel 27964 308 0 D 1.2 0.0 0:15.58 perl
1770488 parallel 27964 316 0 D 1.1 0.0 0:14.89 perl
310 root 0 0 0 S 1.0 0.0 0:41.90 khungtas
1784486 bash 27964 316 0 D 1.0 0.0 0:12.76 perl
Hvornår har du sidst set top
bruge 3 GB RAM?
Fork bomb
$ :(){ :|:;}
$ :
Vi har vist alle prøvet det - og oplevet, at det skal man kun gøre, hvis man alligevel skal slukke for sin maskine.
Men med 48 cores så mærker man det næsten ikke - naturligvis bortset fra programmer, som kikker på hele processlisten (top
, pstree
, htop
og lignende).
00:56:25 up 16 min, load average: 689967.88, 576005.24, 301198.60
Det er lidt uvirkeligt, at man uden problemer kan logge ind som en anden bruger og køre videre.
CPU speed
De 48 AMD 6174 cores er ikke just verdens hurtigste. En compile af Linux 4.4.2 tager 234 sekunder. Det er 15.4 compiles/hour og på linje med en EPYC 7302P (øverst i tabellen).
Men selv med 2.6 Mproc i baggrunden tager det kun 250 sekunder. Det er kun hvis man presser maskinen (som i tabellen ovenfor), at den bliver væsentlig langsommere: så tager start og specielt slut af en process ret lang tid. En compile tager nu 1178 sekunder.
Alt i alt er jeg positivt overrasket over, at 2.6 Mproc ikke sløver andre processer ned.
Hvad kan maskinen ellers bruges til
Jeg faldt i snak med nogle storage folk (ja, ZFS). De var imponerede over pris per GB RAM. Man får næppe nogen SSD eller RAID, der er lige så hurtig som middelmådig DDR3 RAM, så alene som cache bliver det interessant. ZFS vil desuden som tommelfingerregel gerne have 1 GB RAM til 1 TB disk, hvis den skal lave deduplication og sånonsmarte ting. Så gør det mindre om CPU'en ikke er et lyn. Med 0.5 TB RAM ville maskinen kunne være være storage server for 0.5 PB disk (med nogle externe disk arrays og nogle 10 Gbps kort naturligvis).
Men det er ikke lige et behov jeg har idag, så jeg slukker for min 48 core server for idag.
