Linux: tüm RAM'lerin hangi sürecin kullanıldığını buluyor musunuz?


127

Aslında sormadan önce, net olmak gerekirse: evet, disk önbelleğini biliyorum ve hayır, bu benim durumum değil :) Üzgünüz, bu başlangıç ​​için :)

CentOS 5 kullanıyorum. Sistemdeki her uygulama yoğun olarak değişiyor ve sistem çok yavaş. Yaptığımda free -m, işte aldığım şey:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Yani, aslında sadece kullanmak için 42 Mb var! Anladığım kadarıyla, -/+ buffers/cacheaslında disk önbelleğini saymaz, bu yüzden gerçekten sadece 42 Mb'ım var, değil mi? Yanılıyor olabileceğimi düşündüm, bu yüzden disk önbelleğini kapatmaya çalıştım ve hiçbir etkisi olmadı - resim aynı kaldı.

Böylece tüm RAM'imi kimlerin kullandığını bulmaya karar verdim ve bunun topiçin kullandım. Ancak, görünüşe göre, hiçbir işlem RAM'imi kullanmıyor. Üstümdeki tek işlem MySQL, ancak% 0.1 RAM ve 400Mb takas kullanıyor. Diğer hizmetleri veya uygulamaları çalıştırmaya çalıştığımda aynı resim - hepsi değiş tokuş ediyor, topMEM'nin kullanılmadığını gösteriyor (herhangi bir işlem için maksimum% 0,1).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Yeniden başlatma yardımcı olmuyor ve bu arada, bu makineden normalde beklemeyeceğim çok yavaşlar (4 çekirdekli, 4 Gb RAM, RAID1).

Bu nedenle, bununla - RAM'i kullanan bir disk önbelleği olmadığından eminim, çünkü normalde azaltılmış olmalı ve diğer işlemlerin RAM'i kullanmasına izin vermeliydi, sonra değiş tokuş yapmalılar.

Sonunda, soru şu - eğer birisi hafızayı bu kadar yoğun kullanıyorsa hangi sürecin nasıl olduğunu bulmak için bir fikri varsa?


1
Bunun cevabını hiç buldunuz mu?
Hackeron

@Hackeron: OP bu cevabı kabul etti . Cevabın hitap etmediğini biliyoruz sorunuzu olsa. Sorununuzu sunucularımdan birinde yeniden üretebildim ve şu anda sorunu gidermenin bir yolu olup olmadığını araştırıyorum.
Deltik

@Deltik Ah, tamam. Teşekkür ederim :) - Burada mevcut tüm belleği yaklaşık 12 saat boşaltan 2 sunucum var, bunu teşhis etmek için yapabileceğim bir şey varsa haber verin. IRC (irc.freenode.org) 'un "hackeron" takma adı olarak erişilebilirim.
Hackeron

@Hackeron: Seni "hackeron" olarak bulamadım irc.freenode.org. Burada genişletilmiş tartışmalar için bir sohbet odası hazırladım .
Deltik

ZFS bellekteki ARC (ve / veya L2ARC) önbelleğinin gösterilmediğini belirtmek gerekir free -m, ancak bunun boyutu Linux ile sorgulanabilir cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Yanıtlar:


112

topİşlem sırasında Linux'ta <, çıkış ekranı sıralama sola kaydırmak için tuşuna basabilirsiniz. Varsayılan olarak sıralanır, %CPUböylece tuşa 4 kez basarsanız, VIRTcevabınızı veren sanal bellek boyutuna göre sıralarsınız .

Bunu yapmanın başka bir yolu:

ps -e -o pid,vsz,comm= | sort -n -k 2

süreçleri ve sanal boyutuna göre sıralanmış çıktı vermelidir.

İşte uzun versiyon:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

Bu bana Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlUbuntu sunucusunda 11.10 veriyor .
Der Hochstapler

1
@OliverSalzburg Sorun -oseçeneklerdir. RHEL4 bu işe yarıyor. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2çalışır. Bu gece saat 11: 10'u deneyeceğim ancak daha önce doğru sıralama seçeneklerini bulursanız lütfen bana bildirin. ps -e -o pid,vsz,comm | sort -n -k 2işe yarayabilir, ancak şu anda doğrulayacak bir yerim yok.
Karlson

2
Bu -efseçeneğe pek aşina değilim . Ancak bu makul bir sudo ps axo pid,vsz,comm=|sort -n -k 2
sonuç

1
Ty, <bunun mümkün olduğunu bilmiyordum en üst önerisini beğendim , fedora
SSH Bu

