ArangoDB 打开文件太多

sec*_*ana 5 arangodb

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

我们使用的是带有 3.13 内核的 Ubuntu Linux。30 GB RAM 和三个核心。该数据库仍然很小,大约有 150 万个条目,大小为 50GB。

谢谢,塞卡纳

编辑:“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
Run Code Online (Sandbox Code Playgroud)

“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'
Run Code Online (Sandbox Code Playgroud)

stj*_*stj 2

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

arangod将为每个并行客户端连接需要一个文件描述符。这可能不是很多,但面对 HTTP 保持活动连接,这可能已经占了几个文件描述符。

此外,活动集合的每个数据文件都需要进行内存映射,并且也需要一个文件描述符。默认数据文件大小为 32 MB,50 GB 的数据库(在磁盘上)将已经消耗 1,600 个文件描述符:

50 GB database size / (32 MB default size / 1 datafile) = 1600 datafiles
Run Code Online (Sandbox Code Playgroud)

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

--server.descriptors-minimum 32768 
Run Code Online (Sandbox Code Playgroud)

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

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