![什么在使用我的交换空间?](https://linux22.com/image/136920/%E4%BB%80%E4%B9%88%E5%9C%A8%E4%BD%BF%E7%94%A8%E6%88%91%E7%9A%84%E4%BA%A4%E6%8D%A2%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
在 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 的交换空间消耗在哪里?
答案1
我如何知道 Linux 系统上哪个进程正在使用我的交换空间?
交换空间不一定由特定进程使用。
更准确地说:这 244 MB 的交换空间消耗在哪里?
存储在基于文件系统上的文件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'