【问题标题】:CouchDB Memory Leak - Performance IssueCouchDB 内存泄漏 - 性能问题
【发布时间】:2014-03-09 20:45:33
【问题描述】:

我遇到了 CouchDB 的性能问题。

用例:我正在研究从 RDBMS 检索数据并将它们处理成 JSON 文档并将它们 POST 到 CouchDB 的过程。

我正在尝试发布大约 50 万个文档,其中大部分以 10,000 个批次 (_bulk_doc) 的形式发布,并且尝试了 5,000、15,000 和 20,000 个批次。

整个过程大约需要 90-100 分钟。

在进程的生命周期中,CouchDB 的内存消耗不断增长,当 CouchDB 完成工作时内存不会释放。

因此,如果 CouchDB 的内存消耗在进程完成时为 60%,则内存消耗将保持在 60% 并且不会减少。

随后,当进程再次开始运行时。内存消耗已达到最大值,CouchDB 会自行重新启动。此重新启动使我正在运行的过程失败。查看 Syslogs ,我看到 CouchDB 进程和终止语句的 Out Of Memory Error。

有问题的 CouchDb 进程是 Erlang 的“beam.smp”。

此时,我已经尝试升级服务器的内存,看看是否可以解决问题,不幸的是,问题仍然存在。内存泄漏存在并且使用量不断增长,直到 CouchDB 重新启动/崩溃。

我也尝试过从 Erlang 命令 (erlang:garbage_collect().) 行运行垃圾收集,但它没有做任何事情。

在这一点上,我没有想法,不确定这里发生了什么。任何意见/建议都非常感谢!

环境: 平台:Linux(Red Hat 6.4 版(圣地亚哥)) CouchDB:1.3,也尝试过 1.5 内存:2G、4G 和 8G 都试过 CPU:2核 进程:/usr/lib64/erlang/erts-5.8.5/bin/beam.smp -Bd -K true -A 4 -- -root /usr/lib64/erlang

【问题讨论】:

    标签: memory-leaks erlang couchdb out-of-memory


    【解决方案1】:

    您使用的是哪种 JSON 解析器?你知道在 Erlang 中原子不会被垃圾回收吗?因此,如果您的解析器正在创建新原子,它们将永远存在,最终会消耗您的所有内存。

    【讨论】:

    • 我正在使用 Node.js 创建和发布文档。下面是当 CouchDB 卡在消耗 44% 的内存而不释放它时的 Erlang 内存快照。 erlang:memory([atom, atom_used, processes, processes_used, binary, code, ets])。 [ {atom,452089} , {atom_used,423359} , {processes,1112640} , {processes_used,1100560} , {binary,323400} , {code,3380827} , {ets,228416} ]
    • 来自erl manpage:默认原子数是1048576。你可以尝试使用命令行参数+t增加数字,看看解析更多文件后vm是否崩溃。在这种情况下,我怀疑解析 JSON 文档的解析器有问题。
    • 能否请您发布执行此操作的命令,因为我不熟悉 Erlang。我应该为 Atom 分配多少内存来做这个测试?
    • 您可以执行以下操作:erl +t 2097152。但是您必须在启动 erl 的 couchdb start 脚本中进行搜索。或者在哪里适合放置额外的参数。这个数字是默认原子数的两倍,所以你现在可以做你的数学;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多