Linux 查看进程内存占用的 6 种方法,建议点赞收藏备用,排查问题好帮手

新质程序猿 2024-10-25 14:37:03 阅读 50

CPU和内存是机器性能好坏的关键部件,内存大了就能运行更多的程序,但是程序运行多了就会出现资源消耗竞争的关系,有时候系统出现负载过高的情况下,我们如何去判断是那个程序导致的呢?这就可以用上今天分享的几个工具指令了,快来一起学一下吧!

我这里整理了 6 种方式,应该足够用了吧,不够你可以再补充。

top 命令

ps 命令

smaps

pmap 命令

smem 命令

status

top

首先想到的肯定是 top 命令,直接输入 top 回车即可

输出参数介绍:

PID:进程的ID

USER:进程所有者

VIRT:进程占用的虚拟内存

RES:进程占用的物理内存

SHR:进程使用的共享内存

S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数

%CPU:进程占用CPU的使用率

%MEM:进程使用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值

top命令默认是以CPU排序输出的,按字母「****M****」,可以按内存占用大小进行排序显示

显示的有整体内存占用情况和各个进程占用的内存情况。

ps

默认的 ps 不输出内存相关的内容,可以添加要显示的字段

<code>ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'

-e 显示所有进程

-o 定制显示信息

pid 进程ID

comm 进程名

args 启动命令

pcpu 占用CPU 百分比

rsz 占用物理内存大小

vsz 占用虚拟内存大小

stime 进程启动时间

user 启动用户

RSZ: 954184 表示内存占用

更多操作指令,按内存排序

<code>ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr 

也可以使用 <code>--sort -rsz 按 rsz 排序,效果一样

smaps

smaps 也是进程的一个属性,可以通过 cat smaps 获得

<code>cat /proc/7576/smaps | grep Rss | awk '{sum +=$2} END{print sum}' 

需要将他们进行加起来

pmap

使用 pmap 也可以查看进程的详细内存占用情况

<code>pmap -h

Usage:

 pmap [options] PID [PID ...]

Options:

 -x, --extended              show details

 -X                          show even more details

            WARNING: format changes according to /proc/PID/smaps

 -XX                         show everything the kernel provides

 -c, --read-rc               read the default rc

 -C, --read-rc-from=<file>   read the rc from file

 -n, --create-rc             create new default rc

 -N, --create-rc-to=<file>   create new rc to file

            NOTE: pid arguments are not allowed with -n, -N

 -d, --device                show the device format

 -q, --quiet                 do not display header and footer

 -p, --show-path             show path in the mapping

 -A, --range=<low>[,<high>]  limit results to the given range

 -h, --help     display this help and exit

 -V, --version  output version information and exit

For more details see pmap(1).

执行 pmap -x pid 可以查看详情

pmap -x 7576

7576:   /usr/share/logstash/jdk/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djdk.io.File.enableADS=true -Djruby.compile.invokedynamic=true -Djruby.jit.threshold=0 -Djruby.regexp.interruptible=true -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/urandom -Dlog4j2.isThreadContextMapInheritable=true -cp /usr/share/logstash/logstash-core/lib/jars/animal-sniffer-annotations-1.14.jar:/

Address           Kbytes     RSS   Dirty Mode  Mapping

...............

---------------- ------- ------- ------- 

total kB         3725156  626940  619032

RSS: 626940 即内存占用。

smem

一般系统没有自带,需要安装一下,根据你的系统选择合适的安装工具

<code>apt-get update

apt-get install -y smem

smem --help

自带排序,直接输出排好序的数据,可以使用 -r 参数从大到小排列

<code>smem

smem -r

status

Linux 中每个进程在 /proc 目录下都有对应的目录,其中某个进程目录下有一个 status 文件,通过 status 文件内容可以查看到当前占用资源的情况

<code>cat /proc/7576/status 

Name:    java

Umask:    0022

State:    S (sleeping)

Tgid:    7576

Ngid:    0

Pid:    7576

PPid:    1

TracerPid:    0

Uid:    0    0    0    0

Gid:    0    0    0    0

FDSize:    256

Groups:    0 

VmPeak:     3724360 kB

VmSize:     3724360 kB

VmLck:           0 kB

VmPin:           0 kB

VmHWM:      638308 kB

VmRSS:      621528 kB

RssAnon:      613808 kB

RssFile:        7720 kB

RssShmem:           0 kB

VmData:     3524964 kB

VmStk:         136 kB

VmExe:           4 kB

VmLib:       22520 kB

VmPTE:        1604 kB

VmSwap:           0 kB

Threads:    34

SigQ:    0/14503

SigPnd:    0000000000000000

ShdPnd:    0000000000000000

SigBlk:    0000000000000000

SigIgn:    0000000000000000

SigCgt:    2000000181005ccf

CapInh:    0000000000000000

CapPrm:    00000000a80425fb

CapEff:    00000000a80425fb

CapBnd:    00000000a80425fb

CapAmb:    0000000000000000

Seccomp:    2

Speculation_Store_Bypass:    vulnerable

Cpus_allowed:    3

Cpus_allowed_list:    0-1

Mems_allowed:    00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

Mems_allowed_list:    0

voluntary_ctxt_switches:    22

nonvoluntary_ctxt_switches:    29

VmRSS: 621528 kB 就表示占用的内存大小。

END

好了,今天的分享就到这里,关注我,和我一起学习成长。

感谢大家的阅读,如果有任何异议的地方,欢迎指正,也欢迎大家公号找到我与我做朋友!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。