大叔很下饭 發表於 2025-7-28 00:00:00

Linux查看进程内存占用的6种方法汇总

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>top</li><li>ps</li><li>smaps</li><li>pmap</li><li>smem</li><li>status<ul class="second_class_ul"><li>END</li></ul></li><li>Linux查询内存或CPU占用最多的几个进程<ul class="second_class_ul"><li>一、可以使用以下命令查使用内存最多的10个进程</li><ul class="third_class_ul"><li>方法1:</li><li>方法2:top (然后按下M,注意大写)</li><li>方法3:按内存大小排序,打印出所有的进程</li></ul><li>二、可以使用下面命令查使用CPU最多的3个进程</li><ul class="third_class_ul"><li>方法1:</li><li>方法2:top (然后按下P,注意大写)</li></ul></ul></li></ul></div><p>CPU和内存是机器性能好坏的关键部件,内存大了就能运行更多的程序,但是程序运行多了就会出现资源消耗竞争的关系,有时候系统出现负载过高的情况下,我们如何去判断是那个程序导致的呢?这就可以用上今天分享的几个工具指令了,快来一起学一下吧!</p>
<p>我这里整理了 6 种方式,应该足够用了吧,不够你可以再补充。</p>
<ul><li>top 命令</li><li>ps 命令</li><li>smaps 命令</li><li>pmap 命令</li><li>smem 命令</li><li>status 命令</li></ul>
<p class="maodian"></p><h2>top</h2>
<p>首先想到的肯定是 top 命令,直接输入 top 回车即可</p>
<p style="text-align:center"><img alt="" height="362" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TE11.png" width="1136" /></p>
<p>输出参数介绍:</p>
<ul><li>PID:进程的ID</li><li>USER:进程所有者</li><li>VIRT:进程占用的虚拟内存</li><li>RES:进程占用的物理内存</li><li>SHR:进程使用的共享内存</li><li>S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数</li><li>%CPU:进程占用CPU的使用率</li><li>%MEM:进程使用的物理内存和总内存的百分比</li><li>TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值</li></ul>
<p>top命令默认是以CPU排序输出的,按字母「****M****」,可以按内存占用大小进行排序显示</p>
<p style="text-align:center"><img alt="" height="361" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TBJ.png" width="1200" /></p>
<p>显示的有整体内存占用情况和各个进程占用的内存情况。</p>
<p class="maodian"></p><h2>ps</h2>
<p>默认的 ps 不输出内存相关的内容,可以添加要显示的字段</p>
<div class="dxycode"><pre class="brush:bash;">ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'</pre></div>
<ul><li>-e 显示所有进程</li><li>-o 定制显示信息</li><li>pid 进程ID</li><li>comm 进程名</li><li>args 启动命令</li><li>pcpu 占用CPU 百分比</li><li>rsz 占用物理内存大小</li><li>vsz 占用虚拟内存大小</li><li>stime 进程启动时间</li><li>user 启动用户</li></ul>
<p style="text-align:center"><img alt="" height="284" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TCI.png" width="1200" /></p>
<p>RSZ: 954184 表示内存占用</p>
<p>更多操作指令,按内存排序</p>
<div class="dxycode"><pre class="brush:bash;">ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr </pre></div>
<p style="text-align:center"><img alt="" height="290" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TN63.png" width="1200" /></p>
<p>也可以使用 <code>--sort -rsz</code> 按 rsz 排序,效果一样</p>
<p style="text-align:center"><img alt="" height="259" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TO31.png" width="1200" /></p>
<p class="maodian"></p><h2>smaps</h2>
<p>smaps 也是进程的一个属性,可以通过 cat smaps 获得</p>
<div class="dxycode"><pre class="brush:bash;">cat /proc/7576/smaps | grep Rss | awk '{sum +=$2} END{print sum}' </pre></div>
<p>需要将他们进行加起来</p>
<p style="text-align:center"><img alt="" height="438" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TG50.png" width="1200" /></p>
<p class="maodian"></p><h2>pmap</h2>
<p>使用 pmap 也可以查看进程的详细内存占用情况</p>
<div class="dxycode"><pre class="brush:bash;">pmap -h
Usage:
pmap 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=&lt;file&gt;   read the rc from file
-n, --create-rc             create new default rc
-N, --create-rc-to=&lt;file&gt;   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=&lt;low&gt;[,&lt;high&gt;]limit results to the given range
-h, --help   display this help and exit
-V, --versionoutput version information and exit
For more details see pmap(1).</pre></div>
<p>执行 <code>pmap -x pid</code> 可以查看详情</p>
<div class="dxycode"><pre class="brush:bash;">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 ModeMapping
...............
---------------- ------- ------- -------
total kB         3725156626940619032</pre></div>
<p>RSS: 626940 即内存占用。</p>
<p class="maodian"></p><h2>smem</h2>
<p>一般系统没有自带,需要安装一下,根据你的系统选择合适的安装工具</p>
<p style="text-align:center"><img alt="" height="616" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TRI.png" width="1200" /></p>
<div class="dxycode"><pre class="brush:bash;">apt-get update
apt-get install -y smem
smem --help</pre></div>
<p style="text-align:center"><img alt="" height="923" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TV93.png" width="1051" /></p>
<p>自带排序,直接输出排好序的数据,可以使用 -r 参数从大到小排列</p>
<div class="dxycode"><pre class="brush:bash;">smem
smem -r</pre></div>
<p style="text-align:center"><img alt="" height="495" src="https://zhuji.jb51.net/uploads/allimg/20250728/2-250HQ14TU63.png" width="1200" /></p>
<p class="maodian"></p><h2>status</h2>
<p>Linux 中每个进程在 /proc 目录下都有对应的目录,其中某个进程目录下有一个 status 文件,通过 status 文件内容可以查看到当前占用资源的情况</p>
<div class="dxycode"><pre class="brush:bash;">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</pre></div>
<p>VmRSS: 621528 kB 就表示占用的内存大小。</p>
<p class="maodian"></p><h3>END</h3>
<p>好了,今天的分享就到这里,关注我,和我一起学习成长。</p>
<p class="maodian"></p><h2>Linux查询内存或CPU占用最多的几个进程</h2>
<p class="maodian"></p><h3>一、可以使用以下命令查使用内存最多的10个进程</h3>
<p class="maodian"></p><p class="maodian"></p><h4>方法1:</h4>
<div class="dxycode"><pre class="brush:bash;">ps -aux | sort -k4nr | head -10</pre></div>
<p>如果是最高的三个,10改为3即可</p>
<p>命令解释:&nbsp;</p>
<p>1. ps:参数a指代all&mdash;&mdash;所有的进程,u指代userid&mdash;&mdash;执行该进程的用户id,x指代显示所有程序,不以终端机来区分。ps -aux的输出格式如下:</p>
<div class="dxycode"><pre class="brush:bash;">USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND</pre></div>
<p>2. sort -k4nr中(k代表从根据哪一个关键词排序,后面的数字4表示按照第四列排序;n指代numberic sort,根据其数值排序;r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。)。本例中,可以看到%MEM在第4个位置,根据%MEM的数值进行由大到小的排序。-k3表示按照cpu占用率排序。</p>
<p class="maodian"></p><h4>方法2:top (然后按下M,注意大写)</h4>
<p>参数解释&nbsp;</p>
<ul><li>PID:进程的ID</li><li>USER:进程所有者</li><li>PR:进程的优先级别,越小越优先被执行</li><li>NInice:值</li><li>VIRT:进程占用的虚拟内存</li><li>RES:进程占用的物理内存</li><li>SHR:进程使用的共享内存</li><li>S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数</li><li>%CPU:进程占用CPU的使用率</li><li>%MEM:进程使用的物理内存和总内存的百分比</li><li>TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。</li><li>COMMAND:进程启动命令名称</li></ul>
<p class="maodian"></p><h4>方法3:按内存大小排序,打印出所有的进程</h4>
<div class="dxycode"><pre class="brush:bash;">ps aux --sort -rss</pre></div>
<p class="maodian"></p><h3>二、可以使用下面命令查使用CPU最多的3个进程</h3>
<p class="maodian"></p><p class="maodian"></p><h4>方法1:</h4>
<div class="dxycode"><pre class="brush:bash;">ps -aux | sort -k3nr | head -3</pre></div>
<p class="maodian"></p><h4>方法2:top (然后按下P,注意大写)</h4>
<p>以上就是Linux 查看进程内存占用的 6 种方法,建议点赞收藏备用,排查问题好帮手的详细内容,更多相关资料请阅读琼殿技术社区其它文章!</p>
頁: [1]
查看完整版本: Linux查看进程内存占用的6种方法汇总