40GB近くの空きメモリがあるホストでスワップが使用されていることを心配する必要がありますか?


39

以下に実稼働ホストがあります。

htop

システムは1GBのスワップを使用し、40GB近くの空き未使用メモリスペースを維持しています。これについて心配する必要がありますか、それともほとんど正常ですか?


23
実際には、実負荷が40GB近くのメモリを浪費している本番ホストについて心配する必要があります。確かに、そのメモリを使用する用途を見つけることができます-アプリケーションはディスクにアクセスしていますが、そのメモリを使用してそのデータの一部をキャッシュし、I / Oを減らし、パフォーマンスを向上させることはできませんか?作業中のマシンで40GBのメモリが無駄になっているのはなぜですか?それはあなたが心配すべきことです。それは普通ではありません。
デビッドシュワルツ

25
あなたが私たちにの出力を示したなら、それは本当にもっと役に立つでしょうfree -m。グラフィックは読みにくいです。
user9517はGoFundMonica

@DavidSchwartz-関連する質問がありますが、それについてはまだアクティブです。serverfault.com/questions/825909/...
MrDuk

回答:


68

これは問題ではなく、おそらく正常です。多くのコード(および場合によってはデータ)が使用されることはほとんどないため、システムはそれをスワップアウトしてメモリを解放します。

スワップは、メモリが継続的にスワップインおよびスワップアウトされている場合にのみ問題になります。パフォーマンスを低下させ、システム上の他の場所に問題を示唆するのは、そのようなアクティビティです。

スワップアクティビティを監視する場合は、いくつかのユーティリティを使用できますが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

最初の行はシステムが起動してからのアクティビティであるため、無視してください。siとのso下の列に注意してください---swap--。ほとんどの場合、それらは0でない場合、通常はかなり小さい数字である必要があります。

また、言及する価値があるのは、このプリエンプティブスワッピングはカーネル設定で制御できることです。ファイルが/proc/sys/vm/swappinessメモリをスワップアウトする方法積極的にカーネルに指示します0〜100の数値が含まれています。ファイルをcatして、これが何に設定されているかを確認します。デフォルトでは、ほとんどのLinuxディストリビューションのデフォルトは60ですが、メモリが枯渇する前にスワッピングを表示したくない場合は、次のようにファイルに0をエコーし​​ます。

echo 0 >/proc/sys/vm/swappiness

これを追加することにより永続的にすることができます

vm.swappiness = 0

/etc/sysctl.conf


14
また、言及する価値があるのは、このプリエンプティブスワッピングはカーネル設定で制御できることです。/ proc / sys / vm / swappinessのファイルには0〜100の数値が含まれており、カーネルにメモリをどれだけ積極的にスワップアウトするかを指示します。ファイルをcatして、これが何に設定されているかを確認します。デフォルトでは、ほとんどのLinuxディストリビューションのデフォルトは60ですが、メモリが使い果たされる前にスワッピングを表示したくない場合は、次のようにファイルに0をエコーし​​ますecho 0 >/proc/sys/vm/swappiness。これはvm.swappiness = 0、/ etc / sysctl.confに追加することで永続的にできます。
virtex

@virtex:デスクトップでswappiness = 1、または10未満の値を使用するのが好きです。それはほとんどの場合、サーバーでもうまくいくかもしれません。スワップを完全に禁止することなく、より多くのページキャッシュのためにRAMを解放することを強く推奨します。
ピーターコーデス

1
@PeterCordesサーバー、特にデータベースにアクセスしたりファイルを提供するサーバーには注意してください。これらは、メモリがファイルキャッシュで利用可能になることで多くのメリットを得ることができます。
ジョナスシェーファー

4
@JonasWielicki:swappiness=7何かがあったとしても、長期間使用されていないページはスワップアウトされます。swappiness=0他の値と、低い値との間には大きな違いがあります。kernel-default swappiness=60は一般的にサーバーに適しています。また、swapnessが低いデスクトップ対話型の使用にのみ適しています。ただし、7に設定するか、何かを設定してもそれほど害はありません。(しかし、私はチェックしていません、私はサーバーのシステム管理者ではありません)。
ピーター・コーデス

2
@PeterCordesメモリーのプレッシャーをかけるまで、すべてうまくいきますswappiness。プレッシャーがかかると、長時間にわたってswappiness=7ファイルキャッシュがほぼ完全に枯渇しswappiness=60、多くのキャッシュが清算される一方で、数秒以内にスワップアウトが開始されることがわかります。ビートを取るのは依然としてキャッシュですが、よりバランスの取れた方法です。
クバンチク

