打开文件数量
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 systemctl edit neo4j.service
并将以下内容追加到文件中
[Service]
LimitNOFILE=60000
按照 产品文档 操作
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
仍然打印出较低的数字,您几乎肯定有一个进程管理器、一个初始化脚本或类似的东西覆盖了您的限制。最后一点需要注意的是,进程会继承父进程的限制。
相关问题:NativeFSLock 奇怪行为 - 锁定获取超时
有时您会在日志中看到以下错误:LockObtainFailedException: 锁定获取超时:NativeFSLock
在这种情况下,您可能需要将文件描述符的数量增加到更高的值。
例如:如果您在 40000 时遇到问题,请尝试将其增加到 80000 或更高。
此页面是否有帮助?