判断哪个应用程序/进程正在使用交换的最佳方式?

判断哪个应用程序/进程正在使用交换的最佳方式?

我有 16G RAM 和 8G 交换分区。我正在运行 Unity 17.04。我遇到了一个问题,我的内存buff/cache会达到 11M,我的内存swap used会达到 3500 左右。以前我几乎从未使用过任何交换空间,也从未监控过 buff/cache。

我相信这是一个存在内存泄漏的应用程序,但我可能错了。

简单的问题。是否有任何简单的方法可以确定应用程序/进程是否正在使用或曾经使用过交换?

在此处输入图片描述

答案1

您可以通过以下命令查看特殊进程使用了​​多少交换分区:

cat /proc/"PID"/status | grep "^VmSwap"

你可以PID通过这个命令找到:

ps -A | grep "Application_name"

但是如果你想要找出哪些进程正在使用交换分区,你可以使用这个脚本:

#!/bin/bash
for i in /proc/*/status ; do
    vmswap=$(cat $i | grep "^VmSwap")
    echo "$vmswap" | grep -qv ' 0 kB'
    if [ $? == 0 ] && [ "$vmswap" != "" ] ; then
        echo "$i : $vmswap"
    fi
done

然后您可以从脚本返回的 PID 中找到应用程序名称。

更新:我将此脚本更改为每 10 秒创建一次日志文件(您可以更改时间),并且在该文件中,您可以看到从运行此脚本到现在的许多进程:

#!/bin/bash
counter=1
touch ~/swap_process_usage.log
while true ; do
    echo -e "************************************\nSwap's process in count $counter " >> ~/swap_process_usage.log
    for i in /proc/*/status ; do
        vmswap=$(cat $i | grep "^VmSwap")
        echo "$vmswap" | grep -qv ' 0 kB'
        if [ $? == 0 ] && [ "$vmswap" != "" ] ; then
            pid=$(echo "$i" | tr -d /proc/ | tr -d status)
            proc_name=$(ps -p $pid -o comm=)
            echo "$proc_name : $pid : $vmswap" >> ~/swap_process_usage.log
        fi
    done
    sleep 10s
    counter=$((counter+1))
done

您可以将此脚本设置为在启动所以它每次都会创建日志。

相关内容