2
RAM kullanan ve komutun tamamını gösteren işlemleri almak için biraz değiştirilmiş versiyon :ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

İşlem belleğini megabayt ve işlem yolunda göster.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
Süper Kullanana Hoşgeldiniz. Bu kodun ne yaptığını ve soruna nasıl hitap ettiğini açıklamak için cevabınızı genişletebilir misiniz? Açıklanamayan kod önerilmemektedir , çünkü çözümü öğretmemektedir. Teşekkürler.
fixer1234

9
Bu cevabın önemsiz olduğuna ve açıklamasını isteyen bir yoruma sahip olduğuna şaşırdım .. ne yaptığını açık olması yeterince kısa (ps aux'u awk ve daha sonra sırala) ve sorunun bağlamında hangi işlemler en çok RAM kullanıyor. Bence iyi bir cevap.
John

14

Aynı belirtileri gösteren ancak hala bellek tükenmesi gösteren bir sunucuda sadece bir yan not. Sonunda ne buldu? 960 tanesi). Hiçbiri kullanılmadığından, büyük sayfaları 10 olarak ayarlamak, tüm belleği serbest bıraktı.

HugePages_ ayarlarına bakmak için / proc / meminfo öğesinin hızlı bir şekilde kontrol edilmesi, en az beklenmedik bir bellek domuzında sorun gidermeye iyi bir başlangıç ​​olabilir.


2
Son zamanlarda sorunun nerede olduğu başka bir sunucu daha vardı. Kuruluşunuzun içinde eski Oracle çalışanları varsa, bu ayar sizin suçlu olabilir.
alanlar

5

Benim durumumda sorun, sunucunun, vmw_balloonmodülü etkin olan bir VMware sanal sunucusu olmasıydı :

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Koşu:

$ vmware-toolbox-cmd stat balloon
5189 MB

Yani 5 GB civarında bir bellek aslında sunucu tarafından geri çevrildi. Bu yüzden VM'ime 8 GB'lık "resmi olarak" olmasına rağmen, uygulamada çok daha azdı:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

İşlem hakkında daha fazla bilgi almak için ps komutunu da kullanabilirsiniz.

ps aux | less

Meraktan, bu emirden kaçmanın doğru yolu nedir? Son satıra ulaştığımda okuduğunu gösterir, i Ctrl + C olduğunda işlemi öldürmez.
KingsInnerSoul,

1
@KingsInnerSoul 'q' tuşuna basın
enobayram

2

Python işlemi tarafından kullanılan bu ve Toplam bellek başvuru ? - Yığın Taşması , bu benim cevabım. Şimdi belirli bir işlem (python) sayım aracı alıyorum.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

İşlem listemi ekleyin.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Referans


1

show-memory-usage.shİçeriği ile çağrılan bir komut dosyası yapın :

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
Neden? Bu ne işe yarıyor? O nasıl çalışır? İnsanlara rastgele kod çalıştırmalarını söyleme; amacını ve nasıl çalıştığını açıklar.
CVn

2
Şekil Çalıştırmak için güvenli göründüğü gibi anlamayanların kodunu açıklayacağım, ancak aşağı yöndeki oyunda kullanışlarının önüne geçebilir. Yukarıdaki cevaplarda olduğu gibi aynı komutu kullanıyor , ancak AWK ile format ekliyor. Senaryoyu ben kullanmadım çünkü şahsen çalıştırmıyorum, fakat bazı formatlama ihtiyacı olanlara yardımcı oluyor.
Dooley_labs

1
Kodu okudum ve çalıştırdım. Tablo gibi alanları hizalar ve tüketilen yerleşik belleği öneklerle formatlar (1.12 GB, 582.79 MB gibi).
Stéphane Gourichon

0

Bu aynı zamanda işlem kimliğini alır, kullanılan MB'a göre sıralar ve komutu (işlemi oluşturan) ana hatlarıyla belirtir:

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Ubuntu sunucum DISTRIB RELEASE = 18.04 Hyper-V'de kullanılan belleğin çoğu kullanılmış, ancak tüm işlemler iyi. (Snapd ve unattended-upgr paketlerini kaldırdığımı kabul ettim, ancak belleğin% 95'i hala kullanılıyordu.)

Cevap Hyper-V'nin dinamik bir hafızası olduğu için ana sistem kullanımı için hafıza aldı ve ubuntu kullanıldığı gibi işaretlendi.

Umarım birine yardımcı olur.

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.