ArangoDB打开的文件太多了

时间:2015-05-26 11:28:19

标签: arangodb

因为几天我们遇到了ArangoDB安装的问题。启动后几分钟/一个小时内所有与数据库的连接都被拒绝。 arango日志文件说有“打开的文件太多”。 “lsof | grep arango | wc -l”表明数据库有大约50,000个打开的文件句柄,这是最大的。 Linux系统允许(大约3米)。 有谁知道这个错误来自哪里?

我们正在使用带有3.13内核的Ubuntu Linux。 30 GB RAM和三个内核。数据库仍然很小,大约有1,500个条目,大小为50GB。

Thx,secana

编辑: “netstat -anpt | fgrep 2480”显示:

root@syssec-graphdb-001-test:~# netstat -anpt | fgrep 2480
tcp        0      0 10.215.17.193:2480      0.0.0.0:*               LISTEN               7741/arangod
tcp        0      0 10.215.17.193:2480      10.215.50.30:53453      ESTABLISHED          7741/arangod
tcp        0      0 10.215.17.193:2480      10.215.50.31:49299      ESTABLISHED          7741/arangod
tcp        0      0 10.215.17.193:2480      10.215.50.30:53155      ESTABLISHED          7741/arangod

“ulimit -n”的结果是1024,所以我认为~50,000都是arango进程。

数据库死亡前日志文件中的最后一行:

2015-05-26T12:20:43Z [9672] ERROR cannot open datafile '/data/arangodb/databases/database-235999516/collection-28464454696/datafile-18806474509149.db': 'Too many open files'
2015-05-26T12:20:43Z [9672] ERROR cannot open datafile '/data/arangodb/databases/database-235999516/collection-28464454696/datafile-18806474509149.db': Too many open files
2015-05-26T12:20:43Z [9672] DEBUG [arangod/VocBase/collection.cpp:1632] cannot open '/data/arangodb/databases/database-235999516/collection-28464454696', check failed
2015-05-26T12:20:43Z [9672] ERROR cannot open document collection from path '/data/arangodb/databases/database-235999516/collection-28464454696'

2 个答案:

答案 0 :(得分:2)

看起来增加最大值是有意义的。允许进程管理的打开文件数。鉴于规定的数据库大小约为50 GB,(可能默认值)1024似乎太低了。

对于每个并行客户端连接,

arangod 将需要一个文件描述符。这可能不是很多,但面对HTTP保持连接,这可能已经占了几个文件描述符。

此外,活动集合的每个数据文件都需要进行内存映射,并且还需要花费一个文件描述符。如果默认数据文件大小为32 MB,则数据库大小为50 GB(在磁盘上)将占用1,600个文件描述符:

50 GB database size / (32 MB default size / 1 datafile) = 1600 datafiles

因此,增加 arangod 用户和环境的ulimit -n值是有意义的。您可以确认 arangod 实际上可以通过使用选项--server.descriptors-minimum <value>启动它来实际使用配置数量的文件描述符,例如

--server.descriptors-minimum 32768 

用于那么多文件描述符。如果 arangod 无法有效地使用指定数量的文件描述符,则它将在启动时因致命错误而失败。当然,该选项也可以放入arangod.conf文件中。

此外,可以通过集合的journalSize参数增加(新)数据文件的默认大小。这对现在没有帮助,但会减少将来保存的数据所需的文件描述符数量。

答案 1 :(得分:1)

对于您无法重启数据库的紧急情况,就像我的情况一样,您会发现非常有用的this blog post,它解释了如何更改正在运行的进程的ulimit

如果你的发行版有util-linux-2.21,你可以使用&#34; prlimit&#34;工具,或者你可以在博客文章中编译那个对我很有用的小例子C程序。

要检查您可以使用的流程的实际限制:

cat /proc/<PID>/limits

祝你好运!