題 Linux:找出使用所有RAM的進程?


在實際詢問之前,只需要明確:是的,我知道磁盤緩存,不,這不是我的情況:)抱歉,對於這個序言:)

我正在使用CentOS 5.系統中的每個應用程序都在大量交換,系統速度很慢。當我做 free -m這是我得到的:

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

所以,我實際上只有42 Mb使用!據我所理解, -/+ buffers/cache 實際上不計算磁盤緩存,所以我確實只有42 Mb,對吧?我想,我可能是錯的,所以我試圖關閉磁盤緩存,它沒有效果 - 圖片保持不變。

所以,我決定找出誰在使用我的所有內存,我用過 top 為了那個原因。但是,顯然,它報告沒有進程正在使用我的RAM。我的頂級唯一進程是MySQL,但它使用0.1%的RAM和400Mb的交換。當我嘗試運行其他服務或應用程序時,相同的圖片 - 全部進入交換, top 表明不使用MEM(任何過程最大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

重啟沒有幫助,並且,他們的方式是 非常 慢,我通常不會期望在這台機器上(4核,4Gb RAM,RAID1)。

所以,有了這個 - 我很確定這不是磁盤緩存,誰正在使用RAM,因為通常應該減少並讓其他進程使用RAM,而不是轉換。

所以,最後,問題是 - 如果有人有任何想法如何找出實際使用內存的過程如此重要?


105
2018-03-09 14:13


起源


你有沒有找到答案? - Hackeron
@Hackeron:OP接受了 這個答案。我知道答案沒有解決 你的問題但是。我能夠在我的一台服務器上重現您的問題,我正在研究是否有辦法對其進行故障排除。 - Deltik
@Deltik啊,好的。謝謝:) - 我在這裡有2台服務器在大約12小時的空間內洩漏所有可用內存,請告訴我是否有任何我可以做的來幫助診斷這個。我可以在IRC上找到暱稱“hackeron”(irc.freenode.org)。 - Hackeron
@Hackeron:我無法找到你作為“hackeron” irc.freenode.org。我創造了一個 聊天室在這裡進行了擴展討論。 - Deltik


答案:


在Linux上 top 你可以按的過程 < 鍵將輸出顯示排序左移。默認情況下,它按以下順序排序 %CPU 因此,如果您按鍵4次,您將按其排序 VIRT 這是虛擬內存大小,為您提供答案。

另一種方法是:

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

應該給你和輸出按進程虛擬大小排序。

這是長版本:

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

93
2018-03-09 14:25



這給了我 Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html 在Ubuntu服務器11.10上。 - Der Hochstapler
@OliverSalzburg問題是 -o 選項。 RHEL4這個有效。 RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2 作品。我今晚稍後會嘗試11.10,但如果您之前找到合適的排序選項,請告訴我。 ps -e -o pid,vsz,comm | sort -n -k 2 可能有用,但我現在沒有地方可以驗證。 - Karlson
我真的不熟悉 -ef 選項。但這似乎產生了合理的輸出: sudo ps axo pid,vsz,comm=|sort -n -k 2 - Der Hochstapler
@OliverSalzburg對不起。修改過(以為我已經改變了)。它應該是 ps -e 要么 ps -a - Karlson
Ty,我喜歡最重要的建議 < 我不知道那是可能的,Fedora - SSH This


以兆字節和進程路徑顯示進程內存。

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

48
2018-02-09 21:12



歡迎來到超級用戶。您能否擴展您的答案來解釋此代碼的作用以及它如何解決問題?原因不明的代碼是 洩氣,因為它沒有教導解決方案。謝謝。 - fixer1234
我很驚訝這個答案是downvoted並有一個評論要求解釋它...它足夠短,它應該清楚它做什麼(管道PS輔助到awk然後排序),並在問題的上下文中,它顯示哪些進程使用最多的RAM。我認為這是一個很好的答案。 - John


只是服務器上的旁注,顯示相同的症狀,但仍顯示內存耗盡。最後發現的是一個帶有32 GB RAM的盒子中的sysctl.conf,並設置了一個配置為12000的大頁面的數據庫。這個盒子只有2 GB的RAM,因此它將所有空閒RAM分配給大頁面(僅限其中960個)。將大頁面設置為10,無論如何都沒有使用,釋放了所有內存。

快速檢查/ proc / meminfo以查找HugePages_設置可以是排除至少一個意外內存耗盡的良好開端。


13
2017-10-15 15:05



我最近有另一台服務器,這是問題所在。如果您的組織中有前Oracle員工,則此設置可能是您的罪魁禍首。 - fields


您還可以使用ps命令獲取有關進程的更多信息。

ps aux | less

2
2017-07-08 06:05



出於好奇,逃避這個命令的正確方法是什麼?它顯示END ocne到達最後一行,當我按Ctrl + C時它不會終止進程。 - KingsInnerSoul
@KingsInnerSoul按'q' - enobayram


我參考 這個 和 Python進程使用的總內存? - 堆棧溢出那是我的答案。我現在得到一個特定的進程(python)計數工具。

# 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

附上我的流程清單。

$ 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

參考


1
2017-10-21 10:51





在我的情況下,問題是服務器是VMware虛擬服務器 vmw_balloon模塊啟用:

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

運行:

$ vmware-toolbox-cmd stat balloon
5189 MB

因此,主機實際上回收了大約5 GB的內存。因此,儘管我的VM“正式”有8 GB,但在實踐中卻少得多:

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

1
2018-03-31 03:38





製作一個叫做的腳本 show-memory-usage.sh 內容:

#!/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") }
 '

-1
2018-03-14 20:50



為什麼?這是做什麼的?它是如何工作的?不要告訴人們運行隨機代碼;解釋它的目的和工作原理。 - α CVn
圖I將解釋那些不理解的代碼,因為它似乎可以安全運行,但是downvote可以避開那些對它有用的代碼。它正在運行與之相同的命令 以上答案,但它正在使用AWK添加格式。我沒有親自運行腳本,因為我沒有用它,但解釋它有助於那些需要一些格式化的人。 - Dooley_labs