Linux修改最大文件句柄数及常用内核参数优化

1、临时生效

# ulimit -SHn 10000

其实ulimit 命令身是分软限制和硬限制,加-H就是硬限制,加-S就是软限制。默认显示的是软限制,如果运行ulimit 命令修改时没有加上-H或-S,就是两个参数一起改变。

软限制和硬限制的区别?

硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。


2、永久生效

要想ulimits 的数值永久生效,必须修改配置文件/etc/security/limits.conf

在该配置文件中添加

* soft nofile 204800  

* hard nofile 204800

* soft nproc 204800

* hard nproc 204800 

echo "* soft nofile 204800"  >> /etc/security/limits.conf

echo "* hard nofile 204800"  >> /etc/security/limits.conf

echo "* soft nproc 204800"  >> /etc/security/limits.conf

echo "* hard nproc 204800 "  >> /etc/security/limits.conf

* 表示所用的用户


3、修改系统总限制

其实上面的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。

假如,我们设置进程打开的文件句柄数是1024 ,但是系统总限制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。

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

上面是临时生效方法,重启机器后会失效;

永久生效方法:

修改 /etc/sysctl.conf, 加入

echo  fs.file-max = 6553560  >> /etc/sysctl.conf

重启生效

原文:https://blog.csdn.net/saga_gallon/article/details/80305515 

总结:

  • /proc/sys/fs/file-max限制不了/etc/security/limits.conf

  • 只有root用户才有权限修改/etc/security/limits.conf

  • 对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户

  • 对于非root用户,ulimit -n只能越设置越小,root用户则无限制

  • 任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定

  • 如果limits.conf没有做设定,则默认值是1024

  • 当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定


补充:

更改普通用户最大进程数,立即生效,centos6系统:

[root@chegva resin]#cat /etc/security/limits.d/90-nproc.conf

*          soft    nproc     102400

centos7系统:

[root@chegva ~]# cat /etc/security/limits.d/20-nproc.conf

*          soft    nproc     4096

root       soft    nproc     unlimited

# 查找进程的最大句柄数限制

[root@chegva ~]# cat /proc/19736/limits  |grep 'files'

Max open files            3002400              3002400              files

# 查看当前进程打开的文件句柄数

[root@chegva ~]# ls /proc/19736/fd |wc -l

28

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

[root@chegva ~]# lsof -p 9395 |wc -l

41

查看所有进程的文件打开数

[root@chegva ~]# lsof |wc -l

294478

echo -e '\n=======handle=======';lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|head

289774 7110

217560 7843 

48744 27194

1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:

/proc/sys/fs/file-max

2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:

/proc/sys/fs/file-nr

3)单个进程允许打开的最大fd数量.查询语句:

ulimit -n

4)单个进程(例如进程id为5454)已经打开的fd.查询语句:

ls -l /proc/5454/fd/

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

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

c. nofile的soft limit不能超过其hard limit

d. nofile的hard limit不能超过/proc/sys/fs/nr_open


我们总结一下,其实在 Linux 上能打开多少个文件,限制有两种:

  • 第一种,进程级别的,限制的是单个进程上可打开的文件数。具体参数是 soft nofile 和 fs.nr_open。它们两个的区别是 soft nofile 可以不同用户配置不同的值。而 fs.nr_open 在一台 Linux 上只能配一次。

  • 第二种,系统级别的,整个系统上可打开的最大文件数,具体参数是fs.file-max。但是这个参数不限制 root 用户。

另外这几个参数之间还有耦合关系,因此还要注意以下三点:

  • 1、如果你想加大 soft nofile,  那么 hard nofile 也需要一起调整。因为如果 hard nofile 设置的低, 你的 soft nofile 设置的再高都没用,实际生效的值会按二者里最低的来。

  • 2、如果你加大了 hard nofile,那么 fs.nr_open 也都需要跟着一起调整。如果不小心把 hard nofile 设置的比 fs.nr_open 大了,后果比较严重。会导致该用户无法登陆。如果设置的是 * 的话,那么所有的用户都无法登陆。

  • 3、还要注意如果你加大了 fs.nr_open,但是用的是 echo "xx" > ../fs/nr_open 的方式,刚改完你可能觉得没问题。只要机器一重启你的 fs.nr_open 设置就会失效,还是会无法登陆。

假如你想让你的进程可以打开 100 万个文件描述符,我觉得比较稳妥点的修改方法是干脆都直接用 conf 文件的方式来改。这样比较统一,也比较安全。

# vi /etc/sysctl.conf
fs.nr_open=1100000  //要比 hard nofile 大一点
fs.file-max=1100000 //多留点buffer
# sysctl -p
# vi /etc/security/limits.conf
*  soft  nofile  1000000
*  hard  nofile  1000000

参考:刨根问底儿,看我如何处理 Too many open files 错误!


1.常用内核参数的修改

动态修改:修改/proc/下配置的值,重启系统后会恢复原样

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
sysctl -w net.ipv4.icmp_echo_ignore_all = 0

