知识库

打开文件数

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 仍然打印出较低的数字,那么几乎可以肯定的是,您有一个进程管理器、init 脚本或类似的东西覆盖了您的限制。最后值得注意的是,进程会继承父进程的限制。

有时您会在日志中看到以下错误:LockObtainFailedException: Lock obtain timed out: NativeFSLock

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

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

© . All rights reserved.