打开文件数
GNU/Linux 和 Mac OS 操作系统对用户可以同时打开的文件数强制设置了上限。
本文介绍了如何在使用 systemd 或 sysvinitd 的 GNU/Linux 系统上配置打开文件数。
对于 Mac OS,请查阅以下文章: 在 Mac OSX 上设置最大打开文件数限制
检查运行中进程的设置
要监控用户打开的文件数,您可以运行
> lsof -u <user>
将 <user> 替换为启动 Neo4j 进程的 linux 用户名。
要了解特定进程 ID 的限制,也可以运行
> cat /proc/<processID>/limits
将 <processID> 替换为运行中的 Neo4j 进程的 linux 进程 ID。
这将产生类似于以下的输出
$ cat /proc/5219/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 31357 31357 processes
Max open files 40000 40000 files
验证正确的设置
Neo4j 将在 debug.log
中报告当前的文件描述符设置,如下所示
2019-01-02 13:39:27.003+0000 INFO [o.n.i.d.DiagnosticsManager] Max number of file descriptors: 10000
通常的默认值是 1024,这通常不够用。我们建议将其设置为 40000 以确保 Neo4j 正常工作。
可以使用 ulimit -n
命令设置限制,但这仅对 root 用户有效,且只影响当前会话,因此不是永久性的。此外,它不会影响已经运行的进程。
在更改文件描述符限制之前和之后,都需要检查此设置。
更改文件描述符限制
根据系统和服务管理器,配置步骤有所不同。自 2015 年以来,大多数 Linux 发行版都采用了 systemd,它被认为是事实上的标准。
操作系统 | SysVinit(已弃用) | systemd |
---|---|---|
RedHat Enterprise Linux >=7, CentOS >=7, fedora >=16 |
否 |
是 |
RedHat Enterprise Linux ⇐6, CentOS ⇐6, fedora ⇐15 |
是 |
否 |
Ubuntu >=16.04, Debian >=8 |
否 |
是 |
如果您的系统使用 systemd
neo4j 作为普通进程运行
运行以下命令
> $ sudo vi /etc/systemd/system.conf
并取消注释并定义 DefaultLimitNOFILE
[Manager]
...
DefaultLimitNOFILE=60000
运行以下命令
> $ sudo vi /etc/systemd/user.conf
并取消注释并定义 LimitNOFILE
[Manager]
#...
DefaultLimitNOFILE=60000
如果您的系统使用 SysVinit
实际提高文件限制的方法包括编辑三个文件
-
/etc/security/limits.conf 需要包含以下几行
neo4j soft nofile 40000
neo4j hard nofile 40000
-
/etc/pam.d/common-session 需要包含此行
session required pam_limits.so
-
/etc/pam.d/common-session-noninteractive 也需要包含此行
session required pam_limits.so
请记住,负责执行进程的任何事物都可以轻松修改限制。如果您使用正确的用户运行 ulimit -n
返回的是您刚刚设置的数字,但 cat /proc/{process_id}/limits
仍然打印出较低的数字,那么几乎可以肯定的是,您有一个进程管理器、init 脚本或类似的东西覆盖了您的限制。最后值得注意的是,进程会继承父进程的限制。
相关问题:NativeFSLock 异常行为 - 获取锁超时
有时您会在日志中看到以下错误:LockObtainFailedException: Lock obtain timed out: NativeFSLock
在这种情况下,您可能需要将文件描述符的数量增加到一个更高的值。
例如:如果您在使用 40000 时遇到此问题,尝试将其增加到 80000 或更高。
此页有帮助吗?