修改centos的open files爬坑

本文详细介绍了在CentOS系统中调整文件句柄限制的方法,包括修改limits.conf和pam_limits.so配置,以及如何确认修改是否生效。特别针对CentOS7.4版本的特殊处理进行了说明。

  集群环境有几台新增的机器,尝试修改open files的时候,按照平常的操作就是修改/etc/security/limits.conf/etc/security/limits.d/90-nproc.conf使得重启后永久生效,然后执行ulimit -n 65536这种使得当前生效。这样大多数情况是OK的,但是这里要注意有坑,首先是否真正的生效,需要通过其他机器直接ssh username@ip来直接登录到修改的服务器的username用户下,然后执行ulimit -a查看是否正常。不能直接先在root权限下,通过su命令切换到普通用户下查看,这种查看效果看起来是生效了,但是实际上是使用的root用户的配置,不是mmtrix的配置。所以要在其它服务器上直接通过ssh登录普通用户查看。
  本人遇到的问题是,对于CentOS6.5直接依据上述操作修改正常,但是刚好新增的几台机器系统版本号不一样,这也是坑。。。然后有一台是CentOS 7.4,通过上述方法改完后并没有什么卵用,经google查阅文档了解对于CentOS部分版本,关于各种系统限制和PAM存在冲突,从而导致修改失败。问题排查步骤如下:
  首先要查看系统整体对每个用户设置的文件句柄的最大限制:cat /proc/sys/fs/file-max,这个值要大于我们需要设置的值,否则配置是无效的。修改这个值的方式:

vim /etc/sysctl.con

#新增一行
fs.file-max = 100000

  修改完毕后执行sysctl -p即可成功修改。这里确定没问题后,再修改pam的配置文件,
具体就是编辑/etc/pam.d/login文件,新增一行:session required pam_limits.so内容。这些配置完毕后再重新登录到普通用户查看,如果还是发现open files未修改成功,那么就需要进行下一步修改ssh的配置,编辑/etc/ssh/sshd_config配置文件,配置UsePrivilegeSeparation noUsePAM no,然后通过service sshd restart重启sshd服务,再重新ssh登录普通用户,这时执行ulimt -a发现配置已经生效了。
  针对以上问题,如果未修改成功,还有一个现象供参考是普通用户执行ulimit -n xxx的时候,一般由于配置未生效,如果配置的值过大会提示

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

  即虽然改了limits.conf相关配置文件,但是发现修改的允许范围值还是很小,此时按照以上步骤本人集群机器上问题已经解决。

