web-dev-qa-db-ja.com

linux swapを使用しているもの、またはswapに含まれているものを見つける方法は?

28GB RAMおよび2GBのスワップを備えた仮想Linux(Fedora 17)サーバーがあります。サーバーは、ほとんどのRAMを使用するように設定されたMySQL DBを実行しています。

しばらくすると、サーバーはswapを使用して不要なページをスワップアウトし始めます。私のswappinessはデフォルトで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

https://serverfault.com/a/423603/98204 のスクリプトを使用すると、妥当な数(bashやsystemdなどによってスワップされたMBが少ない)とMySQLからの1つの大きな割り当て(多くの出力行を省略しました):

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になります。 mysqlでcaを使用して440MB。スワップの90%。

問題は、なぜこれがトップおよびmeminfoの数値と大きく異なるのかということです。すべてのプロセスからのスワップ使用量を合計する代わりに、スワップ情報を「ダンプ」して実際に何が含まれているかを確認する方法はありますか?

問題を分析したとき、私はさまざまなアイデアを思いつきましたが、それらはすべて間違っているようです:

  1. スクリプトの出力はKBではありません。 512または4KB単位であっても、一致しません。実際には、比率(1200:440)は約3:1であり、これは「奇妙な」数値です。
  2. https://serverfault.com/a/477664/98204 に記載されているように、スワップ間で何らかの方法でプロセス間で共有されているページがあります。これが本当である場合、どのようにしてこのように使用されたメモリの実際の数を見つけることができますか?つまり、約800MBのccaを作成する必要があります。そして、それはこのシナリオでは正しく聞こえません。
  3. スワップには、すでに終了したプロセスによって使用される「古い」ページがいくつかあります。この「解放可能な」スワップがどれだけあるかを知ることができれば、私は気にしません。
  4. RAMで変更されておらず、 https: //serverfault.com/a/100636/98204 。ただし、SwapCachedの値は24MBのみです。

奇妙なことに、スクリプトからの合計出力はほぼ同じであるにもかかわらず、スワップの使用率がゆっくりと増加しています。過去3日間で、使用されたスワップは1100MBから現在の1230MBに増加し、合計は430MBから現在の449MB(約)に増加しました。

サーバーには十分な空き容量がありますRAMなので、スワップをオフにしてからオンに戻すことができます。または、スワップを0に設定して、他に方法はありませんが、問題を解決するか、少なくともこの原因を特定したいと思います。

12
Radek Hladík

Fedora 18以降のリポジトリにはsmemがあります。 pythonスクリプトをダウンロードして 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.
9
rickhg12hs

私のシステムは正しいスワップの使用法を示しているので、別のマシンでこのスクリプトを確認する必要があります。

# 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 {print total"\tTotal "}'

このスレッドから:

https://unix.stackexchange.com/questions/71714/linux-total-swap-used-swap-used-by-processes

4
strand