如何识别 Linux 中写入 SWAP 内存的 PID

如何识别 Linux 中写入 SWAP 内存的 PID

当 RAM 足够时,服务器会使用交换内存,因此用户会遇到间歇性缓慢和性能问题。在 free 命令中,我可以看到使用了 6927mbs 的交换空间,但是当我通过 top 对 PID 进行排序时,我发现只有 2 个 pid 消耗了几 kbs。

细节:-

free -m
             total       used       free     shared    buffers     cached
Mem:        129043     123398       5644      56782        147      59134
-/+ buffers/cache:      64116      64926
Swap:         8191       6927       1264

按 SWAP 使用情况排序的最佳输出:-

top - 11:08:18 up 17 days,  8:29, 318 users,  load average: 18.64, 18.34, 17.73
Tasks: 3115 total,  12 running, 3103 sleeping,   0 stopped,   0 zombie
Cpu(s): 26.3%us,  3.5%sy,  0.0%ni, 67.5%id,  2.5%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  132140360k total, 131050280k used,  1090080k free,    27072k buffers
Swap:  8388604k total,  7093580k used,  1295024k free, 60220780k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  **SWAP** COMMAND
  2353 mfg       20   0 38.6g 532m 2452 S  0.2  0.4   9:06.68 **4096** java
 23499 mfg       20   0 24.4g 358m 245m S  0.0  0.3   0:56.71 **2692** D_finqonddb_AS_
     1 root      20   0 23600  724  368 S  0.0  0.0   7:20.05    0 init
     2 root      20   0     0    0    0 S  0.0  0.0   3:08.08    0 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   1:04.47    0 migration/0

swappiness 值

cat /proc/sys/vm/swappiness
**1**

请帮我如何识别哪些进程正在使用/写入 SWAP 内存。

答案1

您可能需要使用 smem 查看或检查 /proc/-PID-/status 中以 VmSwap 开头的行。

https://confluence.atlassian.com/bamkb/how-to-review-swap-space-usage-on-a-linux-server-865042927.html有这个很好的 CLI 表达式来报告该行和所有 PID 的进程名称:

对于 /proc/*/status 中的文件;执行 awk'/VmSwap|Name/{printf $2" " $3}END{print""}'$file;完成 |sort -k 2 -n -r |less

答案2

smaps 文件存储交换详细信息。使用下面的脚本获取交换消耗 PID 详细信息。

ps ax -o pid,args | grep -v '^  PID'|sed -e 's,^ *,,' > /tmp/ps_ax.output
echo -n >/tmp/results
for swappid in $(grep -l Swap /proc/[1-9]*/smaps ); do
        swapusage=0
        for x in $( grep Swap $swappid 2>/dev/null |grep -v '\W0 kB'|awk '{print $2}' ); do
                let swapusage+=$x
        done
        pid=$(echo $swappid| cut -d' ' -f3|cut -d'/' -f3)
        if ( [ $swapusage -ne 0 ] ); then
                echo -ne "$swapusage kb\t\t" >>/tmp/results
                egrep "^$pid " /tmp/ps_ax.output |sed -e 's,^[0-9]* ,,' >>/tmp/results
        fi
done
echo "top swap using processes which are still running:"
sort -nr /tmp/results | head -n 10

相关内容