我正在运行一个 Neo4j 实例,并通过 REST 从我的 Ruby on Rails 应用程序访问它。最近,我观察到在适度的流量激增期间,对我的 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
我可以看到一致的 Block 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,太低了)-> Block IO -> high TIME_WAIT?在这种情况下,将这个实例移动到 m1.large(7.5 GiB,2 个 CPU 内核)会有帮助吗?
还有什么我在这里想念的吗?