2026/1/13 0:11:08
网站建设
项目流程
中山市企业网站seo营销工具,成都旅游学院,佛山免费建站平台,外包小程序价格上周线上服务扛不住流量#xff0c;运维群里一顿排查#xff0c;最后发现是内核参数没调。
默认配置跑个开发环境还行#xff0c;生产环境就是在给自己挖坑。
把这次调优过程记录一下#xff0c;都是踩过的坑。
背景
我们有台服务器#xff0c;配置不差#xff1a;
32核C…上周线上服务扛不住流量运维群里一顿排查最后发现是内核参数没调。默认配置跑个开发环境还行生产环境就是在给自己挖坑。把这次调优过程记录一下都是踩过的坑。背景我们有台服务器配置不差32核CPU64G内存万兆网卡但是一到高峰期CPU才30%连接数就上不去了大量请求超时。看了一圈监控发现是网络瓶颈但网卡带宽明明还有余量。问题定位现象# 查看连接状态ss -s Total:52341TCP:48234(estab12000, closed35000, orphaned0, timewait34500)# 发现大量TIME_WAITss -ant|awk{print$1}|sort|uniq-c|sort-rn34523TIME-WAIT12034ESTAB1234SYN-RECV423LISTEN3万多个TIME_WAIT正常吗短连接场景下其实很常见但这么多确实有问题。根因分析# 查看当前内核参数sysctl net.ipv4.tcp_max_tw_buckets# 输出net.ipv4.tcp_max_tw_buckets 180000sysctl net.core.somaxconn# 输出net.core.somaxconn 128sysctl net.ipv4.tcp_max_syn_backlog# 输出net.ipv4.tcp_max_syn_backlog 1024问题找到了somaxconn才128这是监听队列的最大长度tcp_max_syn_backlog才1024SYN队列太小高并发下新连接进来排队都排不下直接被丢弃了。调优方案一、网络连接相关# /etc/sysctl.conf# 1. 监听队列最大长度默认128太小net.core.somaxconn65535# 2. SYN队列长度net.ipv4.tcp_max_syn_backlog65535# 3. 允许的最大跟踪连接条目net.netfilter.nf_conntrack_max1000000# 4. TIME_WAIT状态的socket数量按需调整net.ipv4.tcp_max_tw_buckets200000# 5. TIME_WAIT复用仅限客户端发起连接时net.ipv4.tcp_tw_reuse1# 6. 开启SYN cookies防护net.ipv4.tcp_syncookies1# 7. 减少FIN_WAIT2状态时间net.ipv4.tcp_fin_timeout30二、TCP缓冲区相关# 接收缓冲区最小、默认、最大单位字节net.ipv4.tcp_rmem40968738016777216# 发送缓冲区net.ipv4.tcp_wmem40966553616777216# 系统级别的内存页面分配net.ipv4.tcp_mem78643210485761572864# 单个socket最大缓冲区net.core.rmem_max16777216net.core.wmem_max16777216三、文件描述符相关# 系统级最大文件描述符fs.file-max1000000# 单进程最大文件描述符需要配合ulimit# 在 /etc/security/limits.conf 中设置# * soft nofile 1000000# * hard nofile 1000000四、应用生效# 临时生效sysctl -p# 验证sysctl net.core.somaxconn# 输出net.core.somaxconn 65535调优前后对比压测数据用wrk压测同一个接口wrk -t12 -c1000 -d60s http://localhost:8080/api/test调优前Requests/sec: 8234.56 Latency: avg 234ms, max 3.2s Socket errors: connect 3421, read 234, write 0, timeout 523调优后Requests/sec: 23456.78 Latency: avg 42ms, max 234ms Socket errors: connect 0, read 0, write 0, timeout 0QPS从8000提升到23000延迟从234ms降到42ms错误归零。生产环境表现高峰期同样流量CPU使用率从30%提升到65%资源用起来了连接错误率从5%降到0.01%P99延迟从800ms降到120ms常见场景参数模板场景一高并发Web服务# 适合Nginx、Tomcat等Web服务器net.core.somaxconn65535net.ipv4.tcp_max_syn_backlog65535net.ipv4.tcp_tw_reuse1net.ipv4.tcp_fin_timeout30net.ipv4.tcp_keepalive_time600net.ipv4.tcp_keepalive_intvl60net.ipv4.tcp_keepalive_probes3# Nginx还需要改配置# worker_connections 65535;# 并且在listen后加 backlog65535场景二数据库服务器# 适合MySQL、PostgreSQL等# 内存相关根据实际内存调整vm.swappiness10vm.dirty_ratio10vm.dirty_background_ratio5# 文件系统fs.file-max1000000fs.aio-max-nr1048576# 网络数据库通常连接数不会太高但要稳定net.core.somaxconn4096net.ipv4.tcp_max_syn_backlog4096场景三代理/网关服务# 适合Nginx反向代理、API网关# 代理需要大量连接前端连接后端连接net.core.somaxconn65535net.ipv4.tcp_max_syn_backlog65535# 端口范围要大代理会用很多端口连后端net.ipv4.ip_local_port_range102465535# TIME_WAIT复用很重要net.ipv4.tcp_tw_reuse1# 连接跟踪表要大net.netfilter.nf_conntrack_max2000000net.netfilter.nf_conntrack_tcp_timeout_established1200一些坑坑1改了不生效# 检查是否真的改了sysctl -a|grepsomaxconn# 如果是容器环境宿主机和容器的参数是隔离的# 部分参数需要在宿主机改坑2Nginx的backlog改了系统参数Nginx也要配合改server { listen 80 backlog65535; # ... }不然Nginx用的还是默认值511。坑3改了参数服务起不来# 有些参数相互依赖比如net.core.netdev_max_backlog65535# 要配合网卡驱动支持不然可能有问题建议一个个改改完验证别一次改一堆。坑4容器环境Docker/K8s环境下大部分网络参数要在宿主机改fs.file-max在容器里可能改不了需要用--sysctl参数或者securityContext# K8s Pod配置spec:containers:-name:appsecurityContext:sysctls:-name:net.core.somaxconnvalue:65535监控建议调完参数不是结束要持续监控# 连接状态分布ss -ant|awk{print$1}|sort|uniq-c# 丢包情况netstat-s|grep-Edropped|overflow# 连接跟踪表使用情况cat/proc/sys/net/netfilter/nf_conntrack_countcat/proc/sys/net/netfilter/nf_conntrack_max写个脚本定期采集出问题才知道往哪查。异地运维小技巧我们有几台服务器在异地机房调参数的时候需要远程操作。之前用跳板机现在用星空组网把几台服务器组到一个虚拟网络里直接SSH就能连调参数方便多了。总结Linux内核参数调优核心就几个方向方向关键参数常见问题监听队列somaxconn, tcp_max_syn_backlog高并发连接失败TIME_WAITtcp_tw_reuse, tcp_fin_timeout端口耗尽缓冲区tcp_rmem, tcp_wmem大文件传输慢连接跟踪nf_conntrack_max防火墙导致丢包文件描述符file-max, nofiletoo many open files记住几个原则先定位问题再调参数别瞎调改完要验证压测或者灰度留好回滚方案持续监控别调完就忘了有内核调优经验的欢迎评论区交流~