常用Linux性能调优参数大全

Posted by BHH on January 21, 2021

常用Linux性能调优参数大全

Linux sysctl 参数

参数名 建议值 说明
fs.file-max 1207818 这个文件决定了系统级别所有进程可以打开的文件描述符的数量限制,如果内核中遇到VFS: file-max limit reached的信息,那么就提高这个值
net.core.rmem_max 16777216 增加系统套接字接收缓冲区
net.core.wmem_max 16777216 增加系统套接字发送缓冲区
net.ipv4.ip_local_port_range 2048 65535 增加本地端口使用范围,比如LVS进行NAT负载时,一定要修改本参数,如果端口还是不够用,只能增加内网ip地址池
net.ipv4.tcp_congestion_control cubic  
net.ipv4.tcp_fin_timeout 30 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接
net.ipv4.tcp_keepalive_time 1800 减少最大空闲连接等待时间,linux默认是7200s,可以尽快关闭空闲连接,释放资源
net.ipv4.tcp_max_syn_backlog 4096 增加TCP SYN队列长度,使系统可以处理更多的并发连接,还能防止受到 denial-of-service (syn-flood)的攻击
net.ipv4.tcp_rmem 4096 87380 16777216 优化TCP接收缓冲区
net.ipv4.tcp_wmem 4096 65536 16777216 优化TCP发送缓冲区
net.ipv4.tcp_timestamps 1 是否校验tcp包的时间戳,保持默认=1
net.ipv4.tcp_tw_recycle 0 tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况,本意是快速回收处于TIME_WAIT状态的连接以达到支持高并发连接的目的,但是由于其工作原理是在net.ipv4.tcp_timestamps=1的情况下,对相同源ip发出的tcp包的timestamp进行比较,如果比之前收到的包的timestamp小,会认为是一个重复包,将会被丢弃,因此在实际生产环境中可能会导致无故丢包,尤其是源ip是一个nat设备的话,转发的包来自实际不同的客户端,虽然源ip不变,但是timestamp可能会乱序,造成大量丢包。因此强烈建议保持默认=0
net.ipv4.tcp_tw_reuse 1 该参数只针对客户端有效,当需要短时间向服务器发起大量连接请求时,可以帮助客户端1s完成处于TIME_WAIT状态的连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。如果是负载均衡类的服务器,既是服务端,又是后端服务器的客户端,该参数建议设置为1
vm.swappiness 0 内核参数vm.swappiness控制换出运行时内存的相对权重,值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。默认值swappiness=60,表示内存使用率超过100-60=40%时开始使用交换分区。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间

Linux文件句柄参数

/etc/security/limits.conf 建议值 说明
* soft nofile 294180 用户最大可以打开的文件句柄数量
* hard nofile 294180 用户最大可以打开的文件句柄数量
* soft nproc 65535 用户最大进程数量,不能大于90-nproc.conf中的限制
* hard nproc 65535 用户最大进程数量,不能大于90-nproc.conf中的限制
/etc/security/limits.d/90-nproc.conf 建议值 说明
* soft nproc 65535 限制用户最大进程数量
* hard nproc 65535 限制用户最大进程数量

iptables设置

现场RESTFul服务曾经遇到一个问题,客户端连接数始终上不来,查看了服务器CPU,内存资源都很空闲,相关的系统参数也已经优化了,应用的log中也没有异常,最后只能去查看/var/log/message系统日志,果然发现问题,系统日志中有很多如下报错:

nf_conntrack: table full, dropping packet 于是上网查找原因,原来是防火墙的连接状态跟踪表满了引起的。解决方法有多种:

  1. 关闭防火墙,简单粗暴。

  2. 加大防火墙跟踪表的大小,优化对应的系统参数, 以64G的64位操作系统为例,CONNTRACK_MAX = 6410241024*1024/16384/2 = 2097152,运行以下命令:

    sysctl –w net.netfilter.nf_conntrack_max = 2097152

    其他相关的系统参数如下,也可以根据情况调整:

    net.netfilter.nf_conntrack_max  =   1048576  
    net.netfilter.ip_conntrack_tcp_timeout_established  =   3600  
    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_buckets = 16384
    
  3. iptables中添加“不跟踪”标识,比如:

    -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK 
    -A PREROUTING -p tcp -m tcp --dport 22 -j NOTRACK 
    -A PREROUTING -p tcp -m tcp --dport 21 -j NOTRACK 
    -A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK 
    -A PREROUTING -p tcp -m tcp --dport 60000:60100 -j NOTRACK 
    -A PREROUTING -p tcp -s 192.168.10.1 -j NOTRACK 
    -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK 
    -A OUTPUT -p tcp -m tcp --sport 22 -j NOTRACK 
    -A OUTPUT -p tcp -m tcp --sport 21 -j NOTRACK 
    -A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK 
    -A OUTPUT -p tcp -m tcp --sport 60000:60100 -j NOTRACK 
    -A OUTPUT -p tcp -s 192.168.10.1 -j NOTRACK