知识库

打开文件的数量

GNU/Linux 和 macOS 操作系统对用户可同时打开的文件数量设有上限。

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

对于 macOS,请查看以下文章:在 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 命令设置限制,但仅限根用户,并且只影响当前会话,故不是永久性设置。此外,它不会影响已在运行的进程。

更改文件描述符限制前后 都需要检查此项。

更改文件描述符限制

根据系统和服务管理器的不同,配置步骤也不同。自 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 或更高。

© . This site is unofficial and not affiliated with Neo4j, Inc.