ulimit 设置句柄数

一般linux 服务器默认的句柄数都是 1024,查看方法如下:

[root@platservice6 ~]# ulimit -n
1024

执行 ulimit -n ,查得当前的 session 环境下句柄数。果然就是 1024

使用下面的命令:

ulimit -SHn 102400

虽然更改了当前会话窗口的 句柄数,但当新开一个会话窗口,使用 ulimit -n  或  ulimit -a|grep open 查得在新会话窗口中,句柄数还是1024,说明 ulimit -SHn 102400 并非真正意义上的立即生效。直接这么修改 open files 不能得到保持。下面给出修改文件句柄数最简单有效的方法:

 

1. 修改最大连接数
vim /etc/systemd/system.conf

DefaultLimitNOFILE=102400
DefaultLimitNPROC=102400

补充:

也可以不vim,直接执行echo命令即可

echo 'DefaultLimitNOFILE=1024000' >> /etc/systemd/system.conf
echo 'DefaultLimitNPROC=1024000'  >> /etc/systemd/system.conf

如果是采用重启服务器(reboot)的方式使之生效的话,只执行到这一步即可。下面的步骤不用执行。

 

2. 立即生效的配置

2.1 修改 /etc/security/limits.conf ,添加如下一行

*    -    nofile    102400

或者添加如下多行:

* soft nproc 1024000
* hard nproc 1024000
root soft nofile 1024000
root hard nofile 1024000
* soft nofile 1024000
* hard nofile 1024000

2.2 找到 pam_limits.so

[root@platservice1 ~]# find / -name "pam_limits.so"
/usr/lib64/security/pam_limits.so

在 /etc/pam.d/login 中配置 pam_limits.so 的路径

session    required    /usr/lib64/security/pam_limits.so

注意:

最重要的,修改完这些后,要重新登录下才行,不然该 session 的句柄数不会生效。

 

效果如图:

 

 

 

### 句柄数的概念与相关问题 #### 句柄数的定义 在操作系统中,句柄(Handle)是一种抽象引用,用于标识资源或对象[^2]。具体到文件句柄,它是操作系统用来跟踪打开文件的一种机制。每个打开的文件、网络连接、设备等都会占用一个文件句柄。默认情况下,Linux 系统为每个用户设置了一个文件句柄的限制值,通常为 1024。这一限制既包括硬性限制(Hard Limit),也包括软性限制(Soft Limit)。硬性限制是系统允许的最大值,而软性限制则是当前生效的值,可以通过 `ulimit -n` 查看当前用户的软性限制。 #### 句柄数过高的原因 当单个进程需要处理大量请求时(例如 Java 应用程序或高并发服务器),可能会快速消耗掉可用的文件句柄。如果句柄数超过系统定义的最大值,就会出现“too many files open”的错误提示。这种情况通常发生在以下场景: - 高并发的应用程序,如 Web 服务器或数据库服务。 - 某些应用程序未能正确关闭已使用的资源,导致句柄泄露。 - 系统配置的句柄限制较低,无法满足应用需求。 #### 解决方案 为了应对句柄数过高的问题,可以从以下几个方面入手: 1. **调整系统参数** 使用 `ulimit` 命令可以临时调整软性限制和硬性限制。例如,将文件句柄限制提高到 65535: ```bash ulimit -n 65535 ``` 如果需要永久修改,可以编辑 `/etc/security/limits.conf` 文件,添加以下内容: ```plaintext * soft nofile 65535 * hard nofile 65535 ``` 此外,还可以修改 `/etc/systemd/system.conf` 和 `/etc/systemd/user.conf` 中的 `DefaultLimitNOFILE` 参数以全局生效[^1]。 2. **优化应用程序** 确保应用程序能够正确释放不再使用的资源。例如,在 Java 中使用 try-with-resources 语句自动关闭流: ```java try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` 3. **监控与诊断** 使用工具如 `lsof` 或 `ss` 监控系统中打开的文件句柄数量,定位句柄泄露的具体进程。例如: ```bash lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | more ``` 4. **增加系统级限制** 如果硬性限制仍然不足,可以通过修改内核参数 `/proc/sys/fs/file-max` 来增加系统级别的文件句柄总数: ```bash echo 100000 > /proc/sys/fs/file-max ``` #### 示例代码:检查并调整句柄限制 以下是一个简单的 Bash 脚本,用于检查当前句柄限制并进行调整: ```bash #!/bin/bash # 检查当前软性限制 current_limit=$(ulimit -n) echo "当前文件句柄软性限制: $current_limit" # 如果限制小于 65535,则调整 if [ "$current_limit" -lt 65535 ]; then echo "正在调整文件句柄限制到 65535..." ulimit -n 65535 echo "调整完成!" else echo "文件句柄限制已足够大,无需调整。" fi ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wudinaniya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值