ablog

不器用で落着きのない技術者のメモ

Java プロセスを多数起動すると、物理メモリより先に swap を使う?

以前、お仕事をさせて頂いた方から質問を頂いたのでちょっと調べてみた。

Q & A

Q.

Solaris10 で、java のプロセスを多数起動していくと物理メモリではなく、swap から使っているように見える。
vmstat の結果をチェックしていたら、free には余裕があるように見えるのに、java のプロセスの起動と共に swap が、どんどん減っていく。物理メモリに余裕あるのに、swap から使っていくのはなぜか?

A.

物理メモリ不足で swap を使っているのではなく、カーネルが活動が少ない部分をメモリから排除して swap に追い出し、空いたメモリをバッファやキャッシュに転用しているためではないかと思います。

検証結果

$ cat Hoge.java 
public class Hoge {
  public static void main(String[] args) {
    for(;;){
       try {
           Thread.sleep(5000);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
    }
  }
}
$ javac Hoge.java 
$ for i in {1..20}
> do
> java -Xms512M Hoge >/dev/null 2>&1 &
> done
[1] 24492
[2] 24493
[3] 24494
[4] 24497
[5] 24498
[6] 24499
[7] 24500
[8] 24501
[9] 24502
[10] 24503
[11] 24510
[12] 24511
[13] 24512
[14] 24513
[15] 24514
[16] 24515
[17] 24516
[18] 24527
[19] 24528
[20] 24529
$ pkill -f Hoge
$ 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 302184 148080 172964 1358308    1    1     8     9    6   13  0  0 100  0  0
 0  0 302184 148080 172964 1358316    0    0     0     8 1006  183  0  0 100  0  0
 0  0 302184 148080 172964 1358316    0    0     0     8 1011  209  0  0 100  0  0
 0  0 302184 148080 172988 1358308    0    0     0    24 1008  183  0  0 100  0  0
20  0 302184  75592 172988 1358912    0    0     2    24 1022  409 16  9 75  0  0  <-- java プロセス起動
 0  0 302184  59348 172988 1358908    0    0     6    30 1010  978 15  3 83  0  0
 0  0 302184  59348 172996 1358900    0    0     0    14 1005  863  0  0 100  0  0
 0  0 302184  59224 173036 1359004    0    0     0    88 1010  914  0  0 100  0  0
 0  0 302184  59224 173036 1359004    0    0     0     8 1006  878  0  0 100  0  0
 0  0 302184  59224 173044 1358972    0    0     0    18 1006  881  0  0 100  0  0
 0  0 302184  59224 173044 1358980    0    0     0    48 1010  889  0  0 100  0  0
 0  0 302184  59224 173044 1358980    0    0     0     8 1006  873  0  0 100  0  0
 2  0 302184  59224 173052 1358972    0    0     0     6 1004  894  0  0 100  0  0
 0  0 302184  59224 173052 1358980    0    0     0    10 1005  884  0  0 100  0  0
 2  0 302184  59224 173052 1358980    0    0     0    18 1006  876  0  0 100  0  0
 0  0 302184  59224 173064 1358968    0    0     0    14 1015  927  0  0 100  0  0
 2  0 302184  59224 173064 1358968    0    0     0     8 1013  900  0  0 100  0  0
 0  0 302184  59224 173064 1358968    0    0     0     8 1003  892  0  0 100  0  0
 0  0 302184 146520 173072 1358376    0    0     0     6 1009  860  3  2 95  0  0  <-- java プロセス kill
 0  0 302184 146644 173072 1358380    0    0     0    18 1004  178  0  0 100  0  0
 0  0 302184 146644 173072 1358380    0    0     0     8 1003  170  0  0 100  0  0
 0  0 302184 146768 173104 1358372    0    0     0    40 1007  183  0  0 100  0  0
 0  0 302184 146768 173104 1358332    0    0     0     8 1004  176  0  0 100  0  0
 0  0 302184 147016 173104 1358332    0    0     0    18 1006  172  0  0 100  0  0
 0  0 302184 147016 173112 1358332    0    0     0    16 1004  179  0  0 100  0  0
 0  0 302184 147140 173116 1358328    0    0     0    18 1006  171  0  0 100  0  0

期待する結果にならなかったw
ま、いいか。