<think>我们正在讨论如何在CentOS系统中修改文件句柄数限制。根据引用内容,CentOS 7及以后版本使用Systemd,因此配置方式与之前版本有所不同。我们需要考虑系统级限制和用户级限制,以及如何使配置生效。 关键点: 1. 对于通过PAM登录的用户,可以通过修改`/etc/security/limits.conf`文件或`/etc/security/limits.d/`目录下的配置文件来设置限制。 2. 对于由systemd管理的服务,需要在systemd的service文件中进行配置,因为`limits.conf`对systemd服务不生效。 3. 修改后需要重新登录(对于用户限制)或重启服务(对于systemd服务)才能生效。 步骤: 一、修改用户级限制(适用于通过终端登录的用户和通过PAM启动的程序) 1. 编辑`/etc/security/limits.conf`文件,在文件末尾添加如下内容(以设置所有用户为例): ``` * soft nofile 1024000 * hard nofile 1024000 ``` 或者指定用户(如root): ``` root soft nofile 1024000 root hard nofile 1024000 ``` 2. 如果需要,可以在`/etc/security/limits.d/`目录下创建单独的配置文件(如`90-nproc.conf`),同样按照上述格式设置。 二、修改systemd服务的限制(适用于由systemd管理的服务,如nginx、mysql等) 1. 修改服务的service文件,在`[Service]`部分添加: ``` LimitNOFILE=1024000 ``` 如果服务文件是`/usr/lib/systemd/system/nginx.service`,则可以使用以下命令创建覆盖配置(推荐): ``` sudo systemctl edit nginx ``` 然后在打开的编辑器中输入: ``` [Service] LimitNOFILE=1024000 ``` 这样会创建`/etc/systemd/system/nginx.service.d/override.conf`文件。 2. 重新加载systemd配置并重启服务: ``` sudo systemctl daemon-reload sudo systemctl restart nginx ``` 三、修改系统全局限制(可选) 有时还需要修改系统全局的文件句柄数,通过`sysctl`设置`fs.file-max`: 1. 编辑`/etc/sysctl.conf`文件,添加: ``` fs.file-max = 6553560 ``` 2. 应用配置: ``` sudo sysctl -p ``` 四、验证 1. 对于用户级限制,重新登录后使用: ``` ulimit -n ``` 2. 对于systemd服务,查看服务进程的当前限制: ``` cat /proc/<pid>/limits | grep "Max open files" ``` 或者使用: ``` systemctl show nginx | grep LimitNOFILE ``` 注意:引用[2]提到,修改用户级限制后需要重新登录终端才能生效。引用[3]指出,在CentOS7中,`/etc/security/limits.conf`对systemd服务不生效,因此必须通过修改service文件来设置。 因此,完整的解决方案需要同时考虑用户级限制和systemd服务的限制。 下面我们按照步骤详细说明:</think>### 在CentOS修改文件句柄数限制的完整指南 #### 一、核心原理 文件句柄数限制控制进程可同时打开的文件数量,由三级配置组成: 1. **系统级限制**:`fs.file-max`(内核最大文件数) 2. **用户级限制**:`/etc/security/limits.conf`(用户进程限制) 3. **服务级限制**:Systemd服务配置(针对守护进程)[^3] ```mermaid graph TD A[系统级限制 fs.file-max] --> B[用户级限制 limits.conf] B --> C[服务级限制 systemd] C --> D[实际生效值] ``` #### 二、配置步骤 ##### 1. 修改系统全局限制 ```bash # 编辑sysctl配置文件 sudo vim /etc/sysctl.conf # 添加或修改(值根据需求调整) fs.file-max = 6553560 # 立即生效 sudo sysctl -p ``` **验证**:`cat /proc/sys/fs/file-max` ##### 2. 修改用户级限制 ```bash # 编辑limits配置文件 sudo vim /etc/security/limits.conf # 文件末尾添加(示例值1024000) * soft nofile 1024000 * hard nofile 1024000 root soft nofile 1024000 root hard nofile 1024000 ``` **参数说明**: - `*`:所有用户 - `soft`:警告阈值 - `hard`:绝对上限 - `nofile`:文件句柄数[^4] ##### 3. 修改Systemd服务限制(关键步骤) ```bash # 创建服务覆盖配置 sudo mkdir -p /etc/systemd/system.conf.d/ sudo vim /etc/systemd/system.conf.d/file_limit.conf # 添加内容 [Manager] DefaultLimitNOFILE=1024000 ``` **重启生效**:`sudo reboot`[^3] ##### 4. 针对特定服务的独立配置 ```bash # 示例:为Nginx服务单独配置 sudo systemctl edit nginx # 添加内容 [Service] LimitNOFILE=65535 ``` **重载服务**: ```bash sudo systemctl daemon-reload sudo systemctl restart nginx ``` #### 三、验证与调试 1. **查看当前限制**: ```bash # 用户级限制 ulimit -n # 进程级限制 cat /proc/$(pgrep nginx)/limits | grep 'Max open files' ``` 2. **测试工具**: ```bash # 安装测试工具 sudo yum install -y epel-release sudo yum install -y stress-ng # 测试文件打开能力 stress-ng --fd 65535 --timeout 60s ``` 3. **监控命令**: ```bash watch -n 1 'cat /proc/sys/fs/file-nr' ``` #### 四、常见问题解决 1. **配置不生效**: - 检查是否重启终端(用户级限制需要新会话)[^2] - 确认服务是否由Systemd管理(使用`systemctl status 服务名`) - 验证服务配置覆盖是否正确(`systemctl show nginx | grep LimitNOFILE`) 2. **报错"Too many open files"**: ```bash # 查看所有进程的文件打开数 lsof | awk '{print $1}' | sort | uniq -c | sort -nr | head ``` 3. **优先级冲突**: Systemd配置 > 用户limits.conf > 系统fs.file-max[^5] > **最佳实践**:生产环境建议先设置`ulimit -n 1024`测试,再逐步调高[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值