打开文件的数量
GNU/Linux 和 macOS 操作系统对用户可同时打开的文件数量设有上限。
本文介绍如何在使用 systemd 或 sysvinitd 的 GNU/Linux 上配置打开文件的数量。
对于 macOS,请查看以下文章:在 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 命令设置限制,但仅限根用户,并且只影响当前会话,故不是永久性设置。此外,它不会影响已在运行的进程。
在 更改文件描述符限制前后 都需要检查此项。
更改文件描述符限制
根据系统和服务管理器的不同,配置步骤也不同。自 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 或更高。
此页面有帮助吗?