[玩转系统] 如何修复 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
或者 :
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
让我们显示当前用户的一个进程的打开文件限制:
# ulimit -n
默认情况下,一个进程的文件数限制为 1024。
让我们显示一个用户的最大数量(最大用户进程数):
# ulimit -u
5041
乘法
1024 * 5041
给我们
5161984
- 这是所有用户进程打开文件的最大数量。
打开文件的数量有两种类型的限制:硬和软。软限制是建议性的。如果打开的文件数量超出了硬限制,则在关闭之前打开的文件之前,用户将无法打开新文件。
要查看当前限制,请使用 ulimit 命令和
-S
(软)或
-H
(硬)选项和
-n
(打开文件描述符的最大数量)选项。
要显示软限制,请运行以下命令:
# ulimit -Sn
显示硬限制值:
# ulimit -Hn
如何增加 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
进行更改后,更新服务配置并重新启动它:
# systemctl daemon-reload
# systemctl restart httpd.service
要检查值是否已更改,请获取服务 PID:
# systemctl status httpd.service
例如服务PID为3724:
# cat /proc/3724/limits | grep "Max open files"
该值必须为 16000。
因此,您已更改特定服务的最大打开文件数值。
如何设置 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
添加到它:
[Service]
LimitNOFILE=16000
不要忘记重新启动 httpd 服务。
更改当前用户会话的打开文件限制
要更改当前用户会话的最大打开文件限制,请运行以下命令:
# ulimit -n 3000
如果您在此处指定的值大于硬限制中指定的值,则会出现错误:
-bash: ulimit: open files: cannot modify limit: Operation not permitted
关闭会话并打开新会话后,限制将返回到 /etc/security/limits.conf 中指定的初始值。
在本文中,我们了解了如何解决 Linux 中打开文件描述符限制值太小的问题,并研究了在服务器上更改这些限制的几种选项。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[短剧合集] 2025年06月2日 精选+付费短剧推荐39部
[软件合集] 25年6月2日 精选软件18个
[软件合集] 25年6月1日 精选软件15个
[短剧合集] 2025年06月1日 精选+付费短剧推荐59部
[短剧] 2025年05月31日 精选+付费短剧推荐58部
[软件合集] 25年5月31日 精选软件66个
[电影] 黄沙漫天(2025) 4K.EDRMAX.杜比全景声 / 4K杜比视界/杜比全景声
[风口福利] 短视频红利新风口!炬焰创作者平台重磅激励来袭
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[美图] 2W美女个美女小姐姐,饱眼福
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag