これは問題ではなく、おそらく正常です。大量のコード(およびおそらくデータ)が使用されることはほとんどないため、システムはそれをスワップアウトしてメモリを解放します。
スワップは、メモリが継続的にスワップインおよびスワップアウトされる場合にのみ問題になります。パフォーマンスが低下し、システムの他の場所に問題があることを示唆するのは、この種のアクティビティです。
スワップアクティビティを監視する場合は、いくつかのユーティリティを使用できますが、通常はvmstat
が非常に便利です。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 348256 73540 274600 0 0 1 9 9 6 2 0 98 0 0
0 0 0 348240 73544 274620 0 0 0 16 28 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 29 33 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 21 23 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 24 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 23 23 0 0 100 0 0
システムが起動してからのアクティビティであるため、最初の行は無視してください。 ---swap--
の下のsi
列とso
列に注意してください。ほとんどの場合、これらの値は一般に0ではないにしてもかなり小さい値である必要があります。
また、このプリエンプティブスワッピングはカーネル設定で制御できることにも言及する価値があります。 /proc/sys/vm/swappiness
のファイルには、メモリをスワップアウトする方法をカーネルに指示する0〜100の数値が含まれています。ファイルを猫にして、これが何に設定されているかを確認します。デフォルトでは、ほとんどのLinuxディストリビューションのデフォルトは60ですが、メモリが使い果たされる前にスワッピングを見たくない場合は、次のように0をファイルにエコーします。
echo 0 >/proc/sys/vm/swappiness
これを追加することで永続的にすることができます
vm.swappiness = 0
/etc/sysctl.conf
へ。
Linuxは、何もすることがない場合、先制的にディスクにページを書き込みます。 notは、これらのページをメモリから追い出すことを意味します。 must将来これらのページを削除する場合に備えて、ページがすでにそこにあるため、ディスクに書き込まれるのを待つ必要はありません。
結局のところ、メモリが不足している理由は、おそらくあなたのマシンはすでに一生懸命働いているからであり、スワッピングでさらに負荷をかけたくないでしょう。マシンが何も実行していないときにスワッピングを実行することをお勧めします。
同様の理由で、メモリは常にいっぱいでなければなりません。メモリページ、ファイルシステムキャッシュ、tmpfs
、メモリに保持できるものはたくさんあります。本当に、あなたの記憶が空かどうか気にする必要があります。結局のところ、あなたはそれに対して多額のお金を払ったので(少なくとも同じ量のディスク容量と比較して)、それを使うほうが良いのです!
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
6 0 521040 114564 6688 377308 8 13 639 173 0 1100 5 4 90 0
1 0 521040 114964 6688 377448 0 0 256 0 0 1826 3 4 94 0
0 0 521040 115956 6688 377448 0 0 0 0 0 1182 7 3 90 0
0 0 521036 115992 6688 377448 4 0 16 0 0 1154 10 2 88 0
3 0 521036 114628 6696 377640 0 0 928 224 0 1503 15 17 67 1
swapd列はまったく問題ありません。列のゼロ以外の値siおよびsoはサーバーのパフォーマンスに致命的です。特にRAMがたくさんあるもの。
数GBのRAMを搭載したマシンでは、スワップインを無効にするのが最善です。
sysctl -w vm.swappiness=0
これはスワップを無効にしません。最後の手段としてスワップを使用するようにLinuxに指示するだけです。これは、RAMにある必要のない数MBのプログラムを無駄にします...しかし、ディスクアクセスキューを膨らませてスワップすることをお勧めします。
20年前、大きな486には32MbのRAMしかなかったことを思い出しました。スワップアルゴリズムは、RAMをほんの数秒でディスクに移動できるようになったときに開発されました。その時間の遅いディスクを使用していてもです。そのため、デフォルトのスワップポリシーは非常に積極的です。= RAMは当時のボトルネックでした。それ以来、RAMサイズは10,000倍を超え、ディスク速度は10倍未満に増加しました。これにより、ボトルネックがディスク帯域幅にシフトしました。
Siおよびsoトン数RAMのマシンでのアクティビティは致命的です。これは、システムがRAMを求めて自分自身と戦っているということです。ディスク、大きなストレージでもRAMと比較すると遅すぎます。アグレッシブスワップは、アプリケーションデータよりもカーネルディスクキャッシュを優先し、RAMを争う最も一般的な原因です。OSはすべてのディスクキャッシュを解放する必要があるため、si、スワップが提供する追加のキャッシュの存続時間は非常に短いため、とにかく有用ではありません。その結果、おそらく使用されないキャッシュを格納するためにディスクの帯域幅を使用し、プログラムを一時停止します- si pages。重要なリソースを大量に消費し、アプリケーションにほとんどまたはまったくメリットがないことを意味します。
応答のタイトル「大量のRAMを持つサーバーでの多くのスワップアクティビティ」に注意してください。これは、時々siなどのアクティビティが発生するマシンには適用されません。よりスマートなスワップアルゴリズムがOSで開発されている場合、これは将来適用されない可能性があります。
人々はスワッピングアルゴリズムをロマンチックにします。 「RAMの使用ページが少ない」と言う人もいますが、これはカーネルが行うこととはまったく異なります。スワップについて理解するのが難しいのは、カーネルが「コールドページ」が何であるかを知らないことです。カーネルには、ページが使用されているか、近い将来使用される可能性があるかどうかを判断するための適切なメトリックがありません。カーネルがページをスワップに多かれ少なかれランダムに配置し、不要なページがそこに留まることを回避するため。そのアルゴリズムの問題は、ページがアプリケーションに必要かどうかを知るために、ページがスワップに移動する必要があることです。そして、これは多くの「ホット」ページがスワップに行くことを意味します。その問題は、RAMに比べてディスクが遅すぎることです。その結果、スワッピングが開始されると、すべてのアプリケーションがディスクを待機するランダムな一時停止を取得し、これがレイテンシとスループットの妨げになります。
適切な量の多くのアプリケーションに非常に一般的な現実的なシナリオである、独自のベンチマークを作成しました。私のテストでは、スワップが使用されているときのスループットやレイテンシへのメリットはありませんでした。それから遠い。スワッピングが始まると、スループットとレイテンシの両方が少なくとも1桁遅くなります。
これについてもう少し詳しく説明します。スワップは処理用ではないことを理解しています。スワップは緊急時のみです。同時に実行しているアプリケーションが多すぎてメモリスパイクが発生する瞬間。スワップがないと、メモリ不足エラーが発生します。スワップの使用は、開発チームと本番チームの失敗と考えています。これは、私たちがここで議論したことをはるかに超える意見ですが、私はそう思います。もちろん、私のアプリケーションはそれ自体で優れたメモリ管理を備えています。
これはあなたの質問に対する答えではありません。むしろ、情報に基づいた決定を行うために役立つ追加情報です。
具体的にどのプロセスがどのくらいのスワップを使用しているかを知りたい場合は、小さなシェルスクリプトを次に示します。
#!/bin/bash
set -o posix
set -u
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
SUM=0
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"
また、tmpfsもスワップアウトすることを追加する必要があります。これは、tmpfsを使用してユーザー空間の/ tmpオーバーレイを作成するsystemdを使用する最近のLinuxシステムではより一般的です。
エージェントが頻繁に入れ替わると、MySQL Clusterのレプリケーションが遅くなったり失敗したりすることに気づきました。たぶん、一部のアプリケーションは気にしない、またはいくつかのスワッピングから利益を得ることさえあるかもしれませんが、データベースは実際にそれに苦しんでいるようです。しかし、私がフォーラムで見た多くのディスカッションは、特定のワークロードのディスカッションからデコンテクスト化されたスワップについて話し合っています。
DBAの世界では、コンセンサスは「MySQL(または実際には他のDBMS)を実行しているとき、スワップスペースにI/Oを表示したくないというのは常識です。キャッシュサイズのスケーリング( MySQLの場合はinnodb_buffer_pool_size)は、十分な空きメモリがあることを確認してスワップが不要であることを確認するための標準的な方法です。
しかし、間違いや計算ミスがあり、スワッピングが発生した場合はどうなりますか?それは実際にパフォーマンスにどの程度影響しますか?これはまさに私が調査に着手したものです。 」
読者が以下のリンクを適切に見つけられることを願っています。
https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/
https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/