这篇文章主要介绍一些内核参数的含义,以及我们如何根据具体的尝尽对他们进行调优。
前言
每个系列,不同版本的内核可调节的参数可能略有不同,主流的3.10的内核可调节的内核参数多达2500个。
其中kernel的调节参数占大头73%(~1800),接着就是网络21%(~550),vm和file各有50左右。
下面的参数总结我们针对不同的参数类型,用不同的颜色进行标注。
配置项目 | 颜色标注 | 描述 |
蓝色 | 百度内部内核暴露出的独有参数 | |
粉色 | 需要重点关注的参数设置 |
由于可调节的内核参数过多,大部分可能我们现阶段可能用不到,所以,我们只总结当前可能用到的参数
网络
配置项 | 默认值 | 建议值 | 备注 |
net.core.bpf_jit_enable | 0 | 0 | //基于时间规则的编译器,用于基于PCAP(packet capture library)并使用伯克利包过滤器(Berkeley Packet Filter,如tcpdump)的用户工具,可以大幅提升复杂规则的处理性能。0禁止,1开始 |
net.core.message_burst | 1 | 10 | //设置每十秒写入多少次请求警告;此设置可以用来防止DOS攻击 |
net.core.message_cost | 60 | 5 | //置每一个警告的度量值,缺省为5,当用来防止DOS攻击时设置为0 |
net.core.rmem_default | 135168 | 2500000 | //设置接收socket的缺省缓存大小(字节) |
net.core.somaxconn | 2048 | 65535 | //定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。高并发下,全连接队列的长度 |
net.core.wmem_default | 135168 | 2500000 | //设置发送的socket缺省缓存大小(字节) |
net.ipv4.baidu_cwnd_init_loss | 3 | 7 | // RTO触发丢包检测丢包后的初始窗口大小 |
net.ipv4.baidu_init_cwnd | 10 | 24 | // iw初始拥塞窗口,3.10 默认是10 |
net.ipv4.baidu_init_rcv_wnd | 17 | 10 | // 初始接受窗口 |
net.ipv4.baidu_ss_enable | 0 | 1 | // slow start的开关,干预对慢启动阶段cwnd的增长幅度计算(增幅), 0表示不开启 |
net.ipv4.baidu_ssthresh_max | 120 | 110 | // 慢启动阈值<tcp_max_ssthresh则是慢启动阶段 |
net.ipv4.baidu_ssthresh_rtt_thresh | 0 | 10 | // set ssthresh based on rtt,now_rtt>这个阈值,则倍数增加snd_ssthresh,最大不超过baidu_ssthresh_max |
net.ipv4.baidu_synack_linear_retries | 0 | 8 | // synack的重传次数,超过应该直接丢弃请求 |
net.ipv4.baidu_synack_timeout_moderate_cwnd | 0 | 1 | // include/net/tcp.h,优化握手阶段的拥塞窗口,重传次数超过sysctl_baidu_synack_linear_retries则设置窗口为 baidu_cwnd_init_loss,如未超过则进入拥塞避免,窗口设置为初始窗口 |
net.ipv4.baidu_tcp_cwnd_enlarge | 0 | 1 | // tcp_cwnd_reduction异常时窗口减少不会太激进 |
net.ipv4.baidu_tcp_cwnd_sndcnt_limit | 0 | 1 | // tcp cwnd Additional increase in prr,加速快重传窗口恢复到快恢复 |
net.ipv4.baidu_tcp_enlarge_cwnd_after_recovery | 0 | 2 | // tcp cwnd Additional increase after recovery |
net.ipv4.baidu_tcp_fast_tlp_period_scale | 0 | 2 | // TLP尾部探测 |
net.ipv4.baidu_tcp_fast_tlp_thresh | 0 | 3 | // send pkts threshold to trigger fast tlp |
net.ipv4.baidu_tcp_fin_data_uncouple | 0 | 1 | // tcp_output.c 干预tcp_send_fin() 在发送fin时如果写队列还有包没发完,设置=0会直接发fin,设置1会发完数据 |
net.ipv4.baidu_tcp_init_rto | 1000 | 150 | // 超时RTO,设置的太长了 int sysctl_baidu_tcp_init_rto __read_mostly = (unsigned)HZ; 内核固化的值,除非重编内核 TCP/IP重传超时--RTO_onelight1997的博客-CSDN博客 |
net.ipv4.baidu_tcp_linear_retries | 0 | 4 | // rto linear retries number,out_reset_timer,用户调整thin包的超时时钟 |
net.ipv4.baidu_tcp_lost_reduce | 0 | 1 | // Number of additional lost packets marked,Reno计算lost包数量时额外加了一个常量,不明白 |
net.ipv4.baidu_tcp_probe_max_interval | 0 | 60 | 设置最大超时tcp_ack_probe(),如果TCP有数据要发送,而对端通告窗口为0,则持续定时器启动,超时后向对端发送1字节的数据,以判断对端接收窗口是否已经打开 |
net.ipv4.baidu_tcp_probe_orphan_retries | 0 | 9 | 零窗口探测 tcp_probe_timer(),干预对孤儿socket的重传次数max_probe = baidu_tcp_probe_orphan_retries |
net.ipv4.baidu_tcp_probe_retries | 0 | 23 | 零窗口探测 tcp_probe_timer(),干预对孤儿socket的重传次数max_probe = baidu_tcp_probe_orphan_retries |
net.ipv4.baidu_tcp_retran_prefer_thresh | 0 | 3 | 非零值,且lost>这个阈值,则 cwnd = cwnd - sysctl_baidu_tcp_retran_prefer_reserve,如果in_flight < cwnd,return min(halfcwnd, cwnd - in_flight)。影响MTU探测 Send at most one packet when push_one > 0. Temporarily ignore,cwnd limit to force at most one packet out when push_one == 2 |
net.ipv4.baidu_tcp_rto_max | 120000 | 800 | max rto 单位ms bfe的是默认值 内核写死 |
net.ipv4.baidu_tcp_rto_min | 200 | 40 | min rto bfe的是默认值 内核写死 |
net.ipv4.baidu_tcp_slow_rto_line | 0 | 400 | rtt threshold to use slow rto max |
net.ipv4.baidu_tcp_slow_rto_max | 0 | 2000 | 与baidu_tcp_slow_rto_line一起计算max rto |
net.ipv4.conf.lo.accept_source_route | 0 | 1 | 安全选项,通常关闭,减少ddos |
net.ipv4.conf.lo.rp_filter | 1 | 0 | 开启源地址校验,0关闭,1严格校验,2宽松校验,减少ddos |
net.ipv4.ip_local_port_range | 32768 60999 | 10000 61000 | 调大可用端口的使用范围 |
net.ipv4.ipfrag_secret_interval | 0 | 600 | 定时重组ipq散列表的时间间隔,默认值为600s,影响IP分包和重组 |
net.ipv4.neigh.default.unres_qlen | 106 | 30 | 最大挂起arp请求的数量,这些请求都正在被解析中. |
net.ipv4.neigh.default.unres_qlen_bytes | 229376 | 65536 | 最大处理arp包的字节数 |
net.ipv4.neigh.lo.unres_qlen | 106 | 30 | ARP每个没有被其它网络层解析邻居路由地址,在队列中可存放包的最大数目。缺省值3 |
net.ipv4.neigh.lo.unres_qlen_bytes | 229376 | 65536 | ARP 其默认值为SK_WMEM_MAX(即net.core.wmem_default),内核建议此值的设置应能够容纳256个中型长度的报文 |
net.ipv4.neigh.xgbe0.unres_qlen | 106 | 30 | ARP |
net.ipv4.neigh.xgbe0.unres_qlen_bytes | 229376 | 65536 | ARP |
net.ipv4.tcp_abort_on_overflow | 1 | 0 | tcp_abort_on_overflow 为0表示如果三次握手第三步的时候全连接队列满了那么server扔掉client 发过来的ack(在server端认为连接还没建立起来),server发送一个reset包给client,表示废掉这个握手过程和这个连接,会导致connet reset by peer 记一次惊心的网站TCP队列问题排查经历 - 知乎 |
net.ipv4.tcp_allowed_congestion_control | cubic reno | boostv3_2 boostv3_1 boostv3 leicesterv2 cubic reno | 拥塞控制算法配置 |
net.ipv4.tcp_available_congestion_control | cubic reno | boostv3_2 boostv3_1 boostv3 leicesterv2 cubic reno boost boost_pk | 拥塞控制算法配置 |
net.ipv4.tcp_base_mss | 1024 | 512 | TCP的MTU探测的基础MSS默认初始化为1024,见宏定义TCP_BASE_MSS,可通过PROC文件tcp_base_mss修改其值 TCP的MTU探测功能_tcp_mtu_probing_redwingz的博客-CSDN博客 |
net.ipv4.tcp_challenge_ack_limit | 1000 | 100 | 默认值1000,PROC文件tcp_challenge_ack_limit控制每秒钟发送挑战ACK报文的数量。避免遭受Blind In-Window Attacks,包括reset,sync或者数据注入攻击等,详解RFC5961 TCP挑战ACK报文限速_challenge ack_redwingz的博客-CSDN博客 |
net.ipv4.tcp_congestion_control | cubic | boostv3_2 | 拥塞控制算法配置 |
net.ipv4.tcp_fack | 0 | 1 | 对sack协议加以完善,改进tcp的拥塞控制机制,打开FACK(Forward ACK) 拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效) |
net.ipv4.tcp_fastopen | 1 | 0 | TFO,三次握手server直接会数据,移动场景应该有收益。默认开启=1 |
net.ipv4.tcp_fin_timeout | 60 | 30 | 默认值60s,决定了它保持在FIN-WAIT-2状态的时间,加速TIME_WAIT回收以下参数配合 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 |
net.ipv4.tcp_max_syn_backlog | 2048 | 65536 | 定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过tcp_max_syn_backlog后,会丢弃后续的SYN报文。 |
net.ipv4.tcp_max_tw_buckets | 262144 | 500000 | 表示系统同时保持TIME_WAIT套接字的最大数量,超过阈值netstat打印TCP: time wait bucket table overflow,会reset client请求。系统当前使用量 cat /proc/net/sockstat 24W |
net.ipv4.tcp_mem | 524288 681574 1048576 | 4633476 6177969 9266952 | 调整TCP的内存大小,其单位是页,1页等于4096字节,三个配置low, pressure, high。 内存占用超过high系统会拒绝分配socket,后台输出“TCP: too many of orphaned sockets”。1048576*4/1024K = 4096M。 每个链接大约7.5KB内存,如果百万链接大约需要7.15G内存。默认配置偏小 |
net.ipv4.tcp_notsent_lowat | 4.295E+09 | -1 | tcp_notsent_lowat控制发送缓存队列中的未发送数据量,低于此值可发送,超出此值停止发送,按初始值 |
net.ipv4.tcp_orphan_retries | 5 | 9 | 参数控制主动关闭段发送FIN,没有收到回应,重复发送FIN的次数。由于发送了FIN,处于FIN_WAIT_1状态,重负载web服务器建议调小 |
net.ipv4.tcp_reordering | 3 | 3 | 判断丢包的dup ack数量 |
net.ipv4.tcp_retries1 | 3 | 5 | 它表示的是TCP传输失败时不检测路由表的最大的重试次数,RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。 |
net.ipv4.tcp_retries2 | 5 | 23 | 数据重传次数超过 tcp_retries2 会直接放弃重传,关闭 TCP 流 |
net.ipv4.tcp_slow_start_after_idle | 1 | 0 | tcp连接在空闲xx毫秒后进入slow start阶段,默认值1,降低tcp传输性能。需禁止,设置成0 Tcp性能调优 解决Tcp长延时_解决tcp延迟_guangyinglanshan的博客-CSDN博客 |
net.ipv4.tcp_syn_retries | 1 | 4 | 在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包;并且决定了等待时间(2^n -1) |
net.ipv4.tcp_synack_retries | 2 | 30 | 在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃,三次握手的第二步 |
net.ipv4.tcp_thin_linear_timeouts | 0 | 1 | 重传超时后要去检查tcp stream是不是 thin ( less than 4 packets in flight),默认值0,当该参数打开的时候,前6次RTO超时触发的重传并不进行指数回退 |
net.ipv4.tcp_tso_win_divisor | 3 | 200 | 单个TSO段可消耗拥塞窗口的比例,默认值为3,TSO(TCP Segment Offload)利用网卡的处理能力,降低CPU发送数据包的负载,需要网卡硬件及驱动的支持。发送数据不用考虑MSS,把一部分CPU处理MSS的工作转移到网卡来处理 |
net.ipv4.udp_mem | 4495956 5994609 8991912 | 4634031 6178709 9268062 | UDP内存 |
net.ipv4.xfrm4_gc_thresh | 32768 | 1024 | IPv4目的地址缓存的垃圾回收阈值,超过阈值2倍,则不再新分配 xfrm4_gc_thresh | sysctl-explorer.net |
net.ipv6.conf.all.accept_dad | 0 | 1 | IPv6地址检测,Whether to accept DAD (Duplicate Address Detection). 0: Disable DAD 1: Enable DAD (default) 2: Enable DAD, and disable IPv6 operation if MAC-based duplicate link-local address has been found |
net.ipv6.conf.all.accept_ra | 1 | 0 | IPv6路由 |
net.ipv6.conf.all.accept_redirects | 1 | 0 | |
net.ipv6.conf.all.router_solicitations | -1 | 3 | |
net.ipv6.conf.default.accept_ra | 1 | 0 | |
net.ipv6.conf.default.accept_redirects | 1 | 0 | |
net.ipv6.conf.default.router_solicitations | -1 | 3 | |
net.ipv6.conf.lo.accept_ra | 1 | 0 | |
net.ipv6.conf.lo.accept_redirects | 1 | 0 | |
net.ipv6.conf.lo.router_solicitations | -1 | 3 | |
net.ipv6.conf.xgbe0.accept_ra | 1 | 0 | |
net.ipv6.conf.xgbe0.accept_redirects | 1 | 0 | |
net.ipv6.conf.xgbe0.mtu | 1492 | 1500 | |
net.ipv6.conf.xgbe0.router_solicitations | -1 | 3 | |
net.ipv6.ip6frag_secret_interval | 0 | 600 | |
net.ipv6.neigh.default.unres_qlen | 106 | 30 | |
net.ipv6.neigh.default.unres_qlen_bytes | 229376 | 65536 | |
net.ipv6.neigh.lo.unres_qlen | 106 | 30 | |
net.ipv6.neigh.lo.unres_qlen_bytes | 229376 | 65536 | |
net.ipv6.neigh.xgbe0.unres_qlen | 106 | 30 | |
net.ipv6.neigh.xgbe0.unres_qlen_bytes | 229376 | 65536 | |
net.ipv6.route.max_size | 4096 | 16384 | |
net.ipv6.xfrm6_gc_thresh | 32768 | 1024 |