Debian Linux 3.16 시스템에서는 244MB의 스왑 공간을 사용합니다.
# 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'