CPU和内存是机器性能好坏的关键部件,内存大了就能运行更多的程序,但是程序运行多了就会出现资源消耗竞争的关系,有时候系统出现负载过高的情况下,我们如何去判断是那个程序导致的呢?这就可以用上今天分享的几个工具指令了,快来一起学一下吧!
我这里整理了 6 种方式,应该足够用了吧,不够你可以再补充。
首先想到的肯定是 top 命令,直接输入 top 回车即可
输出参数介绍:
top命令默认是以CPU排序输出的,按字母「*M*」,可以按内存占用大小进行排序显示
显示的有整体内存占用情况和各个进程占用的内存情况。
默认的 ps 不输出内存相关的内容,可以添加要显示的字段
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'
RSZ: 954184 表示内存占用
更多操作指令,按内存排序
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr
也可以使用 --sort -rsz
按 rsz 排序,效果一样
smaps 也是进程的一个属性,可以通过 cat smaps 获得
cat /proc/7576/smaps | grep Rss | awk '{sum +=$2} END{print sum}'
需要将他们进行加起来
使用 pmap 也可以查看进程的详细内存占用情况
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 即内存占用。
一般系统没有自带,需要安装一下,根据你的系统选择合适的安装工具
apt-get update
apt-get install -y smem
smem --help
自带排序,直接输出排好序的数据,可以使用 -r 参数从大到小排列
smem
smem -r
Linux 中每个进程在 /proc 目录下都有对应的目录,其中某个进程目录下有一个 status 文件,通过 status 文件内容可以查看到当前占用资源的情况
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 就表示占用的内存大小。
本次的分享到此结束,希望对你有所帮助。
如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!