Linux: Kullanılan toplam takas = süreçler tarafından kullanılan takas +?


17

Bu yüzden, takas kullanımının yüksek takas kullanımı olan bir sistemde nereden geldiği konusunda biraz araştırma yapmaya çalışıyorum:

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

İşlem başına kullanılan takas ekleme:

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

Hangi toplam kullanılan takas için daha düşük bir değer verir. Kalan kullanılan takas alanı nerede? Çekirdek içindeki vmalloc () 'un hafızası var mı? Başka bir şey? Nasıl tanımlayabilirim?

Meminfo çıkışı:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

Tamponlar ve önbellek dahildir ve herhangi bir işlemle ilişkili değildir.
goldilocks

2
@ goldilocks: hayır, bunlar fiziksel bellekte. Ayrıca toplanmazlar.
ninj

Haklısın, sanırım takas edilecek şeyleri önbelleklemek anlamsız olurdu. Ancak, takas edilen şeylerin orada bırakılıp takip edilebildiğini ve takas alanına başka türlü ihtiyaç duyulmadığı sürece bile izlenebileceğini düşünüyorum; bir işlem aynı sayfayı yüklerse ve bu sayfanın yeniden değiştirilmesi gerekirse daha sonra zaman kazandırır. Google "takas önbelleği" linux-tutorial.info/modules.php?name=MContent&pageid=314 Bu, gerçek "önbellek önbelleğinin" nasıl gerçekleştiğiyle paraleldir (artık geçersiz işlemlerden sonra belleğe kaydedilen şeyler).
goldilocks

... anlamı, lol, "şeyler önbelleğe o içinde swap" o RAM önbelleği değiştirerek oraya gelmez sadece bu yüzden anlamsız değildir.
goldilocks

1
Cevap sadece çekirdeğin değişebileceği değil, bu işleminize dahil değil mi? Özellikle çekirdek günümüzde "kullanıcı alanı" süreçleri bir yığın var ... Sadece bir tahmin tho.
Iain

Yanıtlar:


11

Gözlemlediğiniz fark, aslında takas alanının hesaba katılmamasından kaynaklanmaz. Çekirdeğin bazen /proc/*/exebağlantılara eklediği "(silindi)", readlinkawk betiğinizde ayrıştırma hatalarına neden oluyor ve ikili dosyaları artık toplamınızda bulunmayan işlemleri saymıyorsunuz.

Bazı çekirdekler /proc/*/exe, işlem için orijinal yürütülebilir dosya artık etrafta olmadığında sembolik hedeflere "(silindi)" sözcüğünü ekler .

Komutunuzun toplamdan daha az göstermesinin nedeni budur. Bu readlinktür bağlantıların çıktısı, "/ path / to / bin (silinmiş)" gibi bir şey olacaktır, bu awkda çıktı dizgiye geri konduğunda ayrıştırma hatasına neden olur (parantez ve boşlukları sevmez). Örneğin, şunu yapın:

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

Ve "(silindi)" ifadesi eklenmiş birkaç giriş göreceksiniz. Bu girişler için takas kullanımına bakarsanız, awktoplamları gördüğünüz tutarsızlıkla eşleşir, çünkü ortaya çıkan hatalar toplamlarının hesaplanmasını ve nihai toplama dahil edilmesini önler.

Orijinal komutunuzu stderr'ı herhangi bir yere yönlendirmeden çalıştırırsanız, muhtemelen birkaç "kaçak dize sabiti" hatası görürsünüz. Bu hatalar yukarıdakilerin bir sonucudur ve onları görmezden gelmemelisiniz.

Orijinal komutunuzdaki diğer olası geliştirmeleri yok sayarak, aşağıdaki gibi "(silindi)" yi kaldırarak değiştirebilirsiniz ( çıktıya |awk '{print $1}'eklenen not readlink):

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

awkÇıktısını düzeltmek için bu kullanımı readlink, ad boşluk içeriyorsa bozulabilir - kullanabilirsiniz sedveya istediğiniz yöntemi kullanabilirsiniz .

Bonus Bilgisi

Bu arada, sadece kullanabilirsiniz smem -t. "Takas" sütunu ne istediğinizi gösterir.

Bununla birlikte, kendiniz hesaplamaya gelince, bu bilgileri doğrudan VmSwapalandan daha fazla alabilirsiniz /proc/*/status(smaps bazı çekirdek desteği gerektirir ve her zaman kullanılabilir değildir) ve hata çıkışını önleyen uygun bir dosya adı deseni kullanarak yeniden yönlendirmek zorunda kalmaz ile başlayan hatalar:

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

Gerçek ikili gerek yoktur ve sadece süreç adına sahip başa çıkabilirim, alabilirsiniz herşeyi dan status:

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

Ve son olarak, sadece PID'lere sahip olmak yeterliyse, aşağıdakileri yapabilirsiniz awk:

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

Not:

Şimdi bu, freeve smem(ikincisinin senaryonuzla aynı olması) arasında bir fark olmadığı anlamına gelmez . Çok fazla var (örneğin, bellek kullanımı ile ilgili sorularınızı cevaplamak için ilk sayfada fazlasıyla sonuç veren https://www.google.com/search?q=smem+free adresine bakın ). Ancak uygun bir test olmadan, özel durumunuz ele alınamaz.


5

Çekirdek, daha fazla serbest koça ihtiyaç duyuyorsa veya sadece bir süre kullanılmadığı için tmpfs tarafından da kullanılır ... böylece herhangi bir tmpfs kullanımı takas kullanabilir.


1
Neden inişli çıkışlı? Bu kesinlikle doğru.
jlliagre
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.