[server] 리눅스 스왑을 사용하거나 스왑에 무엇이 있는지 찾는 방법은 무엇입니까?

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 숫자와 크게 다른가? 모든 프로세스에서 스왑 사용량을 합산하는 대신 스왑 정보를 “덤프”하여 실제로 무엇이 있는지 확인하는 방법이 있습니까?

문제를 분석 할 때 다른 아이디어를 생각해 냈지만 모두 잘못된 것 같습니다.

  1. 스크립트 출력이 KB가 아닙니다. 512 또는 4KB 단위 일지라도 일치하지 않습니다. 실제로 비율 (1200 : 440)은 “이상한”숫자 인 약 3 : 1입니다.
  2. /server//a/477664/98204에 언급 된대로 프로세스간에 공유되는 일부 페이지가 스왑에 있습니다 . 이것이 사실이라면 이와 같이 사용 된 실제 메모리 수를 어떻게 찾을 수 있습니까? cca 800MB의 차이를 만들어야한다는 것을 의미합니다. 그리고이 시나리오에서는 제대로 들리지 않습니다.
  3. 이미 완료된 프로세스에서 사용 된 스왑에 “이전”페이지가 있습니다. 나는이 “자유로운”스왑이 얼마인지 알아낼 수 있다면 괜찮을 것입니다.
  4. 스왑의 페이지가 메모리로 다시 스왑되고 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

소스는 또한 smemcapsmem을 나중에 실행할 수 있도록 모든 관련 데이터를 저장하는 기능 을 제공 합니다.

   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


답변