メモリの管理はサーバ運用における重要なファクターとなっており、サーバが高負荷になったりアプリケーションの不具合があると真っ先に「メモリの残量不足では?」という懸念を抱きます。
管理者がメモリ残量を知るためのLinuxコマンドはtopやfreeがあり、以下のようにいくつかの指標があります。
- 物理メモリ(total)
- 使用メモリ(Used)
- 未使用メモリ(Free)
- Swapメモリ(Swap)
- キャッシュメモリ(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発生で、これが発生している場合は致命的なリソース不足となっていることが断言できる。
コメント