Linux'ta “eksik” bellek kullanımını izleme


10

Bir Arch 3.6.7 x86_64 çekirdeğinde, sistemin bellek kullanımını hesaba katmaya çalışıyorum, ki ona ne kadar çok bakarsam, o kadar çok bir delik var gibi görünüyor (kullanılan belleğin muhasebesinde, deliksiz kullanımı).

Bu yeni açılmış bir sistem. Basit tutmak için systemd ve sshd dışında çok fazla çalışma yok

$ ps aux | sort -n -k6
...
root       316  0.0  0.0   7884   812 tty1     Ss+  14:37   0:00 /sbin/agetty --noclear tty1 38400
matt       682  0.0  0.0  24528   820 pts/0    S+   15:09   0:00 sort -n -k6
dbus       309  0.0  0.0  17280  1284 ?        Ss   14:37   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
matt       681  0.0  0.0  10808  1364 pts/0    R+   15:09   0:00 ps aux
root       308  0.0  0.0  26060  1516 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-logind
root       148  0.0  0.0  25972  1692 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-udevd
matt       451  0.0  0.0  78180  2008 ?        S    14:37   0:00 sshd: matt@pts/0
root       288  0.0  0.0  39612  2708 ?        Ss   14:37   0:00 /usr/sbin/sshd -D
matt       452  0.0  0.0  16452  3248 pts/0    Ss   14:37   0:00 -bash
root         1  0.0  0.0  32572  3268 ?        Ss   14:37   0:00 /sbin/init
root       299  0.0  0.0  69352  3604 ?        Ss   14:37   0:00 /usr/sbin/syslog-ng -F
root       449  0.0  0.0  78040  3800 ?        Ss   14:37   0:00 sshd: matt [priv]
root       161  0.0  0.0 358384  9656 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-journald

Bulabileceğim en detaylı hafıza bilgisi olan bu bir süreç için muhasebe genel çekirdeğe PSS alanının yanı sıra yol açmış gibi görünmektedir 2007 ama onların piton kodu maalesef / proc / k * bazı dosyaların eski çekirdekler içindir ve o zamandan beri kayboldu. / Proc / meminfo belgeler de yararlı ama çok biraz yaşlanma olduğunu.

Gördüğüm şeyin bir örneği.

# cat /proc/meminfo
MemTotal:       16345780 kB
MemFree:        16129940 kB
Buffers:           10360 kB
Cached:            48444 kB
SwapCached:            0 kB
Active:            24108 kB
Inactive:          46724 kB
Active(anon):      12104 kB
Inactive(anon):     3616 kB
Active(file):      12004 kB
Inactive(file):    43108 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         11996 kB
Mapped:            16372 kB
Shmem:              3696 kB
Slab:              25092 kB
SReclaimable:      11716 kB
SUnreclaim:        13376 kB
KernelStack:         928 kB
PageTables:         2428 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172888 kB
Committed_AS:      34304 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      372788 kB
VmallocChunk:   34359362043 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

Kullanılmışları toplarsak:

MemTotal - MemFree - Buffers - Cached = Used
16345780 - 16129940 - 10360 - 48444 = 157036

Tüm Etkin * / Etkin Değil *, bazı sayfalara (tümü değil) uygulanan sayaçlar gibi görünüyor, bu nedenle başka yerlerde sayılanları çoğaltabilir.

Active + Inactive = Used
46724  + 24108    = 70832 (not quite)

Buradaki Commited_AS, paylaşılan dosyaları / proc / * / smaps'tan indiren kullanıcı alanı özel / paylaşılan bellek toplamını yakından takip ediyor gibi görünüyor. PSS de hesaba katılır. (32bit debian 2.6.32-5-686'da çok, çok daha büyük Commited_AS elde ediyorum)

AnonPages + Mapped + Commited_AS = Userspace?
11996     + 16372  + 34304       = 62672

Döşeme / proc / slabinfo ile satıriçi

Slab +  Shmem + KernelStack + PageTables = Kernelspace?
25092 + 3696  + 928         + 2428       = 32144

Userspace? + Kernelspace? = Used?
62672      + 32144        = 94816

Yani ~ 63M kısa. Çekirdeğin ve yüklenen tüm modüllerin bazı MB'lardan yoksun olması beni şaşırtıyor. Döşeme olsa çok örtmek gibi görünüyor, bu yüzden herhangi bir eksik varsa ~ 60Mb eşit olup olmadığını emin değilim?

63, Aktif + Aktif Değil şekline biraz yakın, ancak bu doğru gelmiyor.

Herkes sihirli formülü biliyor mu ?? Aksi takdirde, baktığım şeklin doğru olanları varsa, bellek tahsisindeki sözünü ettiğim gri alanlar nelerdir?

Görünüşe göre linux koçumu yedi! Normalde suçlananlardan daha küçük bir kısım da olsa =)

Diğer anlamları: düzenlemek Commited_AS çekirdek ne taahhüt ne% 99.9 kaplamak için gereken bellek, yani gerçek bir tahsis sayı değil bir tahmin olduğunu. AnonPages + Mapped bunun bir bileşenidir, böylece yaklaşık 100 MB'lık daha büyük bir delik bırakır.

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPages ve Mapped çoğunlukla / proc / [0-9] * / smaps wgen / PSS / Shared'i dikkate alarak anon / mapped info ile takip eder.

