备注:早上的时候看到一位关注很久的老DBA写的一篇关于分析数据库内存的微信公众号文章,里面提到了内存的监控,特别是linux在引入了虚拟内存、NUMA等东西后,对于内存这块真的很蒙圈,在其文章中讲述了如何分析内存,特别是推荐了smem这款
分析工具,于是并上网搜了下相关的资料,尝试安装了下,并将整个过程记录下来,以便以后用到。
smem介绍
smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具,smem可以报告实际使用的物理内存(PSS),可以衡量虚拟内存系统的库和应用程序所占用的内存数量。
Smem工具和linux上的其他工具之间的最大区别就是,它能分析物理内存的真实使用情况
smem的功能特性如下:
- 系统概况列表
- 按进程、映射和用户列表
- 按用户、映射或用户过滤
- 来自多个数据源的可配置列
- 可配置的输出单位和百分比
- 可配置的标题和总和
- 从/proc读取活动数据
- 从目录镜像或经过压缩的打包文件读取数据快照
- 面向嵌入式系统的轻型捕获工具
- 内置的图表生成功能
Linux使用到了虚拟内存(virtual memory),因此要准确的计算一个进程实际使用的物理内存就不是那么简单。只知道进程的虚拟内存大小也并没有太大的用处,因为还是无法获取到实际分配的物理内存大小。
RSS(Resident set size),使用top命令可以查询到,是最常用的内存指标,表示进程占用的物理内存大小。但是,将各进程的RSS值相加,通常会超出整个系统的内存消耗,这是因为RSS中包含了各进程间共享的内存。
PSS(Proportional set size)所有使用某共享库的程序均分该共享库占用的内存时,每个进程占用的内存。显然所有进程的PSS之和就是系统的内存使用量。它会更准确一些,它将共享内存的大小进行平均后,再分摊到各进程上去。
USS(Unique set size )进程独自占用的内存,它是PSS中自己的部分,它只计算了进程独自占用的内存大小,不包含任何共享的部分。
VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
smem工具安装
去官方网址https://www.selenic.com/smem/ 下载对应的smem安装包,以下是展示在Centos 7上的安装过程。
[root@redis-1 ~]# tar -zxvf smem-1.4.tar.gz
smem-1.4/.hg_archival.txt
smem-1.4/.hgtags
smem-1.4/COPYING
smem-1.4/smem
smem-1.4/smem.8
smem-1.4/smemcap.c
[root@redis-1 ~]# cp /root/smem-1.4/smem /usr/bin
[root@redis-1 ~]# chmod +x /usr/bin/smem
smem工具使用
使用smem -h 命令可以查看smem的命令帮助
1: 无参数时smem显示所有进程内存使用情况
[root@redis-1 ~]# smem
PID User Command Swap USS PSS RSS
1461 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1462 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1463 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1464 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1465 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1466 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1467 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1468 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1469 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1470 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1471 zabbix /opt/zabbix/sbin/zabbix_age 0 76 92 644
1456 zabbix /opt/zabbix/sbin/zabbix_age 0 96 129 816
1459 zabbix /opt/zabbix/sbin/zabbix_age 0 116 129 644
1460 zabbix /opt/zabbix/sbin/zabbix_age 0 116 129 644
1178 root /usr/sbin/atd -f 0 232 259 1040
1110 root /usr/sbin/irqbalance --fore 0 392 449 1316
24338 root /sbin/auditd 0 556 586 1152
1158 rpc /sbin/rpcbind -w 0 596 614 1140
1458 zabbix /opt/zabbix/sbin/zabbix_age 0 636 662 1200
1177 root /usr/sbin/crond -n 0 672 705 1620
737 root /usr/sbin/lvmetad -f 0 688 729 1640
1163 root /usr/sbin/gssproxy -D 0 740 765 1424
1813 root -bash 0 468 766 2140
1154 chrony /usr/sbin/chronyd 0 668 772 1848
7942 root -bash 0 508 809 2188
5680 root -bash 0 520 821 2200
1148 root /usr/lib/systemd/systemd-lo 0 840 874 1804
1477 root login -- root 0 732 1141 2720
1112 dbus /usr/bin/dbus-daemon --syst 0 908 1152 2552
1436 root /usr/libexec/postfix/master 0 1148 1198 2188
1318 root /usr/sbin/sshd -D 0 1032 1610 4380
1441 postfix qmgr -l -t unix -u 0 1224 1645 4108
740 root /usr/lib/systemd/systemd-ud 0 1800 1868 2852
1176 postfix pickup -l -t unix -u 0 1540 1911 4072
7940 root sshd: root@pts/0,pts/ 0 1820 2812 6024
1 root /usr/lib/systemd/systemd -- 0 3084 3197 4300
1151 root /usr/bin/vmtoolsd 0 2520 3264 6328
1150 root /usr/bin/VGAuthService -s 0 2840 3477 6256
1379 root ./SFTServer 0 2324 4481 8072
715 root /usr/lib/systemd/systemd-jo 0 3040 5780 9412
6225 root python /usr/bin/smem 0 5700 6387 7908
9672 root /usr/sbin/glusterd -p /var/ 0 6240 6446 8332
4414 root redis-cli -h 192.168.1.113 0 7068 7090 7848
1378 root ./SFTMonitor 0 5524 7656 10936
1580 root /usr/sbin/rsyslogd -n 0 6728 9513 13500
8873 root redis-server 192.168.1.112 0 10540 11017 12164
8882 root redis-server 192.168.1.112 0 10688 11165 12308
1107 polkitd /usr/lib/polkit-1/polkitd - 0 10868 11370 13644
1319 root /usr/bin/python2 -Es /usr/s 0 14420 15765 19344
2:参数-u 显示每个用户所耗用的内存总量
[root@local-oracle-db ~]# smem -u
User Count Swap USS PSS RSS
rpc 1 0 600 605 1128
dbus 1 0 888 1036 2508
postfix 2 0 2424 2954 8252
zabbix 15 0 3788 4094 16296
polkitd 1 0 4856 5556 8376
root 35 0 63088 80612 155280
grid 32 0 370336 433228 985848
oracle 172 0 2396248 2482417 6133164
3: 参数-p 查看耗用内存情况的百分比
[root@redis-1 ~]# smem -p
PID User Command Swap USS PSS RSS
1461 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1462 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1463 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1464 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1465 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1466 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1467 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1468 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1469 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1470 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1471 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1456 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1459 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1460 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.00% 0.00% 0.01%
1178 root /usr/sbin/atd -f 0.00% 0.00% 0.00% 0.01%
1110 root /usr/sbin/irqbalance --fore 0.00% 0.00% 0.00% 0.01%
24338 root /sbin/auditd 0.00% 0.01% 0.01% 0.01%
1158 rpc /sbin/rpcbind -w 0.00% 0.01% 0.01% 0.01%
1458 zabbix /opt/zabbix/sbin/zabbix_age 0.00% 0.01% 0.01% 0.01%
1177 root /usr/sbin/crond -n 0.00% 0.01% 0.01% 0.02%
737 root /usr/sbin/lvmetad -f 0.00% 0.01% 0.01% 0.02%
1163 root /usr/sbin/gssproxy -D 0.00% 0.01% 0.01% 0.01%
1813 root -bash 0.00% 0.00% 0.01% 0.02%
1154 chrony /usr/sbin/chronyd 0.00% 0.01% 0.01% 0.02%
7942 root -bash 0.00% 0.01% 0.01% 0.02%
5680 root -bash 0.00% 0.01% 0.01% 0.02%
1148 root /usr/lib/systemd/systemd-lo 0.00% 0.01% 0.01% 0.02%
1477 root login -- root 0.00% 0.01% 0.01% 0.03%
1112 dbus /usr/bin/dbus-daemon --syst 0.00% 0.01% 0.01% 0.03%
1436 root /usr/libexec/postfix/master 0.00% 0.01% 0.01% 0.02%
1318 root /usr/sbin/sshd -D 0.00% 0.01% 0.02% 0.04%
1441 postfix qmgr -l -t unix -u 0.00% 0.01% 0.02% 0.04%
740 root /usr/lib/systemd/systemd-ud 0.00% 0.02% 0.02% 0.03%
1176 postfix pickup -l -t unix -u 0.00% 0.02% 0.02% 0.04%
7940 root sshd: root@pts/0,pts/ 0.00% 0.02% 0.03% 0.06%
1 root /usr/lib/systemd/systemd -- 0.00% 0.03% 0.03% 0.04%
1151 root /usr/bin/vmtoolsd 0.00% 0.03% 0.03% 0.06%
1150 root /usr/bin/VGAuthService -s 0.00% 0.03% 0.03% 0.06%
1379 root ./SFTServer 0.00% 0.02% 0.04% 0.08%
715 root /usr/lib/systemd/systemd-jo 0.00% 0.03% 0.06% 0.09%
6507 root python /usr/bin/smem -p 0.00% 0.06% 0.06% 0.08%
9672 root /usr/sbin/glusterd -p /var/ 0.00% 0.06% 0.06% 0.08%
4414 root redis-cli -h 192.168.17.113 0.00% 0.07% 0.07% 0.08%
1378 root ./SFTMonitor 0.00% 0.05% 0.08% 0.11%
1580 root /usr/sbin/rsyslogd -n 0.00% 0.07% 0.09% 0.13%
8873 root redis-server 192.168.17.112 0.00% 0.10% 0.11% 0.12%
8882 root redis-server 192.168.17.112 0.00% 0.11% 0.11% 0.12%
1107 polkitd /usr/lib/polkit-1/polkitd - 0.00% 0.11% 0.11% 0.14%
1319 root /usr/bin/python2 -Es /usr/s 0.00% 0.14% 0.16% 0.19%
4: 参数-w 查看系统内存使用情况
[root@local-oracle-db ~]# smem -w
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 116162764 28144560 88018204
userspace memory 3011960 278888 2733072
free memory 12272844 12272844 0
5: 参数-R REALMEM
REALMEM这个值是指物理内存数量。此参数可以让smem在整个系统(-w)的输出中发现固件/硬件所耗用的内存数量
[root@local-oracle-db ~]# smem -R 64G -w
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 116162604 28144240 88018364
userspace memory 3022124 279296 2742828
free memory 12262840 12262840 0
6:参数-c 用来显示需要展示的列
[root@local-bi-oracle-db ~]# smem -c "name user pss"
Name User PSS
zabbix_agentd zabbix 135
zabbix_agentd zabbix 149
zabbix_agentd zabbix 149
zabbix_agentd zabbix 149
zabbix_agentd zabbix 152
zabbix_agentd zabbix 152
zabbix_agentd zabbix 152
zabbix_agentd zabbix 152
zabbix_agentd zabbix 152
zabbix_agentd zabbix 155
zabbix_agentd zabbix 155
zabbix_agentd zabbix 155
zabbix_agentd zabbix 159
zabbix_agentd zabbix 159
agetty root 177
init.ohasd root 406
irqbalance root 480
bash oracle 506
bash oracle 506
bash root 506
bash root 526
bash root 530
bash oracle 531
auditd root 540
bash root 547
bash root 563
rpcbind rpc 605
lvmetad root 625
7: 参数-s 根据某一列(例如 rss)来排序
[root@local-oracle-db ~]# smem -s rss
PID User Command Swap USS PSS RSS
2401 zabbix /opt/zabbix/sbin/zabbix_age 0 112 135 820
2422 root /sbin/agetty --noclear tty1 0 172 177 864
2406 zabbix /opt/zabbix/sbin/zabbix_age 0 140 159 992
2407 zabbix /opt/zabbix/sbin/zabbix_age 0 140 159 992
2410 zabbix /opt/zabbix/sbin/zabbix_age 0 132 152 992
2411 zabbix /opt/zabbix/sbin/zabbix_age 0 132 152 992
2412 zabbix /opt/zabbix/sbin/zabbix_age 0 128 149 992
2413 zabbix /opt/zabbix/sbin/zabbix_age 0 128 149 992
2414 zabbix /opt/zabbix/sbin/zabbix_age 0 128 149 992
2415 zabbix /opt/zabbix/sbin/zabbix_age 0 132 152 992
2416 zabbix /opt/zabbix/sbin/zabbix_age 0 132 152 992
2417 zabbix /opt/zabbix/sbin/zabbix_age 0 132 152 992
2418 zabbix /opt/zabbix/sbin/zabbix_age 0 136 155 992
2419 zabbix /opt/zabbix/sbin/zabbix_age 0 136 155 992
2421 zabbix /opt/zabbix/sbin/zabbix_age 0 136 155 992
1688 root /sbin/auditd 0 536 540 1092
1753 rpc /sbin/rpcbind -w 0 600 605 1128
1727 root /usr/sbin/irqbalance --fore 0 448 480 1420
1812 root /usr/sbin/gssproxy -D 0 732 736 1432
791 root /usr/sbin/lvmetad -f 0 616 625 1572
2350 root /usr/sbin/crond -n 0 672 679 1616
31289 root /bin/sh /etc/init.d/init.oh 0 340 406 1704
1721 root /usr/lib/systemd/systemd-lo 0 800 809 1772
3057 root -bash 0 412 506 2052
190328 oracle -bash 0 412 506 2060
210952 oracle -bash 0 412 506 2060
190740 root -bash 0 432 526 2068
247779 root -bash 0 436 530 2072
8: 参数-r 一般与参数-s结合使用,表示反转排序(从升序改为降序)
[root@redis-1 ~]# smem -s rss -r
PID User Command Swap USS PSS RSS
1319 root /usr/bin/python2 -Es /usr/s 0 14420 15765 19344
1107 polkitd /usr/lib/polkit-1/polkitd - 0 10868 11370 13644
1580 root /usr/sbin/rsyslogd -n 0 6728 9517 13508
8882 root redis-server 192.168.17.112 0 10688 11165 12308
8873 root redis-server 192.168.17.112 0 10540 11017 12164
1378 root ./SFTMonitor 0 5524 7656 10936
715 root /usr/lib/systemd/systemd-jo 0 3040 5784 9420
9672 root /usr/sbin/glusterd -p /var/ 0 6240 6446 8332
1379 root ./SFTServer 0 2324 4481 8072
7330 root python /usr/bin/smem -s rss 0 5748 6435 7956
4414 root redis-cli -h 192.168.17.113 0 7068 7090 7848
1151 root /usr/bin/vmtoolsd 0 2520 3264 6328
1150 root /usr/bin/VGAuthService -s 0 2840 3477 6256
7940 root sshd: root@pts/0,pts/ 0 1824 2816 6028
1318 root /usr/sbin/sshd -D 0 1032 1610 4380
1 root /usr/lib/systemd/systemd -- 0 3084 3197 4300
1441 postfix qmgr -l -t unix -u 0 1224 1645 4108
1176 postfix pickup -l -t unix -u 0 1540 1911 4072
740 root /usr/lib/systemd/systemd-ud 0 1800 1868 2852
1477 root login -- root 0 732 1141 2720
1112 dbus /usr/bin/dbus-daemon --syst 0 908 1152 2552
5680 root -bash 0 520 821 2200
7942 root -bash 0 508 809 2188
1436 root /usr/libexec/postfix/master 0 1148 1198 2188
1813 root -bash 0 468 766 2140
1154 chrony /usr/sbin/chronyd 0 668 772 1848
1148 root /usr/lib/systemd/systemd-lo 0 840 874 1804
737 root /usr/sbin/lvmetad -f 0 688 729 1640
1177 root /usr/sbin/crond -n 0 672 705 1620
1163 root /usr/sbin/gssproxy -D 0 740 765 1424
1110 root /usr/sbin/irqbalance --fore 0 392 449 1316
1458 zabbix /opt/zabbix/sbin/zabbix_age 0 636 662 1200
24338 root /sbin/auditd 0 556 586 1152
1158 rpc /sbin/rpcbind -w 0 596 614 1140
1178 root /usr/sbin/atd -f 0 232 259 1040
1456 zabbix /opt/zabbix/sbin/zabbix_age 0 96 129 816
9:参数-M 过滤相关进程。Show processes filtered by mapping
[root@redis-1 ~]# smem -M redis
PID User Command Swap USS PSS RSS
4414 root redis-cli -h 192.168.1.113 0 388 388 388
8873 root redis-server 192.168.1.112 0 60 506 952
8882 root redis-server 192.168.1.112 0 112 558 1004
[root@local-oracle-db ~]# smem -M oracle
PID User Command Swap USS PSS RSS
31577 grid /u01/app/19.0.0/grid/bin/or 0 0 0 4
31847 grid asm_smon_+ASM 0 32 548 12840
31855 grid asm_pxmn_+ASM 0 36 553 12840
31803 grid asm_psp0_+ASM 0 40 559 12848
31818 grid asm_mman_+ASM 0 56 574 12860
31808 grid asm_vktm_+ASM 0 56 587 12872
189561 oracle ora_p008_ccdb 0 512 589 13912
189563 oracle ora_p009_ccdb 0 512 589 13908
189565 oracle ora_p00a_ccdb 0 512 589 13904
189568 oracle ora_p00b_ccdb 0 512 589 13912
189570 oracle ora_p00c_ccdb 0 512 589 13912