Linuxスワップを使用しているもの、またはスワップ内にあるものを見つける方法


12

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

しばらくすると、サーバーはスワップを使用して未使用のページをスワップアウトし始めます。私の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

/server//a/423603/98204のスクリプトを使用すると、妥当な数(bash'es、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になります。caを使用したmysqlで440MB。スワップの90%。

問題は、これがtopおよび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(約)に増加しました。

サーバーには十分な空き(使用可能な)RAMがあるため、スワップをオフにしてからオンに戻すことができます。または、swappinessを0に設定して、他に方法がない場合にのみスワップが使用されるようにすることもできます。しかし、私は問題を解決するか、少なくともこの原因を見つけたいと思います。


あなたが言うように、vm.swappiness = 0(または1)とswapoff && swaponを設定する必要があります
HTTP500

しかし、それは問題を解決しません。私はスワップは、私が60に戻ってswappinesを設定するか、私は0または1でそれを維持した場合(サーバーのメモリが消灯しない限り)すべてで使用されない場合は、再び増加し始めるだろうと想定しています
ラデクHladík

DBサーバーの場合は、緊急時にのみスワップを使用する必要があるため、常に0(または1)に設定する必要があります。
HTTP500

それは本当であり、おそらくこの問題の原因が見つからない場合に私がやろうとしていることです...一方、非常に散発的に使用されるサーバー上に小さなDBがたくさんあり、私はそれらのアイデアが好きでした彼らが使用されていないときにシステムによってスワップアウト...しかし、私は... MySQLが独自にそれを処理できるようになることを想定
ラデクHladík

Mysqlは独自のキャッシュを管理する上でかなり良い仕事をしていますが、それは実際にメモリにあるものとそうでないものに関する仮定に基づいています。スワップメモリ​​を使用してそれを二重推測しようとすると、キャッシュする必要があるものとそうでないものを決定するmysqlの機能を損なっているだけです。スワップをオフにします。スワップをヒットした場合、それはチューニングの失敗です。スワップが発生しないようにキャッシュサイズを調整しますが、それ以外の場合は、使用可能なすべての物理メモリを使用します。
mc0e

回答:


9

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.

1
F17レポからSMEMは、ワーク(空のリストを示した)しなかったが、ソースからの1つが働いてトップショーが使用1191224kながら、他:-) 392.6Mの合計のうちのMySQL 358.1Mとほぼ同じ数値を示している
ラデクHladík

4

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

# 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'"}'; 完了| sort -n | awk '{total + = $ 1} / [0-9] /; END {print total "\ tTotal"}'

このスレッドから:

/unix/71714/linux-total-swap-used-swap-used-by-processes


上記のスクリプトは同じ結果を返しています... 364920 / usr / libexec / mysqld 400372合計
RadekHladík13年

私は非常に低いスワップの使用量(50メガバイト)で、他のサーバー上でスクリプトを試したとき、それは合計でCCAの72メガバイトを報告:-)私は後でいくつかの非本番サーバー上でシミュレートする必要があります...
ラデクHladík
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.