必要なデータを定期的に収集して riak データベースに格納する単純な erlang アプリケーションを作成しました。
アプリケーションを起動すると、スムーズに実行されます..しかし、しばらくすると、riak データベースへの PUT リクエストが遅くなりすぎるため、スタックします..それは私のアプリからのログです:
2013-06-26 12:44:09.090 [info] <0.60.0> data processed in [16476 ms]
2013-06-26 12:45:51.472 [info] <0.60.0> data processed in [18793 ms]
...
2013-06-26 12:57:28.138 [info] <0.60.0> data processed in [15135 ms]
2013-06-26 13:07:01.484 [info] <0.60.0> data processed in [488420 ms]
2013-06-26 14:03:11.561 [info] <0.60.0> data processed in [3370075 ms]
riak クラッシュ ログには、次のようなメッセージがたくさん表示されます。
2013-06-26 17:06:20 =CRASH REPORT====
crasher:
initial call: riak_kv_index_hashtree:init/1
pid: <0.13660.7>
registered_name: []
exception exit: {{{badmatch,{error,{db_open,"IO error: ./data/anti_entropy/
433883298582611803841718934712646521460354973696/MANIFEST-000004:
Cannot allocate memory"}}}, [{hashtree,new_segment_store,2,
[{file,"src/hashtree.erl"},{line,499}]},
{hashtree,new,2,[{file,"src/hashtree.erl"},{line,215}]},
{riak_kv_index_hashtree,do_new_tree,2,
[{file,"src/riak_kv_index_hashtree.erl"},
{line,426}]},{lists,foldl,3,[{file,"lists.erl"},
{line,1197}]},{riak_kv_index_hashtree,
init_trees,2,[{file,"src/riak_kv_index_hashtree.erl"},
{line,368}]},{riak_kv_index_hashtree,init,1,
[{file,"src/riak_kv_index_hashtree.erl"},
{line,225}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},
{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]},
[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,328}]},
{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}
ancestors: [<0.955.0>,riak_core_vnode_sup,riak_core_sup,<0.129.0>]
messages: []
links: []
dictionary: []
trap_exit: false
status: running
heap_size: 1597
stack_size: 24
reductions: 593
neighbours:
Amazon AWS とローカル仮想マシンで同じ動作を確認できます。私の VM は 512 ~ 1024 MB と非常に小さいです。AWS は Micro であるため、同じ量のメモリがあります。
現在クラスターはありません。Riak とその上で実行されているアプリを含む 1 つのノードだけです。
私は riak のドキュメントを確認しましたが、彼らが推奨する基本的なことは、ulimit を増やして sysctl を更新することです。したがって、私のサーバーの ulimit は次のように表示されます: ulimit -n 65536 AND sysctl が推奨どおりに更新されました。
bitcask と eleveldb を試しましたが、結果は同じです。
現在、何が壊れていて、なぜ riak がメモリを割り当てられないのかわかりません..ありがとう。