Linux内核参数调优
by:授客 QQ:1033553122
关于调优的建议:
1、出错时,可以查看操作系统日志,可能会找到一些有用的信息
2、尽量不要“批量”修改内核参数,笔者就曾这么干过,结果“调优”后,性能反而下降,事务出错数反而增加,所以,调优的时候可以考虑逐个参数进行调优,然后对比效果。
说明:我也不是很懂,参考自网络整理了下可能需要调整的一些参数
net.core.wmem_max=124928 发送套接字缓冲区大小的最大值(以字节为单位),参考值873200
net.core.rmem_max=124928 接收套接字缓冲区大小的最大值(以字节为单位),参考值873200
net.ipv4.tcp_wmem=4096 16384 4194304 为自动调优定义socket使用的内存.第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_rmem=4096 87380 4194304 为自动调优定义socket使用的内存.第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖), 缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)
net.ipv4.tcp_mem=177888 436600 873200 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB).第一个值是内存使用的下限,低于此值,TCP没有内存压力;第二个值是内存压力模式开始对缓冲区使用应用压力的上限,在此值下,进入内存压力阶段; 第三个值是内存使用的上限. 高于此值,TCP拒绝分配socket,将报文丢弃,从而减少对内存的使用.对于较大的商业数据平台可以增大这些值(注意,其单位是内存页而不是字节)
net.core.netdev_max_backlog=1000 每个网卡接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn=128 用来限制监听(LISTEN)队列最大数据包的数量,默认是128,超过这个数量就会导致链接超时或者触发重传机制.对繁忙的服务器,增加该值有助于网络性能.可调整到256
net.core.optmem_max=20480 socket buffer的最大初始化值,默认20k
net.core.netdev_max_backlog=1000,修改16384,每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点
net.core.wmem_default=124928 默认的发送窗口大小(以字节为单位)
net.core.rmem_default=124928 默认的接收窗口大小(以字节为单位)
net.core.wmem_max=124928 最大的TCP数据发送缓冲,参考值 873200
net.core.rmem_max=124928 最大的TCP数据接收缓冲,参考值873200
net.ipv4.tcp_max_syn_backlog=2048 默认1024,对重负载服务器,可调整到2048,以以容纳更多等待连接的网络连接
net.ipv4.tcp_retries2=5 TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,尽早释放内核资源
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_probes=9
net.ipv4.tcp_keepalive_intvl=75
意思是如果某个TCP连接在idle 2个小时(7200s)后,内核才发起探测(probe)。如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效,对服务器而言,显然上述值太大. 参考值如下:
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.ip_local_port_range="1024 65000" 表示用于向外连接的端口范围。参考值:1024 65000
net.ipv4.tcp_tw_reuse=1 表示开启重用。允许将处于TIME-WAIT 的socket重新用于新的TCP连接,默认为0,表示关闭,根据TCP/IP协议,连接断开之后,端口不会立刻被释放,而是处于TIME_WAIT状态,等待两分钟半后,才会被释放掉,才能被新连接使用,大量并发的情况下,如果已被占用的端口号未被释放,部分新建连接因为无法分配到端口号而失败。
通过配置TCP_TW_REUSE参数,来释放TIME_WAIT状态的端口号给新连接使用
net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout=30 默认值60,这个参数决定了它保持在FIN-WAIT-2状态的时间,参考值 30(一般来说FIN-WAIT-2的连接也极少)
net.ipv4.tcp_max_tw_buckets=5000 默认为 131072,参考值5000,表示系统同时保持TIME_WAIT socket的最大数量,如果超过这个数字,TIME_WAIT socket将立刻被清除并打印警告信息。事实上做NAT的时候最好可以适当地增加该值)
对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量
net.ipv4.tcp_sack=1 默认开启,启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用
net.ipv4.tcp_fack=1 仅sack=1时起作用,默认开启,启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用。
net.ipv4.tcp_timestamps=1 默认开启,TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。
net.ipv4.tcp_window_scaling=1 默认开启,启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效。
net.ipv4.tcp_low_latency=0 允许TCP/IP栈适应在高吞吐量情况下低延时的情况,这个选项应该禁用。
net.ipv4.tcp_syn_retries=2 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间,对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接, 是由tcp_retries1决定的
net.ipv4.tcp_synack_retries=2 默认5,对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间,可修改为2
net.ipv4.tcp_orphan_retries=0 在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考tcp_max_orphans。
net.ipv4.tcp_syncookies=0 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
以下几个参数文件需要打开防火墙才会存在
net.netfilter.nf_conntrack_max=65536 系统支持的最大ipv4连接数,默认65536(事实上这也是理论最大值),同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536,这个值受/proc/sys/net/ipv4/ip_conntrack_max限制
net.netfilter.nf_conntrack_tcp_timeout_established=432000 已建立的tcp连接的超时时间,默认432000,也就是5天。影响:这个值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题。建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能需要考虑缩小这个值,以尽早清除连接,保证有可用的连接资源;如果不紧张,不必修改
net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 time_wait状态超时时间,超过该时间就清除该连接,保持不变
net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 close_wait状态超时时间,超过该时间就清除该连接,保持不变
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120 fin_wait状态超时时间,超过该时间就清除该连接,同上
作者:授客
QQ:1033553122
全国软件测试QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏
支付宝打赏 全国软件测试交流QQ群