Menjalankan Ubuntu pada kernel 2.6.31-302 x86-64. Masalah keseluruhan adalah bahwa saya memiliki memori dalam kategori 'cache' yang terus naik dan tidak akan dibebaskan atau digunakan bahkan ketika aplikasi kita membutuhkannya.
Jadi inilah yang saya dapatkan dari perintah 'gratis'. Sekilas tidak ada yang terlihat seperti biasa.
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
Hal pertama yang akan dikatakan seseorang adalah "Jangan khawatir, linux mengelola memori itu secara otomatis." Ya, saya tahu bagaimana seharusnya manajer memori bekerja; masalahnya adalah itu tidak melakukan hal yang benar. The "cache" 1,4 GB di sini tampaknya sudah dipesan dan tidak dapat digunakan.
Pengetahuan saya tentang Linux memberi tahu saya bahwa 3 GB "gratis"; tetapi perilaku sistem mengatakan sebaliknya. Ketika 1,6 GB memori bebas nyata digunakan selama penggunaan puncak, segera setelah lebih banyak memori yang diminta (dan 'bebas' di kolom pertama mendekati 0) pembunuh OOM dipanggil, proses dibunuh, dan masalah mulai muncul meskipun 'gratis' di baris - / + buffer / cache masih memiliki sekitar 1,4 GB 'gratis'.
Saya telah menyetel nilai oom_adj pada proses utama sehingga tidak membuat sistem bertekuk lutut, tetapi meskipun begitu proses penting akan terbunuh, dan kami tidak pernah ingin mencapai titik itu. Terutama ketika, secara teoritis, 1.4GB masih "gratis" jika hanya akan mengusir cache disk.
Adakah yang tahu apa yang terjadi di sini? Internet dibanjiri dengan pertanyaan bodoh tentang perintah 'bebas' Linux dan "mengapa saya tidak memiliki memori bebas" dan saya tidak dapat menemukan apa-apa tentang masalah ini karena itu.
Hal pertama yang muncul di kepala saya adalah bahwa swap tidak aktif. Kami memiliki sysadmin yang bersikeras tentang hal itu; Saya terbuka untuk penjelasan jika didukung. Mungkinkah ini menyebabkan masalah?
Ini gratis setelah berjalan 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
Seperti yang Anda lihat, beberapa jumlah cache yang sangat kecil sebenarnya dibebaskan, tetapi sekitar 1,4 GB tampaknya "macet." Masalah lainnya adalah bahwa nilai ini tampaknya meningkat seiring waktu. Di server lain 2,0 GB macet.
Saya benar-benar ingin memori ini kembali ... bantuan apa pun akan sangat dihargai.
Inilah cat /proc/meminfo
jika itu layak apa pun:
# 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
sumber
Jawaban:
Saya telah menemukan jawaban untuk pertanyaan saya sendiri - terima kasih atas bantuan womble (kirimkan jawaban jika Anda mau).
lsof -s
menunjukkan pegangan file yang digunakan, dan ternyata ada beberapa gigabyte file log mmap'd mengambil cache.Menerapkan logrotate harus menyelesaikan masalah sepenuhnya dan memungkinkan saya untuk memanfaatkan lebih banyak memori.
Saya juga akan mengaktifkan kembali swap sehingga kami tidak memiliki masalah dengan pembunuh OOM di masa depan. Terima kasih.
sumber
lsof -s
tidak menunjukkan penggunaan yang tidak biasa. Namun, saya menggunakan ramf seperti yang Anda katakan [dan kernel 2.6.10, yang tidak memiliki fitur drop_caches]. Menurut Anda apa yang diduga sebagai tersangka?lsof -s | sort -rnk 7 | less
ke kotak alat saya sekarang. Catatan untuk pembaca lain: ini mungkin suka entri besar/proc/net/rpc/nfs4.nametoid/channel
, tetapi ternyata bukan pelakunya dalam kasus saya./proc/meminfo
lihat halaman "Tidak bisa diganggu gugat".Rupanya, postgres '
shared_buffers
dapat munculcached
, sementara tidak benar-benar mudah dibuang ... Lihat OOM meskipun tersedia memori (cache)sumber