25

Linuxは、それ以上実行する必要がない場合、ページをディスクに先取りして書き込みます。ただし、これらのページがメモリから削除されるわけではありませ。それは場合にはそれだけであることですしなければならない、彼らはすでに存在しているので、将来的にそれらのページを追い出し、それは、彼らがディスクに書き込まれるのを待つ必要はありません。

結局のところ、メモリが不足している理由は、おそらくマシンがすでに一生懸命に動作しているためであり、スワップに追加の負荷をかけたくないためです。マシンが何もしていないときにスワッピングを行う方が良い。

同様の理由で、あなたの記憶は常に一杯でなければなりません。メモリページ、ファイルシステムキャッシュ、tmpfsなど、メモリに保持できるものはたくさんあります。本当に、あなたの記憶が空かどうか心配する必要があります。結局、(少なくとも同じディスク容量と比較して)それに多額のお金を払ったので、それはより良く使われます!


カーネルがプリエンプティブにディスクに書き込むページはスワップページではなく、ダーティディスクキャッシュページです。vm.dirty_background _...チューナブルはそれを制御します。スワップアウトアクティビティは、交換可能なスワップに従って開始され、アイドル時間を待機しません。
ルーカス

11

使用されるスワップは悪くありませんが、多くのスワップアクティビティは

  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

列のスワップはまったく問題ありません。列の非ゼロ値は、SIそのサーバーのパフォーマンスに致命的です。特に、RAMが大量にあるもの。

数GBのRAMを搭載したマシンでスワップインを無効にするのが最適です。

sysctl -w vm.swappiness=0

これはスワップを無効にしません。Linuxに最後の手段としてスワップを使用するよう指示するだけです。これにより、RAMに格納する必要のないプログラムが数MB無駄になります...しかし、ディスクアクセスキューの肥大化をスワップすることをお勧めします。

編集1:swappinessのデフォルト値が最適ではない理由

20年前、大きな486には32MbのRAMしかなかったことを思い出しました。スワップアルゴリズムは、RAM全体をほんの数秒でディスクに移動できるときに開発されました。その当時の遅いディスクでも。そのため、デフォルトのスワップポリシーは非常に積極的です。RAMは当時のボトルネックでした。それ以降、RAMサイズは10,000倍以上に増加し、ディスク速度は10倍未満になりました。これにより、ボトルネックがディスク帯域幅にシフトしました。

編集2:なぜこれほど活動がサーバーにとって致命的であるのか?

シリコンなるよう RAMのトンとマシン上の活動が致命的であることを意味するため、システムはRAMのために自分自身と戦っています。起こることは、RAMと比較した場合、ディスク、さらには大きなストレージであっても遅すぎるということです。アグレッシブスワップは、アプリケーションデータよりもカーネルディスクキャッシュを優先し、RAMを奪う最も一般的なソースです。OSはsiごとにディスクキャッシュを解放する必要があるため、swapが提供する余分なキャッシュの有効期間は非常に短いため、とにかく有用ではありません。その結果、おそらく使用されないキャッシュを保存するためにディスク帯域幅を使用し、siページを待機しているプログラムを一時停止します。多くの重要なリソースを消費し、アプリケーションにほとんどまたはまったく利益をもたらさないという意味。

応答のタイトル「大量のRAMを備えたサーバーでの大量のスワップアクティビティ」に注意してください。これは、時折siなどのアクティビティがあるマシンには適用されません。OSでよりスマートなスワップアルゴリズムが開発されている場合、これは将来適用されない可能性があります。

編集3:「コールド」ページ

スワッピングアルゴリズムはロマンチックです。「RAMの使用ページが少なくて済む」という人もいますが、これはカーネルが行うことではありません。スワップについて理解するのが難しいのは、カーネルが「コールドページ」が何であるかを知らないことです。カーネルには、ページが使用されているか、近い将来使用される可能性があるかを判断するための適切なメトリックがありません。カーネルがページを多少ランダムにスワップに入れ、不要なページがそこに残ることを回避するため。このアルゴリズムの問​​題は、ページがアプリケーションに必要かどうかを知るためにページをスワップする必要があることです。これは、多くの「ホット」ページがスワップに移動することを意味します。それに伴う問題は、ディスクがRAMと比較して非常に遅いことです。

適切な量​​の多くのアプリケーションに非常によくある現実的なシナリオである独自のベンチマークを作成しました。私のテストから、スワップを使用しているときのスループットまたはレイテンシーにメリットはありませんでした。それからはほど遠い。スワップが開始されると、スループットとレイテンシの両方が少なくとも1桁遅くなります。

