今天TMD开会,一群SB高管又在扯什么“云原生”、“中台战略”,搞得好像用了K8S就能上天似的。我呸!真正的性能瓶颈在哪儿他们懂个屁?一个个PPT画得飞起,Linux内核调优、TCP/IP协议栈优化他们碰过吗?监控系统只会看个Dashboard,Prometheus的PromQL写过几条?只会喊口号,真TM恶心!
K8S集群网络性能问题排查:别光盯着应用层,看看内核参数!
现在K8S集群的网络问题,十个有八个都是内核参数没调好。应用层出了问题,抓抓包、看看日志,这没毛病。但如果应用层没问题,网络延迟就是高,丢包就是严重,那就要往下挖了!别TM就知道重启Pod,先看看你的内核参数是不是屎一样!
TCP/IP内核参数优化:不要用默认配置,除非你想被吊打
Linux内核的TCP/IP协议栈那一堆参数,默认配置就是给你们这些小白用的。生产环境,特别是高并发、大数据量的场景,必须根据实际情况调整。不然,等着被吊打吧!
我这里列几个最容易出问题的参数,你们自己好好看看:
关键TCP/IP参数详解
1. tcp_tw_recycle 和 tcp_timestamps:
这两个参数,网上TM一堆文章说可以解决TIME_WAIT过多的问题。在NAT环境下,开了tcp_tw_recycle,直接导致连接失败!为啥?tcp_timestamps开启后,TCP连接会记录时间戳,tcp_tw_recycle会拒绝时间戳比之前老的连接。NAT后面的客户端,可能时间戳都是一样的,直接被内核给丢弃了。正确的姿势是关闭tcp_tw_recycle,用tcp_tw_reuse + tcp_timestamps 才是王道。
# 禁用 tcp_tw_recycle
sysctl -w net.ipv4.tcp_tw_recycle=0
# 开启 tcp_tw_reuse
sysctl -w net.ipv4.tcp_tw_reuse=1
# 确保 tcp_timestamps 开启
sysctl -w net.ipv4.tcp_timestamps=1
2. tcp_syn_retries 和 tcp_synack_retries:
这两个参数控制TCP握手失败时的重试次数。默认值一般都偏大,在高并发场景下,会占用大量资源,导致SYN Flood攻击。适当降低这两个值,可以提高系统的抗攻击能力。
# 降低 SYN 重试次数
sysctl -w net.ipv4.tcp_syn_retries=3
# 降低 SYN-ACK 重试次数
sysctl -w net.ipv4.tcp_synack_retries=3
3. tcp_rmem 和 tcp_wmem:
这两个参数定义了TCP接收和发送缓冲区的大小。如果你的应用需要处理大量数据,默认值肯定不够用。适当增大这两个值,可以提高TCP的吞吐量。注意,不要设置太大,否则会占用大量内存。
# 增大 TCP 接收缓冲区
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'
# 增大 TCP 发送缓冲区
sysctl -w net.ipv4.tcp_wmem='4096 87380 16777216'
4. net.core.somaxconn 和 tcp_max_syn_backlog:
这两个参数控制TCP连接的backlog队列大小。在高并发场景下,如果backlog队列满了,新的连接会被拒绝。增大这两个值,可以提高系统的并发连接能力。
# 增大 backlog 队列大小
sysctl -w net.core.somaxconn=65535
# 增大 SYN backlog 队列大小
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
应用到K8S集群:DaemonSet才是正解
改内核参数,最TM忌讳的就是手动一台台改。集群几百台机器,你改到猴年马月?用DaemonSet啊!把sysctl命令写到脚本里,做成一个镜像,然后用DaemonSet跑起来,保证每台Node都执行。这才是运维的正确姿势!
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: sysctl-tuning
namespace: kube-system
spec:
selector:
matchLabels:
name: sysctl-tuning
template:
metadata:
labels:
name: sysctl-tuning
spec:
hostPID: true
containers:
- name: sysctl
image: your-sysctl-image:latest #换成你自己的镜像
securityContext:
privileged: true
command: ["/bin/sh", "-c"]
args:
- |
#!/bin/bash
sysctl -w net.ipv4.tcp_tw_recycle=0
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_syn_retries=3
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'
sysctl -w net.ipv4.tcp_wmem='4096 87380 16777216'
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
记住,这些参数不是一成不变的,要根据你的应用场景和硬件环境进行调整。监控才是王道!用Prometheus监控TCP连接数、丢包率、延迟等指标,根据监控数据不断优化。
现在这些年轻人,就知道抄别人的配置,也不想想自己环境适不适合。网络调优这玩意儿,必须自己动手,深入理解原理,才能真正解决问题。别TM只会喊“云原生”,先把Linux内核搞明白了再说!