質問: mysqlが動いているdbサーバでのswapの使い方について質問します 50GBのメモリが搭載されているサーバで、swap領域は4GBに設定されています。 このサーバでalterなどをクエリ実行した後に、使われるswap領域が500MB⇒2.2GBまで増加しました swapが使われているのですが、実際のメモリ空きは25GB程度あります 私の中では、物理メモリいっぱいまで使われた時に初めてswap領域が使われる事になるのかと 思っていますが、25GB程度のメモリ空きがあるのにswap使われた原因がよくわかりません そこで、4点ほど質問します 冗長となりますがよろしくお願いします --- * 1. システム領域でのメモリ空きがあるのに、swapが使われた理由は、 msyql側に割り当てられたメモリが足りなかった事でswapが使われたと考えていいでしょうか --- * 2. alterクエリ発行作業が完了後、vmstatコマンドsoの値は0です。 クエリ作業にあたってswap outが使われたならが、swap領域が解放されていくと思うのですが、 swapのused領域は解放されていきません 使われたswap領域は解放していかないのでしょうか --- * 3. そもそも、物理メモリ50GBに対して4GBのswap領域しか割り当てていない事も少しは問題があるのかと思いますが、 10年前のように、物理メモリの2倍をswap領域に割り当てる事が今も推奨されていると考えていいのでしょうか https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-swapspace.html#s1-swap-what-is を見ると、 > > Swap は、物理 RAM サイズが 2 GB までは、物理 RAM の2倍として、2 GB を超えると、1物理 RAM ごとに同量を追加します > > > とあります。みなさんも運用しているサーバで2×2+物理メモリ量をswapに割り当てているのでしょうか --- * 4. swap領域を8GBまで拡張したところ、拡張前後のfreeコマンド結果を確認したところ、 Mem: usedの値が拡張後に6GB程度増加しました。 拡張後にmemory used領域が増加した理由は何が考えられるのでしょうか ▼拡張前 ``` [root@abc ~]# free -m total used free shared buffers cached Mem: 50319 40420 10899 0 153 3770 -/+ buffers/cache: 36495 15824 Swap: 4095 2253 1842 ``` ▼拡張後 [root@abc ~]# free -m total used free shared buffers cached Mem: 50319 46123 4096 0 154 7426 -/+ buffers/cache: 36542 15777 Swap: 8191 2253 5938
回答: > > 私の中では、物理メモリいっぱいまで使われた時に初めてswap領域が使われる事になるのかと > > 思っていますが、25GB程度のメモリ空きがあるのにswap使われた原因がよくわかりません > > > まずここが誤りです。 一次ソースがすぐに見つからなかったので提示出来なくて申し訳ないのですが、 使用頻度の低いメモリ上のデータについてメモリが余っていてもswapに退避されることがあります。 > > 1. > > システム領域でのメモリ空きがあるのに、swapが使われた理由は、 > > msyql側に割り当てられたメモリが足りなかった事でswapが使われたと考えていいでしょうか > > > MySQLから見た場合は割り当てられたメモリはあくまで仮想メモリ(物理+swap)であり、 割り当てられたメモリ上限を超えた分をswapで賄うというようなことは発生しません。 「割り当てたメモリ上限」の設定に誤解があり、実は使用メモリが物理メモリを超えていたという事はありえると思います。 > > 2. > > alterのクエリ作業にあたってswap outが使われたなら、当該作業が完了後、vmstatコマンドsoの値は > > 0なのですが、swap領域が解放されていくと思うのですが、swapのused領域は解放されていきません > > 使われたswap領域は解放していかないのでしょうか > > > swapはOSがいい感じのタイミングで開放するか、明示的に開放するまでは解放されなかったと思います。 MySQLから見た場合、swapを使ったかどうかは意識されないので処理が終わった直後に開放されるかどうかはOS次第です。 > > 3. > > そもそも、物理メモリ50GBに対して4GBのswap領域しか割り当てていない事も少しは問題があるのかと思いますが、 > > > 私の場合は50GBのメモリを積むサーバであれば、そもそもswap-outが発生しないようにチューニングするので、その倍の100GBのswapを確保するようなことは無いかと思います。 何らかの理由でチューニングが不可能であれば、出来るだけ高速なストレージをswapとして用意するしかないでしょうね。 > > 4. > > swap領域を8GBまで拡張したところ、拡張前後のfreeコマンド結果を確認したところ、 > > Mem: usedの値が拡張後に6GB程度増加しました > > > わかりません。が、そもそもUsedは バッファキャッシュやページキャッシュなどOSがディスクキャッシュのために使用しているメモリも含まれる数値なので、メモリの直接の空き容量ではありません。 自由に使えるメモリ量としてはfreeが妥当に近い(カーネル3.14および2.6.27以降のfreeで表示されるavailableの方が正確)で、こちらはあんまり変わっていないので、OSが気を利かせて何かキャッシュしてくれた可能性が高いと思われます。