Linux, bellek talebi arttığında büyük disk önbelleğini serbest bırakmıyor


24

Ubuntu'yu 2.6.31-302 x86-64 çekirdeğinde çalıştırma. Genel sorun, 'önbelleğe alınmış' kategoride, devam eden ve serbest bırakılmayacak veya uygulamamızın ihtiyacı olsa bile kullanılmayacak olan belleğe sahip olmam.

İşte burada 'özgür' komuttan ne çıkarım. Bunların hiçbiri ilk bakışta sıra dışı gözükmüyor.

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

Birisinin söyleyeceği ilk şey "Endişelenme, linux bu belleği otomatik olarak yönetir." Evet, hafıza yöneticisinin nasıl çalışması gerektiğini biliyorum; Sorun şu ki doğru olanı yapmıyor. Burada "önbellek" 1.4 GB ayrılmış ve kullanılamaz görünüyor.

Linux hakkındaki bilgim 3 GB'nin "özgür" olduğunu; ancak sistemin davranışı aksini söylüyor. En yüksek kullanım sırasında 1,6 GB gerçek boş hafıza kullanıldığında, daha fazla hafıza talep edildiğinde (ve ilk sütundaki 'boş' 0 olduğunda) OOM katili çağrılır, işlemler öldürülür ve sorunlar ortaya çıkmaya başlar - / + tampon / önbellek satırındaki 'ücretsiz' hala yaklaşık 1.4 GB 'boş' olmasına rağmen .

Oom_adj değerlerini kilit süreçler üzerine ayarlıyorum, böylece sistemi dizlerine çekmiyor, ancak o zaman bile önemli işlemler öldürülecek ve o noktaya asla ulaşmak istemiyoruz. Özellikle, teorik olarak, 1.4GB hala "boş" ise, sadece disk önbelleğini tahliye ederse.

Burada neler olduğu hakkında bir fikri olan var mı? İnternet, Linux 'özgür' komutu ve "neden hiç boş hafızaya sahip değilim" hakkında aptal sorularla doludur ve bu konuda bu konuda hiçbir şey bulamıyorum.

Aklıma ilk çıkan şey takasın kapalı olması. Bu konuda kararlı olan bir sysadmin var; Desteklenirlerse açıklamalara açığım. Bu sorunlara neden olabilir mi?

İşte çalıştırdıktan sonra ücretsiz 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

Gördüğünüz gibi, bazı küçük miktarlarda önbellek gerçekten serbest bırakılıyor, ancak yaklaşık 1.4 GB civarında bir "sıkışmış" gibi görünüyor. Diğer sorun ise, bu değerin zamanla yükselmiş görünmesidir. Başka bir sunucuda 2.0 GB sıkışmış.

Bu hafızayı gerçekten geri istiyorum ... herhangi bir yardım en çok takdir edilebilirdi.

İşte cat /proc/meminfobunun bir değeri varsa:

# 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

3
Önbelleğinizle ilgili hiçbir açıklamam yok (mmap'd dosyalarının muhtemelen içine girdiğinden şüpheleniyor olmama rağmen), ama insanlığın iyiliği için bir kürek ve biraz sönmemiş kireç alıp kurtulun "takasına gerek yok Çok fazla RAM varsa! " yükseltici. Akılcı tartışmaya bağışıklar ve tehlikeli derecede yanılıyorlar. OOM katilinin seni takip ettiği gerçeği, bunun sadece bir belirtisi.
womble

Benim düşüncelerim tam. Tavsiye için teşekkürler. Takas işleminin neden gerekli olduğu hakkında başka iyi makaleler veya tartışmalar biliyor musunuz?
trisweb

6
Çünkü eğer takasınız yoksa, böyle şeyler olur. Ama takas denier ile tartışmaya çalışarak zahmet etme; ya "Burada üzerinde takas istemiyorsanız, sönmemiş patlak ya demek sen oluştururken ısrar ettik bu karmaşayı düzeltmek". Sonunda fikrini kendileri değiştirecekler ya da çalışırken ölecekler. Problem her iki şekilde de çözüldü.
womble

Mükemmel, ipuçları için teşekkürler. Bu arada mmap dosyaları konusunda haklıydınız - hızlı bir şekilde hafızayı alan kayıt dosyalarının gösterileri vardı. Onları temizlemek sorunu çözdü.
trisweb

Buradaki sorun, takas olmadan, OOM katilinin çalışmakta olan sonuçları aşmak ve süreçleri başlatamayan bir sistemde sonuçları aşmamaktır. RAM'i etkin bir şekilde kullanabilmek için takas gerekir.
David Schwartz

Yanıtlar:


8

Kendi sorumun cevabını keşfettim - womble'ın yardımı sayesinde (isterseniz bir cevap gönderin).

lsof -s kullanımdaki dosya tanıtıcılarını gösterir ve önbellekte yer alan birkaç gigabayt mmap'd günlük dosyası olduğu ortaya çıkar.

Bir logrotate uygulamak, sorunu tamamen çözmeli ve daha fazla bellekten yararlanmamı sağlamalı.

Ayrıca takas işlemini tekrar etkinleştireceğim, böylece gelecekte OOM katiliyle bir sorunumuz olmayacak. Teşekkürler.


2
mmap'd sayfalar göz ardı edilebilir, bu nedenle önbellek tutturulmamalı. Ramfs kullanıyor musunuz?
psusi

Merhaba, eski bir iş parçacığını kazdığım için üzgünüm, ancak şu anda aynı sorunla karşı karşıyayım ve lsof -solağandışı bir kullanım göstermiyor. Ancak, dediğiniz gibi bir ramfs kullanıyorum [ve drop_caches özelliğine sahip olmayan 2.6.10 çekirdeği]. Muhtemel şüphelinin ne olduğunu düşünüyorsun?
Ram

1
Bahşiş için teşekkürler! lsof -s | sort -rnk 7 | lessŞimdi aletime ekliyorum . Diğer okuyucular için bir not: Bu gibi büyük girişler olabilir /proc/net/rpc/nfs4.nametoid/channel, ancak benim durumumda suçlu olduğu ortaya çıkmadı.
Nickolay,

büyük dosyalarınızın veya programlarınızın mlock kullanmadığından emin olun. içinde /proc/meminfo"Unevictable" sayfalarına bakmak.
Michael Martinez

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.