ArangoDB 打开的文件太多
ArangoDB Too many open files
这几天我们的 ArangoDB 安装遇到了问题。启动后 minutes/up 到一个小时,所有与数据库的连接都被拒绝。 arango 日志文件说有 "Too many open files"。 "lsof | grep arango | wc -l" 显示数据库有大约 50,000 个打开的文件句柄,这比最大值低很多。 linux系统允许(约3m)。
有谁知道这个错误是从哪里来的?
我们正在使用带有 3.13 内核的 Ubuntu Linux。 30 GB RAM 和三个内核。数据库仍然很小,大约有 1,5m 个条目,大小为 50GB。
谢谢,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'
看起来增加最大值是有意义的。允许进程管理的打开文件数。鉴于规定的数据库大小约为 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
参数增加。这目前无济于事,但会减少将来保存数据所需的文件描述符的数量。
对于无法重新启动数据库的紧急情况,例如我的情况,您会发现非常有用 this blog post,它解释了如何更改 [=27= 的 ulimit ]进程。
如果您的发行版有 util-linux-2.21,您可以使用“prlimit”工具,或者您可以编译博客 post 中的小示例 C 程序对我来说效果很好。
要检查进程的实际限制,您可以使用:
cat /proc/<PID>/limits
祝你好运!
这几天我们的 ArangoDB 安装遇到了问题。启动后 minutes/up 到一个小时,所有与数据库的连接都被拒绝。 arango 日志文件说有 "Too many open files"。 "lsof | grep arango | wc -l" 显示数据库有大约 50,000 个打开的文件句柄,这比最大值低很多。 linux系统允许(约3m)。 有谁知道这个错误是从哪里来的?
我们正在使用带有 3.13 内核的 Ubuntu Linux。 30 GB RAM 和三个内核。数据库仍然很小,大约有 1,5m 个条目,大小为 50GB。
谢谢,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'
看起来增加最大值是有意义的。允许进程管理的打开文件数。鉴于规定的数据库大小约为 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
参数增加。这目前无济于事,但会减少将来保存数据所需的文件描述符的数量。
对于无法重新启动数据库的紧急情况,例如我的情况,您会发现非常有用 this blog post,它解释了如何更改 [=27= 的 ulimit ]进程。
如果您的发行版有 util-linux-2.21,您可以使用“prlimit”工具,或者您可以编译博客 post 中的小示例 C 程序对我来说效果很好。
要检查进程的实际限制,您可以使用:
cat /proc/<PID>/limits
祝你好运!