打开文件最大数的限制

进程每打开一个文件(linux下一切皆文件,包括socket) ,都会消耗一定的内存资源。如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。所以linux系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级

注意:你设置的三种文件数要保证

进程级文件限制<用户级文件数限制<系统级文件限制

否则服务器重启可能会报错!

查看所有进程的文件打开数:lsof |wc –l

查看某个进程的文件打开数:lsof –p pid |wc –l

设置linux系统级的进程打开文件最大数的限制

需要修改/proc/sys/fs/file-max,该值为linux总文件打开数,例如设置为

echo 3865121212>>/proc/sys/fs/file-max

也可以 vi /etc/sysctl.conf

添加以下行:

fs.file-max=3865121212

然后执行sysctl -p 使上述参数生效

重启shell,校验配置是否生效

$ ulimit -a | grep open

设置用户对进程打开文件最大数的限制

查看当前用户对进程打开文件最大数的限制

$ ulimit -a | grep open

临时修改方法

ulimit –n 65535

(2)修改进程的软硬限制(永久生效)

vi /etc/security/limits.conf

添加:

* soft nofile 655350

* hard nofile 655350

注:*表示所有用户都生效

如果想只对一个用户生效,可以把上述参数里*改成对应用户名

  • 设置某个进程级的文件打开数

查看某个进程打开的文件数

lsof -p pid | wc -l

 查看该进程打开文件数限制

cat /proc/pid/limits

修改该进程打开文件数(该服务必须 是托管到systemd服务)

Vi /etc/systemd/system/monitor-client.service

加入如下参数

[Service]

Type=simple

LimitNOFILE=40960

LimitNPROC=40960

重启一下服务进程;然后再查看该进程打开文件数(注意pid变了,已生效

  • 总结

  》1.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

  》2.单个进程打开的文件描述符数不能超过user limit中的nofile的soft limit

  》3.nofile的soft limit不能超过其hard limit

  》4.nofile的hard limt 不能超过 /proc/sys/fs/nr_open.

五、查看某个进程的连接池 

cat /proc/pid/net/sockstat

  • Linux内核参数优化

vi /etc/sysctl.conf

添加

fs.file…max = 999999

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp keepalive time = 600

net.ipv4.tcp_fin_timeout =30

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.ip_local_port_range = 1024 61000

net.ipv4.tcp_rmem = 4096 32768 262142

net.ipv4.tcp_wmem = 4096 32768 262142

 net.core.netdev_max_backlog = 8096

 net.core.rmem default =262144

 net.core.wmem default = 262144

 net.core.rmem max = 2097152

 net.core.wmem_max= 2097152

 net.ipv4.tcp_syncookies = 1

 net.ipv4.tcp_max_syn.backlog=1024

然后执行 sysctl -p 命令,使上述修改生效。

上面的参数意义解释如下∶

file-max∶这个参数表示进程(比如一个worker 进程)可以同时打开的最大句柄数,

这个参数直接限制最大并发连接数,需根据实际情况配置。

tcp tw_reuse∶这个参数设置为1,表示允许将 TIME-WAIT状态的 socket重新用于新

的TCP 连接,这对于服务器来说很有意义,因为服务器上总会有大量 TIME-WAIT状

态的连接。

tcp_keepalive_time∶ 这个参数表示当 keepalive 启用时,TCP发送 keepalive 消息的频

度。默认是 2小时,若将其设置得小一些,可以更快地清理无效的连接。

tcp_fin_timeout∶这个参数表示当服务器主动关闭连接时,socket 保持在 FIN-WAIT-2

tcp_max_tw_buckets∶这个参数表示操作系统允许 TIME WAIT套接字数量的最大值

如果超过这个数字,TIME WAIT 套接字将立刻被清除并打印警告信息。该参数默认为 180 000,过多的 TIME_WAIT套接字会使 Web 服务器变* tcp_max_syn_backlog∶这个参数表示 TCP 三次握手建立阶段接收 SYN 请求队列的最大长度,默认为 1024,将其设置得大一些可以使出现Nginx 繁忙来不及 accept 新连接的情况时,Linux 不至于丢失客户端发起的连接请求。

ip_local_port_range∶这个参数定义了在 UDP 和 TCP连接中本地(不包括连接的远端)端口的取值范围。

net.ipv4.tcp_rmem∶ 这个参数定义了TCP 接收缓存(用于 TCP接收滑动窗口)的最小值、默认值、最大值。

net.ipv4.tcp_wmem∶ 这个参数定义了TCP 发送缓存(用于 TCP 发送滑动窗口)的最小值、默认值、最大值。

netdev_max_backlog∶当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。

rmem_default∶这个参数表示内核套接字接收缓存区默认的大小。

wmem default∶这个参数表示内核套接字发送缓存区默认的大小。

rmem max;这个参数表示内核套接字接收缓存区的最大大小。

wmem_max∶ 这个参数表示内核套接字发送缓存区的最大大小。

tcp_syncookies∶该参数与性能无关,用于解决 TCP的 SYN 攻击。

————————————————

版权声明:本文为CSDN博主「三月微风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lijuncheng963375877/article/details/118609353七、参考文档

1, hard nofile参数设置引起的无法ssh连接问题(涉及另一个参数fs.nr_open)-西部数码知识库 (west.cn)

  1. (123条消息) Linux 如何限制系统级、用户级和进程级文件描述符的数量_MyySophia的博客-CSDN博客_linux设置进程打开文件描述符数量
  2. (123条消息) linux 最大文件打开数nofile及nr_open、file-max说明_lantu0的博客-CSDN博客_fs.nr_open
  3. Linux句柄调优之nofile、nr_open、file-max - 简书 (jianshu.com)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哈工大-凌梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值