Uruchamianie Ubuntu na jądrze 2.6.31-302 x86-64. Ogólny problem polega na tym, że mam pamięć w kategorii „buforowanej”, która ciągle rośnie i nie zostanie zwolniona ani wykorzystana, nawet jeśli nasza aplikacja jej potrzebuje.
Oto, co wyciągam z polecenia „darmowego”. Na pierwszy rzut oka nic z tego nie wygląda nietypowo.
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
Pierwszą rzeczą, którą ktoś powie, jest: „Nie martw się, Linux automatycznie zarządza pamięcią”. Tak, wiem, jak powinien działać menedżer pamięci; problem polega na tym, że nie robi to dobrze. „Buforowana” 1,4 GB tutaj wydaje się być zarezerwowana i nie nadaje się do użytku.
Znajomość Linuksa mówi mi, że 3 GB jest „darmowe”; ale zachowanie systemu mówi inaczej. Gdy 1,6 GB rzeczywistej wolnej pamięci zostanie zużyte podczas szczytowego użycia, gdy tylko zajdzie potrzeba zwiększenia ilości pamięci (a „wolna” w pierwszej kolumnie zbliża się do 0), wywoływany jest zabójca OOM, procesy są zabijane i pojawiają się problemy nawet jeśli „wolny” w rzędzie buforów - / + / cache wciąż ma około 1,4 GB „wolnego”.
Dostosowałem wartości oom_adj do kluczowych procesów, aby nie rzucało systemu na kolana, ale nawet wtedy ważne procesy zostaną zabite i nigdy nie chcemy osiągnąć tego punktu. Zwłaszcza, gdy teoretycznie 1,4 GB jest nadal „darmowe”, jeśli tylko eksmituje pamięć podręczną dysku.
Czy ktoś ma pojęcie, co się tutaj dzieje? Internet jest zalany głupimi pytaniami o komendę Linuksa „wolną” i „dlaczego nie mam wolnej pamięci” i dlatego nie mogę znaleźć nic na ten temat.
Pierwszą rzeczą, która pojawia się w mojej głowie, jest to, że swap jest wyłączony. Mamy sysadmina, który jest nieugięty; Jestem otwarty na wyjaśnienia, jeśli mają kopie zapasowe. Czy to może powodować problemy?
Oto bezpłatne po uruchomieniu echo 3 > /proc/sys/vm/drop_caches
:
# free
total used free shared buffers cached
Mem: 7358492 5731688 1626804 0 524 1406000
-/+ buffers/cache: 4325164 3033328
Swap: 0 0 0
Jak widać, niewielka ilość pamięci podręcznej jest faktycznie zwolniona, ale wydaje się, że około 1,4 GB „utknęło”. Innym problemem jest to, że wartość ta wydaje się z czasem rosnąć. Na innym serwerze 2,0 GB utknęło.
Naprawdę chciałbym odzyskać to wspomnienie ... każda pomoc byłaby najbardziej doceniana.
Oto, cat /proc/meminfo
czy coś jest warte:
# cat /proc/meminfo
MemTotal: 7358492 kB
MemFree: 1472180 kB
Buffers: 5328 kB
Cached: 1435456 kB
SwapCached: 0 kB
Active: 5524644 kB
Inactive: 41380 kB
Active(anon): 5492108 kB
Inactive(anon): 0 kB
Active(file): 32536 kB
Inactive(file): 41380 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 320 kB
Writeback: 0 kB
AnonPages: 4125252 kB
Mapped: 42536 kB
Slab: 29432 kB
SReclaimable: 13872 kB
SUnreclaim: 15560 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3679244 kB
Committed_AS: 7223012 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7696 kB
VmallocChunk: 34359729675 kB
DirectMap4k: 7340032 kB
DirectMap2M: 0 kB