因为几天我们遇到了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'
答案 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