Linux-Kernel

什麼在使用我的交換空間?

  • October 21, 2021

在 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的輸出在我的情況下似乎並沒有太多

引用自:https://unix.stackexchange.com/questions/456559