方法三
我们还可以使用“pmap”来获取进程的交换内存使用情况的详细信息。
这个值将再次类似于我们上面计算的值
例如,获取“amsHelper”的交换使用情况
# pmap -X $(pgrep amsHelper) 2010: /sbin/amsHelper -f Address Perm Offset Device Inode Size Rss Pss Referenced Anonymous Swap Locked Mapping 00400000 r-xp 00000000 fd:00 13670 1632 408 408 408 0 0 0 amsHelper 00798000 r--p 00198000 fd:00 13670 4 4 4 4 4 0 0 amsHelper 00799000 rw-p 00199000 fd:00 13670 52 16 16 12 16 0 0 amsHelper 007a6000 rw-p 00000000 00:00 0 356 32 32 32 32 16 0 021c6000 rw-p 00000000 00:00 0 11584 7280 7280 7268 7280 4240 0 [heap] 7f4177075000 r-xp 00000000 fd:00 3119 48 0 0 0 0 0 0 libnss_files-2.17.so 7f4177081000 ---p 0000c000 fd:00 3119 2044 0 0 0 0 0 0 libnss_files-2.17.so 7f4177280000 r--p 0000b000 fd:00 3119 4 0 0 0 0 4 0 libnss_files-2.17.so 7f41776a9000 r--p 00015000 fd:00 3111 4 0 0 0 0 4 0 libnsl-2.17.so 7f41776aa000 rw-p 00016000 fd:00 3111 4 0 0 0 0 4 0 libnsl-2.17.so 7f4181bb0000 r--s 00000000 fd:00 274663 264 0 0 0 0 0 0 modules.dep 7f4181bf3000 r--s 00000000 00:13 20825 212 0 0 0 0 196 0 dbQN6MqZ (deleted) 7f4181c28000 rw-p 00000000 00:00 0 56 24 24 4 24 32 0 7f4181c36000 r--s 00000000 fd:00 132688 28 0 0 0 0 0 0 gconv-modules.cache 7f4181c3d000 rw-p 00000000 00:00 0 4 4 4 0 4 0 0 7f4181c3e000 r--p 00021000 fd:00 3094 4 4 4 0 4 0 0 ld-2.17.so 7f4181c3f000 rw-p 00022000 fd:00 3094 4 4 4 0 4 0 0 ld-2.17.so 7f4181c40000 rw-p 00000000 00:00 0 4 4 4 0 4 0 0 7ffd33f16000 rw-p 00000000 00:00 0 132 16 16 16 16 20 0 [stack] 7ffd33fce000 r-xp 00000000 00:00 0 8 4 0 4 0 0 0 [vdso] ffffffffff600000 r-xp 00000000 00:00 0 4 0 0 0 0 0 0 [vsyscall] ====== ==== ==== ========== ========= ==== ====== 188208 8296 7934 8140 7516 4788 0 KB
这里的倒数第三列显示了此过程的交换使用情况
使用下面命令,我们可以知道总的、已用的和可用的交换内存
# free -m total used free shared buff/cache available Mem: 128816 10014 117010 126 1791 117822 Swap: 4091 1821 2270
但它没有提供有关每个进程或者应用程序的交换内存使用情况
下面是检查进程的交换内存使用情况的方法:
方法四
现在有另一种方法可以找到交换内存使用情况,与上面相比,它是最好的并且可靠的,因为它将提供类似于上面但更详细的进程使用的每个库的交换使用情况。
例如检查“amsHelper”进程的细节
# cat /proc/$(pgrep amsHelper)/smaps
对于进程使用的每个库文件,它将具有如下信息
7ffd33f16000-7ffd33f37000 rw-p 00000000 00:00 0 [stack] Size: 132 kB Rss: 16 kB Pss: 16 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 16 kB Referenced: 16 kB Anonymous: 16 kB AnonHugePages: 0 kB Swap: 20 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd wr mr mw me gd ac
如我们所见,它将为我们提供一个很长的列表,因此我们必须收集所需的输出,然后计算整个值以获得总体使用情况:
# cat /proc/$(pgrep amsHelper)/smaps | grep -i swap |awk '{s+=} END {print s}' 4788
方法二
我们还可以从每个进程的状态检查这个值,这将提供类似于我们使用“top”实用程序获得的值
例如,如果我希望获得“amsHelper”进程的交换使用详细信息
# grep -i VmSwap /proc/$(pgrep amsHelper)/status VmSwap: 4592 kB
如果进程有多个关联的 PID,那么可以使用下面的命令
# for i in $(pidof postgres);do grep -i vmswap /proc/$i/status;done VmSwap: 1560 kB VmSwap: 1068 kB VmSwap: 916 kB VmSwap: 856 kB VmSwap: 1020 kB VmSwap: 816 kB VmSwap: 1132 kB VmSwap: 900 kB VmSwap: 884 kB VmSwap: 864 kB VmSwap: 888 kB VmSwap: 796 kB
计算总数
# for i in $(pidof postgres);do grep -i vmsw /proc/$i/status;done | awk '{s+=} END {print s}' 17324
方法一
我们有“top”实用程序,它可以用作获取每个进程的交换利用率值的第一个工具。
默认情况下,'top' 不显示 SWAP 利用率,因此我们需要添加添加字段“SWAP”,然后将显示此值。
'top' 使用以下公式显示相关信息:
VIRT = SWAP + RES 即 SWAP = VIRT - RES
top的输出看起来像下面这样
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND SWAP 6735 dbmrun 20 0 19.324g 3.178g 4868 S 0.7 2.5 151:06.86 java 364288 2216 ssrun 20 0 24.737g 1.639g 2588 S 0.0 1.3 24:59.10 jsvc 211668 2214 ne3suser 20 0 12.719g 1.055g 5672 S 0.3 0.8 22:04.87 jsvc 284028 2168 postgres 20 0 280636 35828 35516 S 0.0 0.0 0:23.95 postgres 796 757 root 20 0 53220 16856 16532 S 0.0 0.0 0:22.14 systemd-journal 0 1954 root 20 0 568732 11504 400 S 0.0 0.0 1:05.69 tuned 1676 1143 root 20 0 359164 10224 8812 S 0.0 0.0 0:35.86 rsyslogd 216 2010 root 20 0 188204 8284 780 S 0.0 0.0 1:25.03 amsHelper 4592
如我们所见,最后添加了一个新列,展示了 SWAP 内存使用情况。
日期:2020-06-02 22:18:24 来源:oir作者:oir