Ayrılmış alanların toplam belleğe alınan yığınlara sığdığı görülüyor:

Toplam freebellek 16345032Kb'dir
Toplam sistem belleği 16777216Kb
PCI 'deliği' - lspci -v 266520K = 16510696K
Bios Ayrılmış - dmesg 92793K = 16417903K

edit2 Bu fazladan bellek kullanımının orijinal kutusunun içinde yer alan VM'lerde olmadığını fark ettim /proc/meminfo. Bu yüzden ikisi arasında neyin farklı olduğunu görmeye başladım. Sonunda, kullanılabilir toplam fiziksel hafızadaki bir artışın, kullanılan hafızadaki artışla örtüştüğü bulunmuştur.

phys 16GB used>144508     vm>50692      user>21500      kern>26428      u+ktot>47928
vm   64MB used>24612      vm>31140      user>14956      kern>14440      u+ktot>29396
vm  256MB used>26316      vm>35260      user>14752      kern>14780      u+ktot>29532
vm    1GB used>33644      vm>35224      user>14936      kern>14772      u+ktot>29708
vm    2GB used>41592      vm>35048      user>14736      kern>15056      u+ktot>29792
vm    4GB used>57820      vm>35232      user>14780      kern>14952      u+ktot>29732
vm    8GB used>82932      vm>36912      user>15700      kern>15388      u+ktot>31088
vm   12GB used>110072     vm>35248      user>14812      kern>15624      u+ktot>30436
vm   15GB used>122012     vm>35424      user>14832      kern>15824      u+ktot>30656

Bu, her 1GB bellek için ~ 8Mb olarak ayrılmıştır. Çekirdekte bir bellek haritası olabilir ... ama bunun önyükleme sırasında kurulmak yerine sadece bellek tahsis edildiğinde büyüyeceğini düşündüm.

Trend devam ederse, herhangi bir bigmem makinesine erişimi olup olmadığını görmek ilginç olur mu?


pstasarım ile yatıyor. Bellek muhasebesi için kullanmayın.
Bahama

2
şerefe, ama bu saygısızlık değil ps. Genel kullanım alanı /proc/meminfo. Tek işlem muhasebesi, paylaşılan ve özel belleği hesaba katan smaps'lerden geçiyordu, ancak bu sadece meminfo'dan AnonPages / Mapped değerleriyle karşılaştırmaktı.
Matt


dolayısıyla linux hakkındaki yazımdaki referans aslında benim koçumu yiyor =)
Matt

Yanıtlar:


3

"Bir işlem tarafından kullanılan bellek" değilModern işletim sistemlerinde net bir konsept. Ölçülebilen, işlemin adres alanının boyutu (SIZE) ve yerleşik ayar boyutu (RSS, adres alanındaki sayfaların kaçının bellekte olduğu). RSS'in bir kısmı paylaşılır (bellekteki çoğu işlem glibc'in bir kopyasını paylaşır ve böylece diğer paylaşılan kütüphaneler için aynı yürütülebilir dosyayı çalıştıran birkaç işlem, çatallı paylaşım salt okunur verilerini işler ve muhtemelen henüz değiştirilmemiş bir yığın ebeveyn ile okuma-yazma verileri). Öte yandan, çekirdek tarafından işlem için kullanılan bellek, sayfa tabloları, çekirdek arabellekleri ve çekirdek yığını gibi hesaba katılmaz. Genel resimde, grafik kartı için ayrılmış belleği, çekirdeğin kullanımını ve DOS ve diğer tarih öncesi sistemler için ayrılmış çeşitli "delikleri" (bu çok fazla değil,

Genel bir resim elde etmenin tek yolu, çekirdeğin bu şekilde bildirdiği şeydir. Bilinmeyen çakışmalar ve bilinmeyen sol çıkışlarla sayılar eklemek, aritmetikte güzel bir alıştırmadır, başka bir şey değildir.


1
'işlem başına bellek' net bir kesim değildir ancak bunun neden genel kullanımın izlenmesini etkilediğini göremiyorum? Çekirdek için, genel PageTables, Slab, KernelStack ve diğer işlem dışı mem sayaçları / proc / meminfo'da raporlanır ve hesaplamaya çalıştığım şeye dahil edilir (işlem meminin de orada olduğu görülmektedir). İşlem belleğinin in / proc / meminfo için nerede hesaplanabileceği hakkında bir fikir edinmek için anon / haritalı, paylaşılan / özel bellek için işlem smap'larına baktığım toplam sayaçlara ek olarak. Hangi VM numaralarının fiziksel olarak toplandığını hedefliyorum, ki bu açıkça bir delik var.
Matt

1
Temel psolarak belleği doğru şekilde hesaplamaktan acizdir. Yani kullanma. Hangi psraporlar sadece bu süreç sistemde çalışan tek işlem olsaydı (imkansızlık) doğru olurdu. Bunu neden psokumadığınız hakkında daha fazla bilgi için : Linux'ta Bellek Kullanımını Anlama
bahamat
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.