Centos7 出现"Too many open files"等文件打开太多等错误解决方案

本文围绕Centos7系统展开,介绍了系统级(max-file)和进程级(ulimit)能够打开的文件句柄数量。默认情况下,系统级为794168,进程级为1024。若不设置,会出现文件描述符耗尽问题。文中还给出了永久生效的配置修改方法,以及遇到问题时的解决思路。

ulimit -a 查看用户进程级的能够打开文件句柄的数量,Centos7默认是1024。

max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。

 

对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。

一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。

为了让服务器重启之后,配置仍然有效,需要用永久生效的配置方法进行修改。

1、max-file:

1)查看系统级别的能够打开的文件句柄的数量,Centos7默认是794168
# cat /proc/sys/fs/file-max

794168

2)系统级打开最大文件句柄的数量永久生效的修改方法,修改文件,文件末尾加入配置内容:
# vim /etc/sysctl.conf

fs.file-max = 2000000

3)然后执行命令,使修改配置立即生效:

# sysctl -p

 

2、ulimit:

2.1、这里设置的是当前shell的当前用户的打开的最大限制,如果当前用户打开多个shell,则每个shell都能打开该最大值

# ulimit -n

1024

2.2、进程级打开文件句柄数量永久生效的修改方法,修改文件,文件末尾加入配置内容:

1)这里限制一个用户的所有shell能打开的最大数:

# vim /etc/security/limits.conf

* soft nofile 65535

* hard nofile 65535

修改以后,需要重新登录才能生效。

2)如果需要设置当前用户session立即生效,还需要执行:

# ulimit -n 65535 

对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。

如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。

 

参考链接:https://blog.youkuaiyun.com/sunny05296/article/details/54952009

