メモリの管理はサーバ運用における重要なファクターとなっており、サーバが高負荷になったりアプリケーションの不具合があると真っ先に「メモリの残量不足では?」という懸念を抱きます。

管理者がメモリ残量を知るためのLinuxコマンドはtopやfreeがあり、以下のようにいくつかの指標があります。

  1. 物理メモリ(total)
  2. 使用メモリ(Used)
  3. 未使用メモリ(Free)
  4. Swapメモリ(Swap)
  5. キャッシュメモリ(Cached)

この中で未使用メモリが不足していたりSwapメモリの使用量が多いとメモリが不足していると判断しがちですが、そうではない場合があります。

OSやアプリケーション(ミドルウェア)はプログラムを展開したりデータ処理を行うためにメモリ領域を必要としますが、処理上一時的に必要なメモリはキャッシュメモリと区別されます。OSの重要な役割として 一度読み込まれたファイルデータは、またすぐに使用される可能性が高いので自動的にメモリ上にキャッシュしておいてくれます。したがってメモリ残が見かけ上は少なくてもキャッシュメモリとして有効に利用されている可能性があるのです。

またSwapメモリですが、その特性上これが発生していること自体を問題視する判断も実は早計となります。OSは各プロセスが、使用頻度が低いつまり必要が無いのに確保したメモリを一定時間経ったらSwap領域に退避してくれる役割もあります。この"すぐには必要とされないメモリ"は上記のキャッシュメモリより優先順位が低い設計になっているようなのでI/O速度が遅いHDDのSwap領域に追いやられます。PCでも久しぶりに操作したソフトが最初やたら重い状態になったりするのは一旦HDDに退避されたメモリが再度実メモリに展開されるロスの為です。

では何をもって"メモリ不足"と判断すればいいのかということになりますが、これはリアルタイムのSwap(ページング)状況を確認するしかありません。

これを観測するにはvmstatというコマンドがあり以下のようにリアルタイムのサーバリソース状況が確認できます。

$ vmstat 2

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  14220 115632 139708  89896    0    1     2    47    0    0  0  0 100  0  0
0  0  14220 115632 139708  89920    0    0     0    68 1002   35  0  0 100  0  0
0  0  14220 115632 139708  89920    0    0     0     0  996   12  0  0 100  0  0
0  0  14220 115632 139708  89920    0    0     0    14 1001   16  0  0 100  0  0
0  0  14220 115632 139708  89920    0    0     0     0  990   13  0  0 100  0  0
0  0  14220 115632 139708  89920    0    0     0     0  994   13  0  0 100  0  0
この中で注目すべきはsi(スワップイン)とso(スワップアウト)の値です。

こちらの例は実メモリが不足してSwapのI/Oが発生している状態です。このような状態になると速度の遅いHDDへのアクセスが頻発し、サービスへの影響も出ているはずです。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  8   4028  24016   8900 309828    0    0  4314   926 2710  2445 10 21 31 38
1  1   4036  62672   3268 261384    0    6  4758   872 3037  2861 11 29 26 33
0  1   9920  61368   9248 256728    0 2942  4268  3012 2852  2721  7 31 31 32
0  2  11508  58880  15140 257020  260  794  3322  1596 2202  1955  4  9 46 42
1  0  11836  53304  17472 257184  806  164  2478   638 1936  1450 17  5 44 34
2  0  11836  60528  17692 257684  160    0   402    30 1439   772  4 23 67  6
0  0  11836  58928  17880 258152  192    0   502   532 1322   674  8 35 54  3
0  0  11836  62320  17916 258452  352    0   452     0 1493   799  2  1 94  3

まとめると

  • メモリが不足しているように見えても、キャッシュが非常に有効に働いて良好な運用状態の場合がある。
  • Swapメモリの総量値にはほとんど意味はない。
  • 問題視すべきはリアルタイムのI/O発生で、これが発生している場合は致命的なリソース不足となっていることが断言できる。