知识库

打开文件数量

GNU/Linux 和 Mac OS 操作系统对用户可以打开的并发文件数量设置了上限。

本文介绍了如何在使用 systemd 或 sysvinitd 的 GNU/Linux 上配置打开文件数量。

对于 Mac OS,请查看以下文章: 在 Mac OSX 上设置最大打开文件限制

检查当前用户和当前会话的设置

此数字使用 ulimit -n 命令报告给当前用户和会话

user@localhost:~$ ulimit -n
1024

检查正在运行的进程的设置

要监控用户打开了多少个文件,您可以运行

> 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,并且它被认为是事实上的标准。

表 1. 截至 2019 年 Systemd 与 SysVinit 使用情况表
操作系统 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 仍然打印出较低的数字,您几乎肯定有一个进程管理器、一个初始化脚本或类似的东西覆盖了您的限制。最后一点需要注意的是,进程会继承父进程的限制。

有时您会在日志中看到以下错误:LockObtainFailedException: 锁定获取超时:NativeFSLock

在这种情况下,您可能需要将文件描述符的数量增加到更高的值。

例如:如果您在 40000 时遇到问题,请尝试将其增加到 80000 或更高。