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으로 설정하여 스왑이 다른 방법이 아닌 경우에만 사용되도록 할 수 있습니다. 그러나 문제를 해결하거나 적어도 원인의 원인을 찾고 싶습니다.