28GB RAM과 2GB 스왑이있는 가상 Linux (Fedora 17) 서버가 있습니다. 서버에서 대부분의 RAM을 사용하도록 설정된 MySQL DB를 실행 중입니다.
일정 시간이 지나면 서버는 스왑을 사용하여 사용되지 않은 페이지를 스왑합니다. 내 스왑이 기본적으로 60이고 예상되는 동작이므로 괜찮습니다.
이상한 점은 top / meminfo의 숫자가 프로세스의 정보와 일치하지 않는다는 것입니다. 즉, 서버가 다음 번호를보고합니다.
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
/server//a/423603/98204 의 스크립트를 사용하면 합리적인 수 (bash와 systemd 등으로 스왑 된 MB가 거의 없음)와 MySQL에서 하나의 큰 할당이 표시됩니다 (많은 출력 행을 생략했습니다) ) :
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
따라서 스크립트 출력을 올바르게 받으면 총 스왑 사용량은 449264K = ca입니다. ca를 사용하는 mysql의 경우 440MB 스왑의 90 %
문제는 이것이 왜 최상위 숫자와 meminfo 숫자와 크게 다른가? 모든 프로세스에서 스왑 사용량을 합산하는 대신 스왑 정보를 “덤프”하여 실제로 무엇이 있는지 확인하는 방법이 있습니까?
문제를 분석 할 때 다른 아이디어를 생각해 냈지만 모두 잘못된 것 같습니다.
- 스크립트 출력이 KB가 아닙니다. 512 또는 4KB 단위 일지라도 일치하지 않습니다. 실제로 비율 (1200 : 440)은 “이상한”숫자 인 약 3 : 1입니다.
- /server//a/477664/98204에 언급 된대로 프로세스간에 공유되는 일부 페이지가 스왑에 있습니다 . 이것이 사실이라면 이와 같이 사용 된 실제 메모리 수를 어떻게 찾을 수 있습니까? cca 800MB의 차이를 만들어야한다는 것을 의미합니다. 그리고이 시나리오에서는 제대로 들리지 않습니다.
- 이미 완료된 프로세스에서 사용 된 스왑에 “이전”페이지가 있습니다. 나는이 “자유로운”스왑이 얼마인지 알아낼 수 있다면 괜찮을 것입니다.
- 스왑의 페이지가 메모리로 다시 스왑되고 RAM에서 변경되지 않고 /server//a/100636/98204에 언급 된대로 다시 스왑해야하는 경우를 대비하여 스왑중인 페이지가 있습니다 . 그러나 SwapCached 값은 24MB에 불과합니다.
이상한 점은 스왑 사용량이 천천히 증가하는 반면 스크립트의 합계 출력은 거의 같습니다. 지난 3 일 동안 사용 된 스왑은 1100MB에서 현재 1230MB로 증가한 반면 합계는 430MB에서 현재 449MB (ca)로 증가했습니다.
서버에 사용 가능한 RAM이 충분하므로 스왑을 껐다가 다시 켤 수 있습니다. 또는 swappiness를 0으로 설정하여 스왑이 다른 방법이 아닌 경우에만 사용되도록 할 수 있습니다. 그러나 문제를 해결하거나 적어도 원인의 원인을 찾고 싶습니다.
답변
Fedora 18 이상 smem
은 repos에 있습니다. 파이썬 스크립트를 다운로드하고 source 에서 설치할 수 있습니다 .
내 컴퓨터의 샘플 출력 (약간 스니핑 및 익명 처리)은 다음과 같습니다.
# smem -s swap -t -k -n
PID User Command Swap USS PSS RSS
20917 1001 bash 0 1.1M 1.1M 1.9M
28329 0 python /bin/smem -s swap -t 0 6.3M 6.5M 7.4M
2719 1001 gnome-pty-helper 16.0K 72.0K 73.0K 516.0K
619 0 @sbin/mdadm --monitor --sca 28.0K 72.0K 73.0K 248.0K
[big snip]
32079 42 gnome-shell --mode=gdm 41.9M 1.9M 2.0M 5.0M
32403 1001 /opt/google/chrome/chrome - 43.1M 118.5M 119.4M 132.3M
4844 1002 /opt/google/chrome/chrome 48.1M 38.1M 41.9M 51.9M
5411 1002 /opt/google/chrome/chrome - 54.6M 33.4M 33.5M 36.8M
5624 1002 /opt/google/chrome/chrome - 72.4M 54.9M 55.5M 65.7M
24328 1002 /opt/Adobe/Reader9/Reader/i 77.5M 1.9M 2.0M 5.2M
4921 1002 /opt/google/chrome/chrome - 147.2M 258.4M 259.4M 272.0M
-------------------------------------------------------------------------------
214 14 1.1G 1.1G 1.2G 1.7G
소스는 또한 smemcap
smem을 나중에 실행할 수 있도록 모든 관련 데이터를 저장하는 기능 을 제공 합니다.
To capture memory statistics on resource-constrained systems, the the smem source includes a utility named smemcap. smemcap captures all /proc entries required by smem and outputs them as an uncompressed .tar file to STDOUT. smem can analyze the output using the --source option. smemcap is small and does not require Python.
답변
내 시스템에 올바른 스왑 사용량이 표시되므로 다른 컴퓨터에서이 스크립트를 확인해야합니다.
# Your_script.sh
111280 Total Swap Used
# free
Swap: 33551716 120368 33431348
매우 가까이 111280 ~ = 120368.
또한이 스크립트를보십시오 :
/ proc / *의 proc; cat $ proc / smaps 2> / dev / null | awk ‘/ Swap / {swap + = $ 2} END {print swap “\ t’
readlink $proc/exe
‘”}’; 완료 | 정렬 -n | awk ‘{total + = $ 1} / [0-9] /; END {인쇄 총 “\ tTotal”}’
이 스레드에서 :
/unix/71714/linux-total-swap-used-swap-used-by-processes