Linux-Kernel
什麼在使用我的交換空間?
在 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
看著這個,我找不到使用的 244 MB。
# 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
我只有 34 MB 的
SwapCached
:# grep -i swap /proc/meminfo SwapCached: 34584 kB SwapTotal: 499708 kB SwapFree: 249388 kB
核心文件對此進行了說明:
SwapCached:曾經被換出的記憶體,被換回但仍然在交換文件中(如果需要記憶體,則不需要再次換出,因為它已經在交換文件中。這樣可以節省 I/O)
**我如何知道哪個程序正在使用我的 Linux 系統上的交換空間?**更準確地說:這 244 MB 的交換空間分別在哪裡消耗?
我如何知道哪個程序正在使用我的 Linux 系統上的交換空間?
交換空間不一定由特定程序使用。
更準確地說:這 244 MB 的交換空間分別在哪裡消耗?
儲存在
tmpfs
基於文件系統的文件可能正在使用它們(tmpfs
首先使用 RAM 作為後端,但為了不浪費 RAM,可以分頁到未主動使用的交換區域塊)。檢查輸出:
df -ht tmpfs
這
/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
的輸出在我的情況下似乎並沒有太多