判斷哪個應用程式/進程正在使用交換的最佳方法?

判斷哪個應用程式/進程正在使用交換的最佳方法?

我有 16G 內存和 8G 交換分區。我正在運行 Unity 17.04。我有一個問題,我的記憶體buff/cache達到 11M,而我的記憶體swap used達到 3500 左右。

我相信這是一個存在內存洩漏的應用程序,但我可能是錯的。

簡單的問題。有沒有簡單的方法可以確定應用程式/進程正在或已經使用交換?

在此輸入影像描述

答案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

您可以將此腳本設定為運行於啟動所以它每次都會建立日誌。

相關內容