linux查看某个进程内存占用情况以及/proc/pid/status解释

时间:2023-03-08 15:50:57

以nginx 为例
1.top
top -b -n 1 |grep nginx|awk '{print "VIRT:"$5,"RES:"$6,"cpu:"$9"%","mem:"$10"%"}'

或者简单的top -p 进程id.

2. ps aux | grep nginx
VSZ -- 虚拟地址空间大小  --> 与top 的 VIRT 对应
RSS -- 实际物理内存大小  --> 与top 的 RES 对应

aux a-所有用户, x-运行, 结合才能列出所有pid 信息,u-user 信息,例如cpu,mem, tty, stat, 等信息,BSD 格式

ef 选项: 使用标准格式显示每一个进程。 有一个PPID, 与aux BSD格式显示方式不同。

3.cat /proc/pid/status
pid 是你关心的nginx 进程pid.
其中的
VmRss   --> Rss
VmSize  --> VSZ

三种方法可以互相对照, 结果是一样的。

/proc/pid/status解释

/proc/9744$ cat status

Name: gedit /*进程的程序名*/
State: S (sleeping) /*进程的状态信息,具体参见http://blog.chinaunix.net/u2/73528/showart_1106510.html*/
Tgid: 9744 /*线程组号*/
Pid: 9744 /*进程pid*/
PPid: 7672 /*父进程的pid*/
TracerPid: 0 /*跟踪进程的pid*/
Uid: 1000    1000    1000    1000 /*uid euid suid fsuid*/
Gid: 1000    1000    1000    1000 /*gid egid sgid fsgid*/
FDSize: 256 /*文件描述符的最大个数,file->fds*/
Groups: 0 4 20 24 25 29 30 44 46 107 109 115 124 1000 /*启动该进程的用户所属的组的id*/
VmPeak: 60184 kB /*进程地址空间的大小*/
VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/
VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/
VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/
VmData: 12240 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/
VmStk: 84 kB /*进程在用户态的栈的大小*/
VmExe: 576 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */
VmLib: 21072 kB /*被映像到任务的虚拟内存空间的库的大小*/
VmPTE: 56 kB /*该进程的所有页表的大小*/
Threads: 1 /*共享使用该信号描述符的任务的个数*/
SigQ: 0/8183 /*待处理信号的个数/目前最大可以处理的信号的个数*/
SigPnd: 0000000000000000 /*屏蔽位,存储了该线程的待处理信号*/
ShdPnd: 0000000000000000 /*屏蔽位,存储了该线程组的待处理信号*/
SigBlk: 0000000000000000 /*存放被阻塞的信号*/
SigIgn: 0000000000001000 /*存放被忽略的信号*/
SigCgt: 0000000180000000 /*存放被俘获到的信号*/
CapInh: 0000000000000000 /*能被当前进程执行的程序的继承的能力*/
CapPrm: 0000000000000000 /*进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的*/
CapEff: 0000000000000000 /*是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性*/
Cpus_allowed: 01 /*可以执行该进程的CPU掩码集*/
Mems_allowed: 1 /**/
voluntary_ctxt_switches: 1241 /*进程主动切换的次数*/
nonvoluntary_ctxt_switches: 717 /*进程被动切换的次数*/
FDSize: 32
解释:
FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.
我们看到这里是32,但实际并没有分配32个文件,如下:
ls -l /proc/`pgrep rsyslogd|grep -v grep`/fd   
total 0
lrwx------ 1 root root 64 2011-04-20 20:03 0 -> socket:[5741]
l-wx------ 1 root root 64 2011-04-20 20:03 1 -> /var/log/auth.log
l-wx------ 1 root root 64 2011-04-20 20:03 10 -> /var/log/mail.err
l-wx------ 1 root root 64 2011-04-20 20:03 11 -> /var/log/news/news.crit
l-wx------ 1 root root 64 2011-04-20 20:03 12 -> /var/log/news/news.err
l-wx------ 1 root root 64 2011-04-20 20:03 13 -> /var/log/news/news.notice
l-wx------ 1 root root 64 2011-04-20 20:03 14 -> /var/log/debug
l-wx------ 1 root root 64 2011-04-20 20:03 15 -> /var/log/messages
lrwx------ 1 root root 64 2011-04-20 20:03 16 -> /dev/xconsole
lr-x------ 1 root root 64 2011-04-20 20:03 17 -> /proc/kmsg
l-wx------ 1 root root 64 2011-04-20 20:03 2 -> /var/log/syslog
l-wx------ 1 root root 64 2011-04-20 20:03 3 -> /var/log/daemon.log
l-wx------ 1 root root 64 2011-04-20 20:03 4 -> /var/log/kern.log
l-wx------ 1 root root 64 2011-04-20 20:03 5 -> /var/log/lpr.log
l-wx------ 1 root root 64 2011-04-20 20:03 6 -> /var/log/mail.log
l-wx------ 1 root root 64 2011-04-20 20:03 7 -> /var/log/user.log
l-wx------ 1 root root 64 2011-04-20 20:03 8 -> /var/log/mail.info
l-wx------ 1 root root 64 2011-04-20 20:03 9 -> /var/log/mail.warn
我们看到这里只用到了18个文件描述符.而如果超过32个文件描述符,将以32进行递增,如果是64位系统,将以64进行递增.
FDSize这个值不会减少,如果我们程序打开了300个文件,并不会因为关闭文件,而减少FDSize这个值.
 参考:http://www.cnblogs.com/youxin/p/4744652.html