FreeMem, Cache, dirty_background_ratio, dirty_ratio und Co.

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

FreeMem, Cache, dirty_background_ratio, dirty_ratio und Co.

Beitrag von mistersixt » 04.12.2014 13:38:08

Moin moin,

ich habe hier einen Server mit 4 x CPU E5-2643 und 64 GB RAM, dazu ein RAID-10 mit SAS-Platten. Es läuft ein MySQL mit 20 GB key_buffer und einer 60 GB grossen DB, dazu einige Prozesse, die auf der DB herumhampeln und weitere, die ansich etwas im Hintergrund tun und die CPUs mässig belasten.

Nun sehe ich mit "vmstat 1", dass Stück für Stück die Werte bei "free" kleiner werden und bei "cache" grösser werden, beispielsweise so:

Code: Alles auswählen

...
 0 0   8512 373376 259960 30166020    0    0     0    96 15148 21682  2  1 97  0
 0  0   8512 373036 259960 30166228    0    0     4   324 18024 26187  2  1 97  0
 2  0   8512 373424 259968 30166380    0    0     0    32 13982 19999  2  1 97  0
 3  0   8512 372384 259968 30166552    0    0     0    16 14930 21712  2  1 97  0
 0  0   8512 370980 259976 30166760    0    0     0    32 19202 26688  4  2 94  0
 0  0   8512 370624 259980 30166864    0    0     0    68 18794 27617  3  0 97  0
 3  0   8512 369620 259980 30167052    0    0     0  2468 19537 26261  4  1 95  0
 5  0   8512 369992 259984 30167240    0    0     0 13524 18405 19507  2  1 97  0
 5  0   8512 352936 259984 30167472    0    0     0  2124 18129 25813 10  6 83  0
...
Der Kernel scheint also Stück-für-Stück Dinge in den Page Cache zu laden. Aber dann, wenn der Wert von "free" einen gewissen, kleinen Wert erreicht hat, scheint der Kernel grossflächig aufzuräumen, das sieht dann so aus:

Code: Alles auswählen

...
 0  0   8512 617656 235152 30118820    0    0     0     0 17503 23328  3  2 95  0
 0  0   8512 617928 235156 30118908    0    0     0  5616 17956 32272  2  0 97  0
 6  0   8512 600752 235156 30119008    0    0     0    88 37926 40096  6  2 92  0
 9  0   8512 2161564 233520 28462332    0    0    12     0 137068 120761 31  7 61  0
11  0   8512 2137700 233524 28465200    0    0    64   308 139075 192378 31  6 63  0
 4  0   8512 2157456 233524 28466344    0    0     8     0 95992 133896 28 11 61  0
 0  0   8512 2157472 233528 28467196    0    0     0  4556 88982 121980 14  4 82  0
 5  0   8512 2157608 233528 28467972    0    0     4    60 95354 132799 14  4 82  0
...
Das Problem ist nun Folgendes: sobald der Kernel - wie in obigem Beispiel - 1.5 GB "freiräumt", scheinen parallel die Prozesse extrem viel zu tun zu haben, und auch die Context-Switches gehen durch die Decke. Nach ca. 4-5 Sekunden hat sich alles beruhigt.... und das ganze Spiel geht wieder von vorne los, auf diesem Server alle ca. 2 Stunden, free wird wieder kleiner, cache wieder immer grösser usw. usw.

Jetzt könnte man sagen: okay, 5 Sekunden, ist ja nicht viel, aber es laufen auch zeitkritische Prozesse auf dem System, die beispielsweise per UDP Netzwerkpakete empfangen müssen, die kommen so sehr ins Stocken, dass sie Datagramme verlieren.

Also mal im Internet nach Parametern gesucht und habe dirty_background_ratio, dirty_ratio und Co. gefunden. Aber die Meinungen gehen anscheinend stark auseinander, wie die Parameter sinnvoll zu setzen sind. Aktuell sind es 10 bei dirty_background_ratio und 20 bei dirty_ratio, ferner der Default Wert von 30s beim dirty_expire_centisec.

Jemand eine Idee, wie man das optimieren kann? Wie kann ich dem Kernel sagen, dass er vielleicht nicht ein einem grossen Schwung so eine Transaktion machen soll, sondern vielleicht in kleineren Häppchen, dafür aber desöfteren? Oder weiss Jemand andere Tips?

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

Benutzeravatar
Saxman
Beiträge: 4233
Registriert: 02.05.2005 21:53:52
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: localhost

Re: FreeMem, Cache, dirty_background_ratio, dirty_ratio und

Beitrag von Saxman » 04.12.2014 13:51:37

mistersixt hat geschrieben: Aktuell sind es 10 bei dirty_background_ratio und 20 bei dirty_ratio, ferner der Default Wert von 30s beim dirty_expire_centisec.

Jemand eine Idee, wie man das optimieren kann?
dirty_background_ratio und dirty_ratio sind als Prozentangaben vom Ram angegeben (Siehe z.B. hier.). 10, respektive 20 % von 64 GB sind eine Menge. Wenn du willst dass früher aufgeräumt wird, kannst du die Werte deutlich niedriger ansetzen. Bei 64 GB Ram sammelt sich ja einiges zusammen. Ich würde die Werte deutlich niedriger ansetzen.
"Unix is simple. It just takes a genius to understand its simplicity." - Dennis Ritchie

Debian GNU/Linux Anwenderhandbuch | df.de Verhaltensregeln | Anleitungen zum Review und zum Verfassen von Wiki Artikeln.

Antworten