当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

作者:精品下载站 日期:2024-12-14 23:30:40 浏览:14 分类:玩电脑

如何修复 Linux 中的“打开文件过多”错误


高负载 Linux 服务器上经常出现“打开文件过多”错误。这意味着进程打开了太多文件(文件描述符)并且无法打开新文件。在 Linux 上,“最大打开文件限制”是按进程或用户默认设置的,并且值相当小。

在本文中,我们将了解如何检查 Linux 中打开文件最大数量的当前限制,以及如何为整个服务器、特定服务和用户会话全局更改此设置。本文适用于大多数现代 Linux 发行版(Debian、Ubuntu、CentOS、RHEL、Oracle Linux、Rocky 等)

Linux 中的“打开文件过多”错误和打开文件限制

首先,让我们看看“打开文件过多”错误出现在哪里。最常发生在安装了 Nginx /httpd Web 服务器的服务器或运行 MySQL/MariaDB/PostgreSQL 的数据库服务器上读取大量日志文件时。例如,当 Nginx 超出打开文件限制时,您将看到错误:

socket () failed (29: Too many open files) while connecting to upstream

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

或者 :

HTTP: Accept error: accept tcp [::]:<port_number>: accept4: too many open files.

在 Python 应用程序中:

OSError: [Errno 24] Too many open files.

使用此命令,您可以获得系统可以打开的文件描述符的最大数量:

# cat /proc/sys/fs/file-max

要了解当前打开的文件数量,请运行:

# cat /proc/sys/fs/file-nr
7122    123      92312720
  • 7122 — 打开文件总数

  • 123 - 当前未使用的打开文件数

  • 92312720——允许打开的最大文件数

在 Linux 中,您可以在多个级别配置最大打开文件限制:

  • 操作系统内核

  • 服务

  • 用户

要显示 Linux 内核中打开文件数量的当前限制,请运行:

# sysctl fs.file-max
fs.file-max = 92233720

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

让我们显示当前用户的一个进程的打开文件限制:

# ulimit -n

默认情况下,一个进程的文件数限制为 1024。

让我们显示一个用户的最大数量(最大用户进程数):

# ulimit -u
5041

乘法

1024 * 5041

给我们

5161984

- 这是所有用户进程打开文件的最大数量。

打开文件的数量有两种类型的限制:。软限制是建议性的。如果打开的文件数量超出了硬限制,则在关闭之前打开的文件之前,用户将无法打开新文件。

要查看当前限制,请使用 ulimit 命令和

-S

(软)或

-H

(硬)选项和

-n

(打开文件描述符的最大数量)选项。

要显示软限制,请运行以下命令:

# ulimit -Sn

显示硬限制值:

# ulimit -Hn

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

如何增加 Linux 中的最大打开文件限制?

要允许所有服务打开大量文件,您可以更改 Linux 操作系统中的限制。要使新设置永久生效并防止在服务器或会话重新启动后重置它们,您必须对 /etc/security/limits.conf 进行更改。 该文件允许限制用户进程可用的各种系统资源的数量。使用以下格式:

username restriction_type restriction_name value

例如:

apache  hard nofile 978160
apache soft nofile 978160

您可以使用

*

而不是用户名。这意味着此打开文件限制将适用于所有 Linux 用户:

* hard nofile 97816
* soft nofile 97816

例如,您遇到 Nginx 打开文件过多错误。检查该用户进程允许打开多少个文件:

$ sudo -u nginx bash -c 'ulimit -n'
1024

对于高负载服务器来说这还不够。将以下行添加到 /etc/security/limits.conf 中:

nginx hard nofile 50000
nginx soft nofile 50000

在较旧的 Linux 内核上,fs.file-max 的值可能设置为 10000。因此,请检查该值并增加它,使其大于 Limits.conf 中的数字:

# sysctl -w fs.file-max=500000

这将暂时增加打开文件的限制。要使新设置永久生效,您需要将以下行添加到 /etc/sysctl.conf 文件中:

fs.file-max = 500000

并应用它:

# sysctl -p

检查文件 /etc/pam.d/common-session (Debian/Ubuntu) 或 /etc/pam.d/login (CentOS/RedHat/Fedora) 是否包含以下行:

session required pam_limits.so

如果没有,请将其添加到配置文件的末尾。此参数允许在用户身份验证后应用打开文件限制。

进行任何更改后,重新打开控制台,并检查 max_open_files 值:

# ulimit -n
50000

增加每个服务打开文件描述符的最大数量

您可以增加特定服务的最大打开文件描述符,而不是整个操作系统。我们以阿帕奇为例。使用 systemctl 打开服务设置:

# systemctl edit httpd.service

添加您想要的限制,例如:

[Service]
LimitNOFILE=16000
LimitNOFILESoft=16000

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

进行更改后,更新服务配置并重新启动它:

# systemctl daemon-reload
# systemctl restart httpd.service

要检查值是否已更改,请获取服务 PID:

# systemctl status httpd.service

例如服务PID为3724:

# cat /proc/3724/limits | grep "Max open files"

该值必须为 16000。

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

因此,您已更改特定服务的最大打开文件数值。

如何设置 Nginx 和 Apache 的最大打开文件数?

增加服务器打开文件数的限制后,您还必须更改服务配置文件。例如,在 Nginx 配置文件 /etc/nginx/nginx.conf 中指定/更改以下指令值:

worker_rlimit_nofile 16000

worker_rlimit_nofile 指令设置工作进程打开的文件数量限制 (RLIMIT_NOFILE)。 Nginx 需要文件描述符来为每个客户端连接从缓存中返回一个静态文件。连接到服务器的用户越多,Nginx 返回的静态文件越多,使用的文件描述符就越多。句柄的最大数量在操作系统和/或服务级别受到限制。如果超过 Nginx 中打开文件的数量,则会出现“

socket() failed (24: Too many open files) while connecting to upstream error

“ 会发生。

在worker_connections 8192的高负载8核服务器上配置Nginx时,需要在worker_rlimit_nofile中指定8192*2*8 (vCPU)=131072

然后重新启动Nginx。

# nginx -t && service nginx -s reload

要查看 Nginx 用户进程打开的文件数:

# su nginx
# ulimit -Hn
# for pid in `pidof nginx`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done

对于 Apache,您需要创建一个目录:

# mkdir /lib/systemd/system/httpd.service.d/

然后创建 limit_nofile.conf 文件:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

添加到它:

[Service]
LimitNOFILE=16000

不要忘记重新启动 httpd 服务。

更改当前用户会话的打开文件限制

要更改当前用户会话的最大打开文件限制,请运行以下命令:

# ulimit -n 3000

如果您在此处指定的值大于硬限制中指定的值,则会出现错误:

-bash: ulimit: open files: cannot modify limit: Operation not permitted

[玩转系统] 如何修复 Linux 中的“打开文件过多”错误

关闭会话并打开新会话后,限制将返回到 /etc/security/limits.conf 中指定的初始值。

在本文中,我们了解了如何解决 Linux 中打开文件描述符限制值太小的问题,并研究了在服务器上更改这些限制的几种选项。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