Linux: 사용된 총 스왑 공간 = 프로세스에서 사용된 스왑 공간 +?

Linux: 사용된 총 스왑 공간 = 프로세스에서 사용된 스왑 공간 +?

그래서 저는 스왑 사용량이 높은 시스템에서 스왑 사용량이 어디에서 발생하는지 조사해 보았습니다.

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

각 프로세스에서 사용하는 스왑 공간을 추가합니다.

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

이는 사용된 총 교환에 대해 더 낮은 가치를 제공합니다. 사용된 남은 스왑 공간은 어디에 있나요? 커널에 vmalloc() 메모리가 있습니까? 다른 건 없나요? 어떻게 식별할 수 있나요?

메모리 정보 출력:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

답변1

관찰한 차이점은 실제로 스왑 공간을 고려하지 않았기 때문이 아닙니다. 커널이 때때로 링크에 추가하는 /proc/*/exe"(제거됨)"은 awk 스크립트에 의해 출력되고 readlinkawk 스크립트에서 구문 분석 오류를 일으키며 실제로 바이너리가 더 이상 전체에 존재하지 않는 프로세스를 계산하지 않습니다.

/proc/*/exe일부 커널은 프로세스의 원래 실행 파일이 더 이상 존재하지 않을 때 심볼릭 링크 대상에 "(제거됨)"이라는 단어를 추가합니다.

명령이 총계보다 적게 표시되는 이유는 바로 이 때문입니다. 이러한 링크의 출력은 readlink"/path/to/bin (제거됨)"과 같으며, awk출력을 다시 문자열로 바꿀 때 구문 분석 오류가 발생합니다(대괄호와 공백을 좋아하지 않음). 예를 들어 다음을 수행합니다.

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

"(삭제됨)"이 추가된 일부 항목이 표시됩니다. 이러한 항목의 스왑 사용량을 살펴보면 결과 awk오류로 인해 총계가 계산되어 최종 총계에 포함되지 않기 때문에 총계는 표시되는 차이와 일치합니다.

stderr를 어디로든 리디렉션하지 않고 원래 명령을 실행하면 "런어웨이 문자열 상수" 오류가 나타날 수 있습니다. 이러한 오류는 위에서 언급한 이유로 인해 발생하므로 무시해서는 안 됩니다.

원래 명령에 대한 다른 잠재적인 개선 사항을 무시하고 다음과 같이 "(제거됨)"을 제거하여 수정할 수 있습니다( 출력 |awk '{print $1}'에 주석이 추가됨 ).readlink

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

이름에 공백이 포함되어 있으면 수정을 사용한 출력이 중단될 수 있습니다 awk. 원하는 방법을 사용할 수 있습니다.readlinksed

보너스 정보

그런데 smem -t"swap" 열을 사용하여 원하는 것을 표시할 수 있습니다.

그러나 직접 계산하는 경우에는 필드에서 VmSwap이 정보를 더 직접적으로 얻을 수도 있고 /proc/*/status(스맵에는 일부 커널 지원이 필요하며 항상 사용할 수 있는 것은 아님) 적절한 파일 이름 패턴을 사용하여 오류 출력을 리디렉션하는 것을 피할 수도 있습니다.

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

실제 바이너리가 필요하지 않고 프로세스 이름만 처리할 수 있는 경우 다음을 얻을 수 있습니다.모든 것에서 status:

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

마지막으로 PID만 가지고 있으면 충분하다면 다음을 사용하여 모든 작업을 수행할 수 있습니다 awk.

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

노트:

free이제 이것은 와 사이에 차이가 없다고 말하는 것이 아닙니다 smem(후자는 스크립트와 동일합니다). 여러 가지가 있습니다(예를 들어 다음을 참조하세요.https://www.google.com/search?q=smem+free, 첫 번째 페이지의 결과는 메모리 사용량에 대한 질문에 답하기에 충분합니다. 그러나 적절한 테스트 없이는 특정 상황을 해결할 방법이 없습니다.

답변2

tmpfs는 또한 커널에 더 많은 여유 메모리가 필요하거나 단순히 한동안 사용되지 않았기 때문에 스왑을 사용하므로 모든 tmpfs 사용은 스왑을 소비할 수 있습니다.

관련 정보