0

我正在运行一个 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 内核)会有帮助吗?

还有什么我在这里想念的吗?

4

0 回答 0