質問: topコマンドで表示されるvirt、resおよびswapの意味について topコマンドで表示されるvirt、resおよびswapの意味について教えてください。 centos5.4上で動作しているアプリケーションの使用メモリについて調査しています。 サーバのメモリ容量は512mbで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。 topコマンドでプロセスが使用している物理メモリ容量はres項目を見れば良いことがわかっていますが、virt(仮想メモリの総量)とswap(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。 topコマンドの出力結果は下の通りです。 この検証用サーバでは暫定的にパーティション設定でスワップ領域を作成していません。 しかしtopコマンドではvirtとresの数値は差異があり、swap項目も大きな値を示しているプロセスがあります。 スワップ領域が無いのではtopコマンドはvirtとresが同じになり、swapはゼロとなると予想していたのですがどうしてならないのですか? top - 03:35:44 up 36 min, 3 users, load average: 0.13, 0.17, 0.20 tasks: 90 total, 1 running, 89 sleeping, 0 stopped, 0 zombie cpu(s): 0.0%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st mem: 515340k total, 452152k used, 63188k free, 18132k buffers swap: 0k total, 0k used, 0k free, 347404k cached pid user pr ni virt res shr s %cpu %mem time+ swap command 4602 tomcat 25 0 645m 28m 6996 s 0.0 5.8 0:04.12 616m java 2227 root 34 19 25656 10m 2108 s 0.0 2.0 0:00.12 14m yum-updatesd 1680 root 17 0 11580 9964 240 s 0.0 1.9 0:00.02 1616 restorecond 1936 haldaemo 18 0 5472 3676 1688 s 0.0 0.7 0:01.20 1796 hald 2499 root 18 0 10540 2916 1504 s 0.0 0.6 0:00.03 7624 httpd 3672 root 15 0 10064 2888 2308 s 0.7 0.6 0:02.50 7176 sshd 3927 root 20 0 9916 2880 2308 s 0.0 0.6 0:00.34 7036 sshd 2054 root 18 0 10116 2328 1696 s 0.0 0.5 0:00.04 7788 cupsd 2500 apache 25 0 10540 2088 640 s 0.0 0.4 0:00.00 8452 httpd どうしてもズレるので画像を添付してます。
回答: 答えにたどり着く前に、若干長めの説明が必要です。 > topコマンドで表示されるvirt、resおよびswapの意味について教えてください。 resは、ご認識の通り、そのプロセスの物理メモリ使用量です。 virtとして表示されている仮想メモリ総量とは、そのプロセスの 仮想アドレス空間の中で、有効となっているページの総量です。 これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに 描かれている「物理メモリ」や「スワップ」に対応するページのほか、 以下のようなものも含まれます。 ・プロセスが確保したメモリのうち、まだ一回もアクセスして いない部分。 ⇒アクセスしたときに初めて物理メモリが割り当てられ、 resにも計上されていきます。 (javaのresに比べてかなり大きいvirtは、これによるものと 思われます。大きなヒープサイズを指定していませんか?) ・プロセスが ファイルを仮想メモリ空間にmmap(2) したが、 まだ一回もアクセスしていない部分。 ⇒linux(unix) には、あたかもメモリをアクセスするかのように ファイルを読み書きできる mmap(2) という機能があり、 かなり多用されています。mmap直後のファイルは、 virtには計上されますが、物理メモリには読み込まれずresには計上 されません。ファイルをmmapした仮想メモリ空間にアクセスした 部分が、物理メモリに読み込まれresに計上されます。 > スワップ領域が無いのではtopコマンドはvirtとresが同じになり、 > swapはゼロとなると予想していたのですがどうしてならないのですか? 実は、swapとして表示される数値は、単に virt と res の差です。 vert(仮想メモリ総量)の中には、物理メモリ(res)やスワップ領域の 使用量だけなく上記で挙げたような仮想空間の部分の合計が含まれ ますから、スワップ領域がゼロでも、上記で挙げたような空間が swap として表れているのです。 個人的にはこの数値をswapと呼ぶのは、かなり不適切だと思いますが、 多くのlinuxディストリビューションのtopコマンドで表示される swap欄は、そういう計算をしているということです。