Debian Linux 3.16 システムでは、244 MB のスワップ領域を使用します。
# free -h
total used free shared buffers cached
Mem: 94G 36G 57G 1.9G 3.8G 11G
-/+ buffers/cache: 20G 73G
Swap: 487M 244M 243M
これを見ると、244MBが使用されているものが見つかりません。
# for file in /proc/*/status ; do grep VmSwap $file; done | sort -nk 2 | tail
VmSwap: 0 kB
VmSwap: 0 kB
VmSwap: 0 kB
VmSwap: 0 kB
VmSwap: 0 kB
VmSwap: 0 kB
VmSwap: 4 kB
VmSwap: 12 kB
VmSwap: 16 kB
VmSwap: 36 kB
34MBしかありませんSwapCached
。
# grep -i swap /proc/meminfo
SwapCached: 34584 kB
SwapTotal: 499708 kB
SwapFree: 249388 kB
カーネル文書には次のように記載されています。
SwapCached:一度スワップアウトされたメモリは再スワップアウトされますが、まだスワップファイルにあります(メモリが必要な場合はすでにスワップファイルにあるため、再スワップアウトする必要はありません。これによりI / Oが節約されます)。
私のLinuxシステムのどのプロセスが私のスワップスペースを使用しているのか、どうすればわかりますか?具体的には:この244MBのスワップスペースはどこで使用されますか?
答え1
私のLinuxシステムのどのプロセスが私のスワップスペースを使用しているのか、どうすればわかりますか?
スワップ空間は、特定のプロセスで必ずしも使用されるわけではありません。
より正確に言えば、この244MBのスワップスペースはどこで消費されますか?
ファイルベースのシステムに保存されているファイルはtmpfs
それを使用できます(tmpfs
最初にRAMをバックエンドとして使用しますが、RAMを無駄にしないために積極的に使用されていないスワップ領域ブロックにページングすることができます)。
出力を確認してください。
df -ht tmpfs
答え2
これは、
/proc/PID/smaps
各プロセスマップのメモリ消費量を示すマップベースの拡張です。各マッピングには、次の一連の行があります。08048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash Size: 1084 kB Rss: 892 kB Pss: 374 kB Shared_Clean: 892 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 892 kB Anonymous: 0 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd ex mr mw me dw
努力する
SWAP_FIELD="SwapPss"
#SWAP_FIELD="Swap"
for proc in /proc/*; do
if [[ ! "${proc}" =~ /proc/[0-9]+/* ]]; then
continue
fi
executable=$(readlink "${proc}/exe" | awk '{print $1}')
awk -v executable="${executable}" \
-v SWAP_FIELD="${SWAP_FIELD}" \
'$0~SWAP_FIELD{swap+=$2}END{print swap"\tKiB\t"executable}' < "${proc}/smaps";
done |\
sort -n |\
awk '{total+=$1}/[0-9]/;END{print total "\tKB\tTotal"}'
出力例:
0 KB /usr/bin/bash
0 KB /usr/bin/bash
0 KB /usr/bin/bash
0 KB /usr/bin/bash
0 KB /usr/bin/bash
0 KB /usr/bin/docker-containerd
0 KB /usr/bin/docker-containerd-shim
0 KB /usr/bin/docker-containerd-shim
0 KB /usr/bin/docker-proxy
0 KB /usr/bin/docker-proxy
0 KB /usr/bin/docker-proxy
0 KB /usr/bin/gawk
0 KB /usr/bin/readlink
0 KB /usr/bin/sleep
0 KB /usr/bin/sort
0 KB /usr/bin/ssh
0 KB /usr/bin/ssh
0 KB /usr/bin/ssh-agent
0 KB /usr/libexec/postfix/pickup
0 KB /usr/libexec/postfix/qmgr
0 KB /usr/sbin/atd
0 KB /usr/sbin/dnsmasq
0 KB /usr/sbin/dnsmasq
0 KB /usr/sbin/sedispatch
0 KB /usr/sbin/sshd
0 KB /usr/sbin/sshd
28 KB /usr/sbin/chronyd
32 KB /usr/sbin/audispd
84 KB /usr/sbin/avahi-daemon
88 KB /usr/lib/systemd/systemd-logind
100 KB /usr/bin/tail
104 KB /usr/sbin/crond
156 KB /usr/sbin/avahi-daemon
192 KB /usr/lib/systemd/systemd-journald
196 KB /usr/bin/bash
196 KB /usr/bin/dbus-launch
...
14872 KB /usr/bin/Xvnc
20048 KB /usr/lib64/firefox/firefox
40176 KB /usr/lib64/firefox/firefox
108848 KB /usr/sbin/mysqld
267144 KB Total
これは実際にはmysqlが最も多くのスワップスペースを使用していることを示しています。
$ free -k
total used free shared buff/cache available
Mem: 1883740 1044212 112132 14320 727396 520304
Swap: 2097148 265784 1831364
free
私の場合、出力は大幅に外れないようです。
答え3
これにより、現在スワップメモリを使用している各PIDが印刷されます。
for pid in $(ls /proc/ | grep -Po '^\d+$'); do echo -n "$pid "; cat /proc/$pid/status | grep VmSwap; done | grep -vE ' 0 kB$' | grep -Eo '[0-9]+ VmSwap:.+' | sed -r 's/VmSwap://g'