<think>我们正在解决CentOS 8系统中因“Too many open files错误而需要修改进程级别的最大连接数(即文件描述符限制)的问题。 根据引用[2]和引用[4],我们知道: - 进程级别的限制可以通过`ulimit`命令来查看和设置(临时生效)。 - 永久修改进程级别的限制,通常需要修改系统配置文件(如`/etc/security/limits.conf`)或者使用系统管理工具(如systemd)进行配置。 由于用户明确要在CentOS 8上修改进程级别的最大连接数,我们将按照以下步骤进行: 步骤1:查看当前限制 - 使用`ulimit -n`查看当前会话的限制(软限制)。 - 使用`ulimit -Hn`查看硬限制。 步骤2:临时修改进程级别的限制(重启后失效) - 使用命令`ulimit -n 65535`(或所需的值)可以提高当前会话的限制。但注意,这种方法只能临时提高,并且只对当前shell及其启动的进程有效。 步骤3:永久修改进程级别的限制 在CentOS 8中,永久修改进程级别的限制有两种常见情况: a) 针对通过shell登录的用户启动的进程:修改`/etc/security/limits.conf`文件。 b) 针对系统服务(由systemd管理的服务):需要修改服务的unit文件,或者修改systemd全局配置。 情况a:修改用户级限制(适用于非系统服务进程,如通过shell启动的进程) 1. 编辑`/etc/security/limits.conf`文件,在文件末尾添加: * soft nofile 65535 * hard nofile 65535 或者替换`*`为特定用户名,比如`nginx`(如果是为了nginx服务,则指定用户为nginx)。 情况b:修改系统服务的限制(适用于由systemd管理的服务,如nginx、tomcat等) 在CentOS 7及更高版本中,许多服务由systemd管理,因此需要修改systemd的配置。 1. 查看服务的当前限制:`systemctl show <service_name> | grep LimitNOFILE` 2. 为服务设置限制: 方法1:修改服务的unit文件(推荐使用覆盖配置的方式,避免直接修改原始文件) 执行:`systemctl edit <service_name>` 在弹出的编辑器中,添加: [Service] LimitNOFILE=65535 保存退出,然后重启服务:`systemctl restart <service_name>` 方法2:全局修改(修改systemd的默认限制) 编辑`/etc/systemd/system.conf`文件,找到以下行并修改(如果被注释则取消注释): DefaultLimitNOFILE=65535 然后执行:`systemctl daemon-reload` 并重启服务。 步骤4:修改系统级别的限制(可选,但有时需要) 根据引用[4],系统级别有一个总的限制(由`fs.file-max`内核参数控制)。 查看当前值:`cat /proc/sys/fs/file-max` 临时修改:`sysctl -w fs.file-max=655350` 永久修改:在`/etc/sysctl.conf`文件中添加`fs.file-max=655350`,然后执行`sysctl -p`使生效。 注意:进程级别的限制不能超过系统级别的限制。 步骤5:验证 - 对于用户级进程:重新登录后,使用`ulimit -n`查看。 - 对于系统服务:重启服务后,通过`cat /proc/<PID>/limits | grep "Max open files"`查看具体进程的限制。 针对用户的问题,如果他是要修改某个特定进程(比如nginx)的最大文件描述符,那么: - 如果该进程是由systemd管理的,则使用步骤3中的情况b的方法。 - 如果该进程是由用户会话启动的,则使用步骤3中的情况a的方法。 此外,引用[3]中提到,有时代码问题可能导致文件描述符泄漏,因此优化代码也是根本解决方法。 因此,我们按照上述步骤,为用户提供在CentOS 8上修改进程级别的最大连接数的具体方法。 </think>在CentOS 8系统中解决**Too many open files**问题并修改进程级别的最大连接数,需按以下步骤操作: ### 一、诊断当前限制 1. **查看系统级限制** ```bash cat /proc/sys/fs/file-max # 系统最大FD总数 ``` 若需提高系统级限制(不强制但建议): ```bash echo "fs.file-max = 1000000" >> /etc/sysctl.conf sysctl -p # 立即生效 ``` 2. **查看进程级限制** - 查找目标进程PID(以nginx为例): ```bash pidof nginx ``` - 查看该进程当前限制: ```bash grep "Max open files" /proc/<PID>/limits ``` --- ### 二、修改进程级限制(关键步骤) #### 方法1:临时修改(会话级) ```bash ulimit -n 65535 # 仅对当前Shell会话有效 ``` #### 方法2:永久修改(推荐) 1. **针对Systemd管理的服务**(如Nginx/MySQL等) - 创建服务覆盖配置: ```bash sudo systemctl edit nginx.service ``` - 添加以下内容: ```ini [Service] LimitNOFILE=65535 ``` - 重启服务: ```bash sudo systemctl daemon-reload sudo systemctl restart nginx ``` 2. **针对普通进程启动** 修改`/etc/security/limits.conf`: ```bash sudo nano /etc/security/limits.conf ``` 添加(以用户`nginx`为例): ```conf nginx soft nofile 65535 # 软限制 nginx hard nofile 65535 # 硬限制 ``` --- ### 三、验证配置 1. 重启服务后检查进程限制: ```bash # 获取新PID后检查 cat /proc/$(pidof nginx)/limits | grep "Max open files" ``` 应输出: ``` Max open files 65535 65535 files ``` 2. 检查当前使用情况: ```bash lsof -p <PID> | wc -l # 统计进程实际打开FD数 ``` --- ### 四、注意事项 1. **优先级关系**:进程级限制 ≤ 用户级限制(`limits.conf`) ≤ 系统级限制(`file-max`)[^2][^4] 2. **泄漏排查**:若FD持续增长,需检查代码/配置中的资源泄露(如未关闭文件句柄)[^3] 3. **CentOS 8特性**:优先通过`systemd`修改服务,而非直接修改`/etc/security/limits.conf`(对systemd服务无效)[^4] --- ### 根本解决方案建议 - **优化程序**:检查代码中文件打开/关闭逻辑,避免泄露 - **监控机制**:设置脚本监控FD使用量,接近阈值时告警或重启(临时缓解)[^3] - **负载均衡**:高并发场景分散请求到多节点 > 修改后仍出现错误,需检查程序逻辑或考虑分布式架构优化[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值