Neo4jインスタンスを実行していて、RUBonRailsアプリケーションからREST経由でアクセスしています。最近、中程度のトラフィックの急増中に、Neo4j RESTサーバーへの同時リクエストが、TIME_WAIT状態(最大14000)の接続が多すぎることに気づきました。これは、最終的に、私のWebアプリケーションに大きな待ち時間をもたらします。
c1.medium(1.7GiB、2 CPUコア)EC2インスタンスで約10Mのエッジと2Mの頂点を含むこのNeo4jインスタンスを実行しています。Neo4jラッパー構成には、-Xmxが1024M(1 GiB)として指定されています。現在のulimitは100000に設定されています。
$ ulimit -n
100000
http://docs.neo4j.org/chunked/stable/linux-performance-guide.htmlを参照しました(Ubuntu 12.04 LTSを使用しています)。を行う
$watch grep -A 1 dirty /proc/vmstat
nr_dirtyで100〜150の断続的な値を取得します。サンプル出力:
Every 2.0s: grep -A 1 dirty /proc/vmstat Sat Nov 3 13:25:53 2012
nr_dirty 148
nr_writeback 0
--
nr_dirty_threshold 83748
nr_dirty_background_threshold 41874
pgpgin 131920234
一貫したブロックIO(ストアはEBS上にあります)と非常に多くのハイコンテキストスイッチと割り込みを見ることができます。
$ vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 141544 32244 3548 319952 1 1 67 36 16 11 11 1 87 1
3 0 141544 31640 3556 320036 0 0 124 100 3649 4269 48 4 47 1
0 0 141544 30648 3564 320116 0 0 76 168 2048 2660 24 3 71 3
1 0 141544 29780 3580 320124 0 0 0 196 4285 6064 31 6 62 2
0 0 141544 29780 3588 320116 0 0 0 80 826 2264 6 0 92 2
0 0 141544 29408 3588 320304 0 0 176 52 952 1873 11 1 86 1
0 0 141544 29408 3596 320296 0 0 0 40 161 389 0 0 99 0
0 0 141544 29408 3596 320296 0 0 0 0 47 79 0 0 100 0
0 1 141544 21720 3596 327992 0 0 7660 0 412 359 5 0 87 8
0 0 141544 21720 3604 327956 0 0 0 80 224 652 0 1 99 1
0 0 141544 21720 3604 327968 0 0 0 24 131 359 0 0 99 1
0 0 141544 21720 3604 327968 0 0 0 24 132 359 0 0 100 0
0 0 141544 21720 3612 327960 0 0 0 56 141 360 0 0 98 1
0 0 141544 21100 3612 328580 0 0 608 0 99 173 2 0 97 1
0 0 141544 20604 3620 328700 0 0 120 172 1172 2381 19 2 77 2
0 0 141544 20604 3620 328700 0 0 0 0 49 85 0 0 100 0
0 0 141544 20604 3620 328704 0 0 0 32 172 415 1 0 99 0
1 0 141544 20480 3628 328696 0 0 0 108 578 755 41 1 56 3
2 0 141544 20356 3628 328708 0 0 0 0 276 49 50 0 50 0
1 0 141544 20480 3628 328708 0 0 0 0 287 49 50 0 50 0
4 0 141560 20960 3648 328076 32 20 1092 356 4959 5501 68 6 23 3
1 0 141560 20340 3656 328224 0 0 276 88 1181 1208 69 2 25 4
1 0 141560 20340 3656 328280 0 0 0 16 290 53 50 0 50 0
1 0 141560 20340 3656 328280 0 0 0 0 277 52 50 0 50 0
1 0 141560 18868 3696 329116 0 0 844 376 2818 2112 67 2 26 5
1 0 141560 18868 3696 329132 0 0 0 0 287 56 50 0 50 0
1 0 141560 18868 3696 329132 0 0 0 0 280 46 50 0 50 0
nr_dirtyの値が高すぎるとは思いません。誰かが設定するかどうか確認できたら嬉しいです
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
http://docs.neo4j.org/chunked/stable/linux-performance-guide.htmlに示されているように、ここで役立ちますか?
それとも、使用可能なメモリを使い果たしたのでしょうか(空きメモリは約14Mで、低すぎます)->ブロックIO->高TIME_WAIT?その場合、このインスタンスをm1.large(7.5 GiB、2 CPUコア)に移動するだけで役立ちますか?
私がここで見逃している他の何かがありますか?