在Linux中,如何知道进程使用了多少内存?
- 2024-11-07 08:55:00
- admin 原创
- 29
问题描述:
我认为我的 LAMP 应用程序可能存在内存泄漏(内存用尽、交换开始被使用等)。如果我能看到各个进程使用了多少内存,这可能会帮助我解决问题。有没有办法在 *nix 中查看此信息?
解决方案 1:
获得正确的内存使用比人们想象的要困难得多。我能找到的最好的方法是:
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
其中“PROCESS”是您要检查的进程的名称,“TYPE”是以下之一:
Rss
:常驻内存使用量,即进程使用的所有内存,包括该进程与其他进程共享的所有内存。不包括交换空间;Shared
:本进程与其他进程共享的内存;Private
:该进程使用的私有内存,您可以在这里查找内存泄漏;Swap
:进程使用的交换内存;Pss
:比例集大小,一个很好的整体内存指标。它是针对共享进行调整的 Rss:如果一个进程有 1MiB 的私有内存,而其他 10 个进程之间共享了 20MiB,则 Pss 为 1 + 20/10 = 3MiB
其他有效值是Size
(即虚拟大小,几乎没有意义)和Referenced
(当前标记为引用或访问的内存量)。
您可以使用watch
或其他一些 bash-script-fu 来关注您想要监控的进程的那些值。
更多信息请参见smaps
: http: //www.kernel.org/doc/Documentation/filesystems/proc.txt。
解决方案 2:
我不知道为什么答案看起来如此复杂...这样做似乎很简单ps
:
mem()
{
ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}
使用示例:
$ 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
解决方案 3:
使用ps
查找应用程序的进程 ID,然后使用top -p1010
(将 1010 替换为真实进程 ID)。RES 列是已使用的物理内存,VIRT 列是已使用的虚拟内存 - 包括库和交换内存。
可以使用“man top”找到更多信息
解决方案 4:
首先获取pid:
ps ax | grep [process name]
进而:
top -p PID
您可以同时观看多个过程:
top -p PID1 -p PID2
解决方案 5:
您可以使用pmap来报告内存使用情况。
概要:
pmap [ -x | -d ] [ -q ] pids...
解决方案 6:
如果您没有当前或长期运行的进程需要跟踪,则可以使用/usr/bin/time
。
这与 Bash 不同time
(正如您将看到的)。
例如
# /usr/bin/time -f "%M" echo
2028
top
这是“进程生命周期内的最大驻留集大小,以千字节为单位”(引自手册页)。也就是说,与et al.中的 RES 相同。
您还可以从 获得更多/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
解决方案 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
解决方案 8:
使用top
或htop
并注意“RES”(驻留内存大小)列。
解决方案 9:
谢谢。我用它创建了这个简单的 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 "=================";
解决方案 10:
您需要的工具是 ps。要获取有关 Java 程序正在执行的操作的信息:
ps -F -C java
获取有关 http 的信息:
ps -F -C httpd
如果您的程序在您有机会运行这些之前结束,请打开另一个终端并运行:
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
解决方案 11:
您可以使用pmap
+ awk
。
最有可能的是,我们感兴趣的RSS
是下面示例输出最后一行第 3 列的内存pmap
(82564)。
$ pmap -x <pid>
Address Kbytes RSS Dirty Mode Mapping
....
00007f9caf3e7000 4 4 4 r---- ld-2.17.so
00007f9caf3e8000 8 8 8 rw--- ld-2.17.so
00007fffe8931000 132 12 12 rw--- [ stack ]
00007fffe89fe000 8 8 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 688584 82564 9592
然后使用 Awk 提取该值。
$ pmap -x <pid> | awk '/total/ { print $4 "K" }'
这些pmap
值的单位是千字节。如果我们想以兆字节为单位,我们可以这样做。
$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
解决方案 12:
为什么要用各种 shell 脚本来回答这些复杂的问题?使用 htop,它会自动更改大小,您可以选择要显示的信息,并且它在终端中运行,因此不需要桌面。示例:htop -d8
解决方案 13:
使用
ps u
pidof $TASKS_LIST
或ps u -C $TASKps xu --sort %mem
ps h-o pmem-C $TASK
例子:
ps-of()
{
ps u `pidof "$@"`
}
$ ps-of firefox
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
const 18464 5.9 9.4 1190224 372496 ? Sl 11:28 0:33 /usr/lib/firefox/firefox
$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;$q;N;6,$D;ba'"
$ ps-mem
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
const 3656 0.0 0.4 565728 18648 ? Sl Nov21 0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const 11361 0.3 0.5 1054156 20372 ? Sl Nov25 43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const 3402 0.0 0.5 1415848 23328 ? Sl Nov21 1:16 nautilus -n
const 3577 2.3 2.0 1534020 79844 ? Sl Nov21 410:02 konsole
const 18464 6.6 12.7 1317832 501580 ? Sl 11:28 1:34 /usr/lib/firefox/firefox
$ ps h -o pmem -C firefox
12.7
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件