これについてもう少し詳しく説明します。スワップは処理用ではないことを理解しています。スワップは緊急時のみです。同時に多くのアプリケーションが実行されており、メモリスパイクが発生する瞬間。スワップがないと、メモリ不足エラーが発生します。スワップの使用は、開発チームと運用チームの失敗だと考えています。これは、ここで説明したことをはるかに超える意見ですが、私はそう思っています。もちろん、私のアプリケーションはそれ自体で優れたメモリ管理を備えています。


9
「スワップインネスを無効にするのに最適」最高の理由は?(最良の目的は?)デフォルトはすべての用途に適しているとは限りませんが、それでも変更する理由が必要です。
jpaugh

3
siサーバーにとって致命的なのはどうしてbiですか?どちらも、一部のプログラムが4096バイトがディスクからメモリに読み込まれるのを待っていることを意味します。これbiは、任意のファイルsiからのものであり、特定の狭いカテゴリのファイルからのものです(ただし、それらのバイトはまったく同じパスを高速で移動します)。
クバンチク

2
128MBのRAMを備えた486は非常にまれであり、メインフレームまたはスーパーコンピューターと見なされていました。したがって、CPUは486ではないでしょう。私の古い486は4MBのRAMを持ち、 16〜32 MBのRAMがありました)。Pentiumsに早送りすると、通常どおり8〜16 MBが表示され始めます。Pentium3が最初に登場したとき(CPUが通常1GHzを超えて起動したとき)32MBは正常で、Webサーバーは通常64〜128MBでした。
スリーブマン

swappiness=0サーバーにはまったく不適切なようです。インタラクティブなデスクトップシステムで検討することもできます(ただし、その場合でも、swappiness=1最終的には実際にコールドページをスワップアウトするのに適しています)。別の回答に関するコメントを参照してください。 swappiness=7または、OOMまでコールドページをRAMに固定せずにスワップアクティビティを劇的に削減し60ます。特定のサーバーにとってスワップが多すぎると考える場合は、検討する価値があります。
ピーター

1
@kubanczyk:私siはより悪いと思うbi。ほとんどのサーバーソフトウェアは、ディスクからのI / Oが遅い可能性があるという前提に基づいて設計されており、スレッド、非同期I / O、またはI / Oを待機している間一般に応答性を維持する他の手法を使用します。ページフォールトはどこでも発生する可能性があります。最悪の場合、ロックを取得した後にページフォールトが発生し、他のすべてのスレッドがそのクリティカルセクションに入るのを10ミリ秒間ブロックします(低速の回転ストレージでのスワップを使用)。クリティカルセクションが共有データ構造から潜在的に冷たいページにデータをコピーする場合、それはもっともらしいかもしれません。
ピーター・コーデス

8

これはあなたの質問に対する答えではありません。むしろ、情報に基づいた決定を下すのに役立つ追加情報のみです。

具体的にどのプロセスがどのくらいのスワップを使用しているかを知りたい場合は、ここに小さなシェルスクリプトがあります:

#!/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システムでより一般的です。


素敵なスクリプト。smemもご覧ください。
user9517はGoFundMonicaを

を使用すると、はるかに効率的に(分岐プロセスがはるかに少ない)記述できると思いますawk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps。これは、すべてのプロセスに対してcutとpsを実行し、システム内のすべてのプロセスに対してgrep + awkを数回実行します。
ピーター・コーデス

0

エージェントが頻繁にスワップしていると、MySQL Clusterのレプリケーションが遅くなるか失敗することに気付きました。いくつかのアプリケーションは気にしないかもしれませんし、スワッピングの恩恵を受けるかもしれませんが、データベースは実際にそれで苦しむようです。しかし、私がフォーラムで見た多くの議論は、特定のワークロードの議論から非文脈化されたスワップについて議論しています。

DBAの世界では、コンセンサスは「MySQL(または実際に他のDBMS)を実行しているときは、スワップ空間にI / Oを見たくないという常識です。キャッシュサイズのスケーリング(使用innodb_buffer_pool_size(MySQLの場合)は、スワップが必要ないように十分な空きメモリがあることを確認する標準的な方法です。

しかし、何らかの間違いや計算ミスをして、スワッピングが発生したらどうなるでしょうか?パフォーマンスに実際にどの程度影響しますか?これはまさに私が調査しようとしたものです。」

読者の皆様が次のリンクが適切に見つかることを願っています。

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/


1
サーバー障害へようこそ!これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
フレデリックニールセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.