在Linux中,如何判断正在使用多少内存进程?

Sta*_*bie 63 unix linux memory-leaks memory-management

我想我的LAMP应用程序可能有内存泄漏(内存耗尽,交换开始被使用等).如果我能看到各种进程使用了​​多少内存,它可能有助于我解决我的问题.有没有办法让我在*nix中看到这些信息?

Giu*_*one 93

获得正确的内存使用比人们想象的要复杂.我能找到的最好方法:

echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
Run Code Online (Sandbox Code Playgroud)

其中"PROCESS"是您要检查的进程的名称,"TYPE"是以下之一:

  • Rss:驻留内存使用情况,进程使用的所有内存,包括此进程与其他进程共享的所有内存.它不包括交换;
  • Shared:此进程与其他进程共享的内存;
  • Private:这个进程使用的私有内存,你可以在这里查找内存泄漏;
  • Swap:交换进程使用的内存;
  • Pss:比例集大小,一个很好的整体内存指标.调整共享的Rss:如果一个进程有1MiB私有和20MiB在其他10个进程之间共享,则Pss为1 + 20/10 = 3MiB

其他有效值是Size(即虚拟大小,几乎没有意义)和Referenced(当前标记为引用或访问的内存量).

您可以使用watch或其他一些bash-script-fu来关注要监视的进程的值.

有关以下内容的更多信息smaps:http://www.kernel.org/doc/Documentation/filesystems/proc.txt.

  • 年龄较晚,可能不再相关,但是:实际内存分配总是物理页面大小的倍数,在现代系统上总是1024字节的小倍数.因此,只需将KB的大小乘以1024即可.没有舍入错误.(内核大多没有发现iB疾病:除非有明确的相反证据,否则假设K = 1024而不是1000.) (5认同)
  • 为什么不将其全部传递给`awk`而不是传递给`bc`?`awk'BEGIN {used = 0}; / TYPE / {已使用+ = $ 2} END {打印已使用}'/ proc / PID / smaps`将以KB为单位。 (2认同)

Gre*_*pak 47

我不知道为什么答案看起来那么复杂......这样做看起来很简单ps:

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
Run Code Online (Sandbox Code Playgroud)

  • 一个函数的使用很棒。将此添加到我的`.zshrc` (2认同)

Zaz*_*Zaz 35

使用ps找到应用程序的进程ID,然后使用top -p1010(替代1010为真正的进程ID).RES列是使用的物理内存,VIRT列是使用的虚拟内存 - 包括库和交换内存.

更多信息可以使用"man top"找到

  • 关于"VIRT":对于几乎所有实际用途,虚拟映像的大小都没有告诉你 - 几乎每个linux系统都配置为允许内存过量使用,而且很多应用程序实际上都会过度使用. (3认同)

Pet*_*ter 16

首先得到pid:

ps ax | grep [process name]
Run Code Online (Sandbox Code Playgroud)

然后:

top -p PID
Run Code Online (Sandbox Code Playgroud)

您可以在同一时间观看各种流程:

top -p PID1 -p PID2 
Run Code Online (Sandbox Code Playgroud)


Sun*_*lly 13

您可以使用pmap报告内存使用情况.

概要:

pmap [ -x | -d ] [ -q ] pids... 
Run Code Online (Sandbox Code Playgroud)

  • 好的,这是一个示例用法:`pmap $(pgrep -f -u username/usr/bin/gnome-shell)| sed -n -e's/total\+ // p'| numfmt --from = iec` 1724678144 (2认同)

小智 7

更优雅的方法:

echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done
Run Code Online (Sandbox Code Playgroud)


Gun*_*iez 6

使用tophtop并注意“RES”(常驻内存大小)列。


小智 6

谢谢.我用它来创建这个简单的bash脚本,可用于监视进程及其内存使用情况:

$ watch watchmypid.sh

#!/bin/bash
#

PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`

echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps  | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps  | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps  | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`

Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`

echo "Rss     " $Rss
echo "Shared  " $Shared
echo "Private " $Private
echo "Swap    " $Swap
echo "Pss     " $Pss
echo "=================";
echo "Mem     " $Mem
echo "=================";
Run Code Online (Sandbox Code Playgroud)


Bel*_*ell 6

如果您没有要跟踪的当前或长时间运行的进程,则可以使用/usr/bin/time.

这与 Bash 不同time(如您所见)。

例如

# /usr/bin/time -f "%M" echo

2028
Run Code Online (Sandbox Code Playgroud)

这是“进程在其生命周期内的最大驻留集大小,以千字节为单位”(引自手册页)。也就是说,与等人中的RES相同top

您可以从中获得更多/usr/bin/time

# /usr/bin/time -v echo

Command being timed: "echo"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Run Code Online (Sandbox Code Playgroud)

  • macos /usr/bin/time 无法进行这种级别的分析,但是 homebrew 确实通过 `gnu-time` 包提供了正确的实用程序。它安装了一个名为“gtime”的实用程序,它可以执行您所说的操作。 (2认同)

Bri*_* C. 5

你想要的工具是ps。要获取有关 java 程序正在执行的操作的信息:

ps -F -C java 
Run Code Online (Sandbox Code Playgroud)

获取有关http的信息:

ps -F -C httpd
Run Code Online (Sandbox Code Playgroud)

如果您的程序在您有机会运行这些程序之前就结束了,请打开另一个终端并运行:

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
Run Code Online (Sandbox Code Playgroud)