# sysctl -a |grep mem
net.ipv4.tcp_mem = 94500000 915000000 927000000 #整个系统tcp缓冲区(单位:页)
net.ipv4.tcp_rmem = 4096 87380 4194304 #tcp接收队列缓冲区(单位字节):最小值、平均值、最大值(8388608)
net.ipv4.tcp_wmem = 4096 16384 4194304 #tcp发送队列缓冲区

net.ipv4.tcp_max_syn_backlog = 16384 #syn缓冲队列,一般调成并发连接数的3倍左右
net.ipv4.tcp_syn_retries = 2 #syn重试次数,减少syn攻击
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 1 #当syn等待队列溢出时,启用cookies来处理

  • 内存参数:共享内存/proc/sys/kernel/shmsysctl -a | grep shm

    kernel.shmmni = 4096 可用最大共享内存段
    kernel.shmall = 18446744073692774399 可以使用的所有内存(单位为页,默认1页是4096字节)
    kernel.shmmax = 18446744073692774399 一个共享内存段中内存最大使用容量

  • 信号量优化:sysctl -a |grep sem

    # 一个系统有多个信号量集合,一个集合有多个信号量(集合数、可用信号量、每个信号量可用操作数、每个集合的信号量) ,当集合数乘每个集合的信号量大于可用信号量时取大值
    # SEMMSL SEMMNS SEMOPM SEMMNI
    kernel.sem = 250 32000 32 128
    # 大型应用系统建议设置每个信号量可用操作数<=每个集合的信号量
    kernel.sem = 250 32000 128 128

  • 文件句柄:当系统使用的句柄数已经接近最大可使用数,则需成倍增大最大句柄可使用数

    # 查看最大句柄数
    cat /proc/sys/fs/file-max
    1000000
    # 查看当前句柄使用数
    cat /proc/sys/fs/file-nr
    1536(系统初始化的句柄数) 0(系统已经使用的句柄数) 1000000(最大可使用数)

  • TCP连接优化

# 控制 SYN 包重传的次数,默认值是5次
net.ipv4.tcp_syn_retries = 2
# 查看半连接队列已满,引发的失败次数
netstat -s | grep "SYNs to LISTEN"
# 调整SYN半连接队列大小,需tcp_max_syn_backlog的值和somaxconn、backlog(根据服务设定方式)值一同增大
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 32768
# 开启syncookies功能可以在不使用SYN半连接队列的情况下成功建立连接。0 值,表示关闭该功能;1 值,表示仅当 SYN 半连接队列放不下时,再启用它;2 值,表示无条件开启功能;
net.ipv4.tcp_syncookies = 1
# SYN_RCV优化,控制 SYN+ACK 包重传的次数,默认值是5次
net.ipv4.tcp_synack_retries = 2
# accept 队列的长度取决于somaxconn和backlog之间的最小值,min(somaxconn,backlog),somaxconn是内核参数,默认128,由net.core.somaxconn来设置
# 查看服务端进程 accept 队列的长度
ss -ltn
State            Recv-Q           Send-Q                     Local Address:Port                       Peer Address:Port
LISTEN           0                511                              0.0.0.0:80                              0.0.0.0:*
Recv-Q:当前accept队列的大小,也就是当前已完成三次握手并等待服务端accept()的TCP连接
Send-Q:accept 队列最大长度,上面的输出结果说明监听 80 端口的 TCP 服务,accept 队列的最大长度为511
# 当超过了 accept 连接队列,服务端则会丢掉后续进来的 TCP 连接,丢掉的 TCP 连接的个数会被统计起来,我们可以使用 netstat -s 命令来查看:
date;netstat -s | grep overflowed
# 无论作为客户端还是服务器,都打开Fast Open功能
net.ipv4.tcp_fastopen = 3

# 调整 FIN 报文重试次数为5次,默认值是0,特指8次
net.ipv4.tcp_orphan_retries = 5
# 调整孤儿连接最大次数
net.ipv4.tcp_max_orphans = 16384000
# 调整孤儿连接 FIN_WAIT2 状态的持续时间,默认值是60
net.ipv4.tcp_fin_timeout = 20

# 调整timewait最大个数
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1

# 扩充窗口
net.ipv4.tcp_window_scaling = 1
# TCP接收缓冲区范围
net.ipv4.tcp_rmem = 4096 87380 4194304
# TCP发送缓冲区范围
net.ipv4.tcp_wmem = 4096 16384 4194304
# TCP内存范围
net.ipv4.tcp_mem = 94500000 915000000 927000000
# 启动TCP接收缓冲区自动调节功能
echo 1 > /proc/sys/net/ipv4/tcp_moderate_rcvbuf

net.ipv4.tcp_sack = 1
net.ipv4.ip_local_port_range = 1024 65000
net.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.core.netdev_max_backlog = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

内核参数优化

永久修改:修改/etc/sysctl.conf配置文件里的值


参考:


anzhihe安志合个人博客,版权所有丨 如未注明,均为原创 丨转载请注明转自:https://chegva.com/3148.html | ☆★★每天进步一点点,加油!★★☆

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注