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决定
如果配置都改了,cat /proc/pidxx/limits 文件限制数还是不生效,可以考虑杀掉老进程,进程重启后会读取新的内核配置
补充:
更改普通用户最大进程数,立即生效,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/shm
或sysctl -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配置文件里的值
参考: