找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2487

积分

0

好友

335

主题
发表于 1 小时前 | 查看: 1| 回复: 0

面对突发的流量洪峰,你的服务器是否曾因连接数暴涨而拒绝服务?或是数据库在压力下出现令人头疼的性能抖动?很多时候,问题的根源并非应用代码,而在于操作系统内核的“默认设置”未能跟上业务发展的步伐。对 /etc/sysctl.conf 进行针对性调优,是释放系统潜力、保障服务稳定的关键一步。

本文将为你提供一份从诊断、优化到验证的完整清单,覆盖高并发 Web 服务器、数据库以及容器(K8s/Docker)宿主机等核心生产场景。

适用场景 & 前置条件

适用业务:高并发 Web/API 服务器、数据库服务器、负载均衡器、容器宿主机(QPS > 1000)
前置条件

  • Linux 内核 ≥ 3.10(RHEL 7)/ ≥ 4.15(Ubuntu 18.04)
  • Root 权限或可 sudo
  • 现有配置备份(/etc/sysctl.conf/etc/sysctl.d/*.conf
  • 了解当前业务类型(CPU 密集/网络密集/内存密集)

环境与版本矩阵

内核版本 OS 支持 典型应用场景 关键差异
3.10.x RHEL/CentOS 7 传统 Web/数据库 BBR 不可用,需升级内核
4.9.x Ubuntu 16.04, Debian 9 通用服务器 BBR 可用(需手动启用)
4.15.x Ubuntu 18.04 容器宿主机 cgroup v1,net.core 参数更多
5.4.x+ RHEL 8, Ubuntu 20.04/22.04 高性能计算/K8s cgroup v2,TCP 拥塞控制增强

快速清单(Checklist)

  1. 备份当前内核参数sysctl -a 导出)
  2. 识别业务类型与瓶颈(CPU/网络/内存/磁盘 I/O)
  3. 应用网络连接数优化(高并发 TCP 连接)
  4. 优化 TCP 协议栈(快速回收/TIME_WAIT/BBR)
  5. 调整内存与 Swap 策略(OOM/脏页回写)
  6. 优化文件描述符与 IPC 限制(ulimit/共享内存)
  7. 应用参数并验证sysctl -p 与回显确认)
  8. 压测验证性能提升(wrk/ab/sysbench)
  9. 监控关键指标变化(连接数/丢包率/延迟)
  10. 持久化配置并文档化(版本管理与变更记录)

实施步骤

Step 1:备份当前内核参数

导出所有当前参数

# 导出到文件
sysctl -a > /root/sysctl-backup-$(date +%Y%m%d-%H%M%S).txt

# 备份配置文件
cp /etc/sysctl.conf /etc/sysctl.conf.backup
cp -r /etc/sysctl.d/ /etc/sysctl.d.backup/

验证备份完整性

wc -l /root/sysctl-backup-*.txt
# 预期输出:800-1200 行(根据内核版本)

查看当前关键参数

sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.ip_local_port_range

Step 2:识别业务类型与瓶颈

诊断网络连接数瓶颈

# 查看当前连接数
ss -s

# 查看 TIME_WAIT 连接数
ss -tan | grep TIME_WAIT | wc -l

# 查看 SYN_RECV 连接数(半连接队列)
ss -tan | grep SYN_RECV | wc -l

# 查看监听队列溢出统计
netstat -s | grep -E "listen|overflow"

预期问题特征

  • TIME_WAIT > 5000:需优化快速回收
  • SYN_RECV > 100:需增大半连接队列
  • listen queue overflow:需增大 somaxconn

诊断内存瓶颈

free -h
cat /proc/meminfo | grep -E "Dirty|Writeback|Committed"

预期问题特征

  • Dirty > 1GB:脏页过多影响 I/O
  • Committed_AS > MemTotal:内存超卖严重

Step 3:应用网络连接数优化(高并发场景)

创建 /etc/sysctl.d/90-network-tuning.conf

# === 网络核心参数 ===

# 增大监听队列长度(应用层 listen() 的 backlog 上限)
# 默认 128,高并发场景建议 4096-65535
net.core.somaxconn = 65535

# 增大网卡接收队列(防止网卡丢包)
# 默认 1000,建议 10000-65535
net.core.netdev_max_backlog = 65535

# 增大系统默认接收/发送缓冲区(单位:字节)
# 默认 ~200KB,建议 4MB
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304

# 增大系统最大接收/发送缓冲区
# 默认 ~4MB,建议 16MB
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# === TCP 协议栈优化 ===

# 增大 TCP 半连接队列(SYN_RECV 状态)
# 默认 128/256,高并发建议 8192-65535
net.ipv4.tcp_max_syn_backlog = 65535

# 扩大本地端口范围(客户端连接可用端口)
# 默认 32768-60999,建议 10000-65535(支持 55535 个并发连接)
net.ipv4.ip_local_port_range = 10000 65535

# 增大全局最大连接数(所有 TCP 连接的跟踪表)
# 默认根据内存动态计算,手动设置可避免自动限制
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576 # 旧版内核兼容

# 增大连接跟踪表 bucket 数量(优化查找性能)
# 建议为 nf_conntrack_max 的 1/4
net.netfilter.nf_conntrack_buckets = 262144

# === TCP 缓冲区自动调优 ===

# TCP 读缓冲区(min/default/max,单位:字节)
# 第 3 值为单连接最大值,建议 16MB(支持高带宽长肥网络)
net.ipv4.tcp_rmem = 4096 87380 16777216

# TCP 写缓冲区
net.ipv4.tcp_wmem = 4096 65536 16777216

# TCP 内存限制(min/pressure/max,单位:页,1 页 = 4KB)
# 计算公式:(总内存 GB × 0.25) / 4 × 1024 × 1024
# 示例:32GB 内存 → max = 2097152 页 = 8GB
net.ipv4.tcp_mem = 786432 1048576 2097152

应用配置

sysctl -p /etc/sysctl.d/90-network-tuning.conf

验证生效

sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.ip_local_port_range

预期输出

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10000 65535

Step 4:优化 TCP 协议栈(连接复用与快速回收)

继续编辑 /etc/sysctl.d/90-network-tuning.conf

# === TCP TIME_WAIT 优化 ===

# 启用 TIME_WAIT 快速回收(客户端场景,如反向代理/负载均衡)
# 注意:不适用于 NAT 环境(可能导致连接失败)
net.ipv4.tcp_tw_reuse = 1

# TIME_WAIT 超时时间(秒)
# 默认 60s,可降低到 30s(需确保网络延迟 < 15s)
# 注意:内核 4.12+ 已移除此参数,改为固定 60s
# net.ipv4.tcp_tw_timeout = 30  # 仅旧内核支持

# 减少 TIME_WAIT 连接数(通过启用快速回收 + 端口复用)
# 已通过 tcp_tw_reuse 实现

# === TCP 连接保活 ===

# TCP keepalive 探测间隔(秒)
# 默认 75s,建议 30s(快速检测死连接)
net.ipv4.tcp_keepalive_intvl = 30

# TCP keepalive 探测次数
# 默认 9 次,建议 3 次(90 秒内检测出死连接)
net.ipv4.tcp_keepalive_probes = 3

# TCP keepalive 空闲时间(秒)
# 默认 7200s(2 小时),建议 600s(10 分钟)
net.ipv4.tcp_keepalive_time = 600

# === TCP 拥塞控制(BBR 算法)===

# 查看可用拥塞控制算法
# sysctl net.ipv4.tcp_available_congestion_control

# 启用 BBR(需要内核 4.9+)
# BBR 可显著提升带宽利用率与降低延迟
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq  # BBR 依赖 FQ 队列调度

# === TCP 快速打开(TFO)===

# 启用 TCP Fast Open(客户端 + 服务端)
# 0=禁用, 1=客户端, 2=服务端, 3=全部启用
# 建议值:3(需应用层支持,如 Nginx 1.5.8+)
net.ipv4.tcp_fastopen = 3

# === FIN_WAIT 超时优化 ===

# 减少 FIN_WAIT2 超时时间(秒)
# 默认 60s,建议 30s
net.ipv4.tcp_fin_timeout = 30

# === SYN Cookie(防 SYN Flood 攻击)===

# 启用 SYN Cookie
# 当 SYN 队列溢出时,使用 Cookie 机制避免拒绝连接
net.ipv4.tcp_syncookies = 1

# 增大 SYN Cookie 的重试次数
# 默认 5,建议 2(减少握手延迟)
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

关键参数解释

  • tcp_tw_reuse:允许新连接复用 TIME_WAIT 状态的端口(仅客户端)
  • tcp_congestion_control = bbr:使用 BBR 算法替代 CUBIC(需内核 4.9+)
  • tcp_fastopen:首次握手时携带数据(减少 1 RTT 延迟)

验证 BBR 启用

# 检查当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 检查 BBR 模块是否加载
lsmod | grep tcp_bbr

如 BBR 未加载(需手动加载):

# 加载 BBR 模块
modprobe tcp_bbr

# 持久化加载
echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf

应用配置

sysctl -p /etc/sysctl.d/90-network-tuning.conf

Step 5:调整内存与 Swap 策略

创建 /etc/sysctl.d/91-memory-tuning.conf

# === Swap 策略 ===

# 降低 Swap 使用倾向(swappiness)
# 默认 60,建议值:
# - 0-10:数据库/缓存服务器(避免性能抖动)
# - 10-30:通用服务器
# - 60:桌面系统
vm.swappiness = 10

# === 脏页回写优化 ===

# 脏页占总内存的百分比阈值(触发后台回写)
# 默认 10-20%,建议 5%(避免突发 I/O)
vm.dirty_background_ratio = 5

# 脏页占总内存的百分比阈值(触发阻塞回写)
# 默认 20-40%,建议 10%
vm.dirty_ratio = 10

# 脏页最长存活时间(厘秒,1/100 秒)
# 默认 3000(30 秒),建议 1500(15 秒)
vm.dirty_expire_centisecs = 1500

# 脏页回写间隔(厘秒)
# 默认 500(5 秒),建议 200(2 秒)
vm.dirty_writeback_centisecs = 200

# === 内存分配策略 ===

# 内存超卖策略(overcommit)
# 0=严格检查, 1=允许超卖, 2=允许超卖但限制在 overcommit_ratio
# 建议值:容器宿主机=0,通用服务器=1
vm.overcommit_memory = 1

# 超卖比例(百分比)
# 默认 50,仅当 overcommit_memory=2 时生效
vm.overcommit_ratio = 80

# === OOM Killer 策略 ===

# 内核 Panic 行为(OOM 时是否重启)
# 0=不重启, 1=重启
# 生产环境建议 0(避免自动重启)
vm.panic_on_oom = 0

# OOM Killer 触发阈值(0-100)
# 默认 0(内存完全耗尽时触发)
# 可设置为 5-10(预留缓冲)
# vm.admin_reserve_kbytes = 8192  # 预留 8MB 给 root 用户

# === 透明大页(THP)===

# 禁用透明大页(数据库场景建议禁用)
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 通过 systemd 持久化(需创建 systemd 服务)

关键参数解释

  • vm.swappiness:值越低,内核越倾向使用物理内存
  • vm.dirty_ratio:脏页达到此阈值时,写入进程会被阻塞(影响性能)
  • vm.overcommit_memory=1:允许申请超过物理内存的空间(适合 fork 密集场景)

禁用透明大页(数据库/Redis 场景):

# 临时禁用
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 持久化禁用(通过 systemd)
cat > /etc/systemd/system/disable-thp.service << EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service mysql.service redis.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
WantedBy=basic.target
EOF

systemctl enable disable-thp.service
systemctl start disable-thp.service

应用配置

sysctl -p /etc/sysctl.d/91-memory-tuning.conf

验证生效

sysctl vm.swappiness vm.dirty_ratio vm.overcommit_memory
cat /sys/kernel/mm/transparent_hugepage/enabled

Step 6:优化文件描述符与 IPC 限制

创建 /etc/sysctl.d/92-limits-tuning.conf

# === 文件描述符限制 ===

# 系统级最大文件描述符数量
# 默认 ~100000,高并发建议 1000000-10000000
fs.file-max = 2097152

# 单个进程最大文件描述符数(需配合 ulimit)
# 通过 /etc/security/limits.conf 设置

# === 共享内存限制(数据库/消息队列场景)===

# 单个共享内存段最大字节数
# 默认 32MB,数据库建议设置为物理内存的 50%
# 计算公式:物理内存(GB) × 0.5 × 1024^3
# 示例:32GB 内存 → 17179869184(16GB)
kernel.shmmax = 68719476736 # 64GB

# 系统范围共享内存总量(页数,1 页 = 4KB)
# 默认值较低,建议设置为 shmmax / 4096
kernel.shmall = 16777216 # 64GB / 4KB

# 共享内存段最大数量
# 默认 4096,大规模容器宿主机建议 65536
kernel.shmmni = 65536

# === 信号量限制 ===

# 信号量参数(数据库场景)
# 格式:SEMMSL SEMMNS SEMOPM SEMMNI
# SEMMSL:每个信号量集最大信号量数
# SEMMNS:系统范围最大信号量数
# SEMOPM:每次 semop 调用最大操作数
# SEMMNI:系统范围最大信号量集数
kernel.sem = 250 32000 100 128

# === IPC 消息队列 ===

# 单个消息最大字节数
# 默认 8192,建议 65536
kernel.msgmax = 65536

# 单个队列最大字节数
# 默认 16384,建议 1048576(1MB)
kernel.msgmnb = 1048576

配合 ulimit 调整进程级限制

编辑 /etc/security/limits.conf

# 格式:<domain> <type> <item> <value>

# 所有用户打开文件数限制
*               soft    nofile          1048576
*               hard    nofile          1048576

# 特定用户(如 nginx/mysql)
nginx           soft    nofile          1048576
nginx           hard    nofile          1048576

mysql           soft    nofile          1048576
mysql           hard    nofile          1048576

# 进程数限制
*               soft    nproc           65536
*               hard    nproc           65536

# 核心转储文件大小(调试用,生产环境可设为 0)
*               soft    core            0
*               hard    core            0

验证 ulimit 生效(需重新登录):

# 查看当前会话限制
ulimit -a

# 查看特定进程的限制
cat /proc/$(pidof nginx | awk '{print $1}')/limits

应用配置

sysctl -p /etc/sysctl.d/92-limits-tuning.conf

Step 7:容器宿主机专用优化(K8s/Docker)

创建 /etc/sysctl.d/93-container-tuning.conf

# === 网桥与 iptables ===

# 允许 iptables 处理桥接流量(K8s 必需)
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 启用 IP 转发(容器间路由)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

# === Netfilter 连接跟踪 ===

# 增大连接跟踪表(容器密集场景)
net.netfilter.nf_conntrack_max = 2097152

# 连接跟踪超时(秒)
# TCP 已建立连接超时,默认 432000(5 天),建议 3600(1 小时)
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

# TIME_WAIT 连接跟踪超时,默认 120s,建议 30s
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30

# === ARP 缓存 ===

# 增大 ARP 缓存表(大量 Pod 场景)
# 默认 ~256,建议 8192
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

# === 内核线程数 ===

# 增大内核线程数限制(容器密集场景)
kernel.threads-max = 1048576
kernel.pid_max = 4194304

# === 虚拟内存 ===

# 降低容器场景的内存回收激进度
vm.min_free_kbytes = 1048576 # 预留 1GB 空闲内存

关键参数解释

  • net.bridge.bridge-nf-call-iptables:K8s Service 流量经过 iptables 规则
  • nf_conntrack_max:容器化场景连接数通常 > 虚拟机
  • vm.min_free_kbytes:预留内存避免内存碎片导致 OOM

应用配置

# 加载 br_netfilter 模块(K8s 必需)
modprobe br_netfilter
echo "br_netfilter" >> /etc/modules-load.d/k8s.conf

sysctl -p /etc/sysctl.d/93-container-tuning.conf

Step 8:压测验证性能提升

Web 服务器压测(使用 wrk):

# 安装 wrk
# Ubuntu
sudo apt install -y wrk

# RHEL/CentOS(需要 EPEL)
sudo yum install -y epel-release && sudo yum install -y wrk

# 压测前记录基线
wrk -t 8 -c 1000 -d 60s --latency http://localhost/

# 应用内核参数调优后重新压测
wrk -t 8 -c 1000 -d 60s --latency http://localhost/

预期性能提升(高并发场景):

  • QPS 提升:15-30%
  • P99 延迟降低:20-40%
  • 连接错误率:从 5% → < 0.1%

数据库压测(使用 sysbench):

# 安装 sysbench
# Ubuntu
sudo apt install -y sysbench

# RHEL/CentOS
sudo yum install -y sysbench

# OLTP 读写混合压测
sysbench oltp_read_write \
  --mysql-host=localhost \
  --mysql-user=test \
  --mysql-password=password \
  --tables=10 \
  --table-size=100000 \
  --threads=64 \
  --time=60 \
  run

预期性能提升(数据库场景):

  • TPS 提升:10-20%
  • 查询延迟降低:10-25%

Step 9:监控关键指标变化

网络连接数监控

# 实时监控连接状态分布
watch -n 1 'ss -s'

# 监控 TIME_WAIT 连接数
watch -n 1 'ss -tan | grep TIME_WAIT | wc -l'

连接跟踪表使用率

# 当前连接数 / 最大连接数
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max

# 计算使用率
echo "scale=2; $(cat /proc/sys/net/netfilter/nf_conntrack_count) / $(cat /proc/sys/net/netfilter/nf_conntrack_max) * 100" | bc

内存与 Swap 监控

# 实时监控内存使用
watch -n 1 free -h

# 监控脏页数量
watch -n 1 'cat /proc/meminfo | grep -E "Dirty|Writeback"'

Prometheus 监控指标

# 连接跟踪表使用率
node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.8

# TIME_WAIT 连接数
node_sockstat_TCP_tw > 10000

# 监听队列溢出
rate(node_netstat_TcpExt_ListenOverflows[5m]) > 0

# 脏页占比
node_memory_Dirty_bytes / node_memory_MemTotal_bytes > 0.1

Step 10:持久化配置并文档化

合并所有配置到单文件(可选):

# 合并到 /etc/sysctl.d/99-production.conf
cat /etc/sysctl.d/90-network-tuning.conf \
    /etc/sysctl.d/91-memory-tuning.conf \
    /etc/sysctl.d/92-limits-tuning.conf \
    /etc/sysctl.d/93-container-tuning.conf \
    > /etc/sysctl.d/99-production.conf

版本管理

cd /etc
git init
git add sysctl.conf sysctl.d/*.conf security/limits.conf
git commit -m "Initial kernel tuning configuration"

创建变更记录文档 /etc/sysctl.d/README.md

# 内核参数调优记录

## 变更日期:2025-10-31
## 变更人:SRE Team
## 业务场景:高并发 Web 服务器(Nginx + K8s)

### 关键变更:
1. 增大监听队列:somaxconn 65535
2. 启用 BBR 拥塞控制
3. TIME_WAIT 快速回收:tcp_tw_reuse=1
4. 降低 Swap 使用:swappiness=10
5. 禁用透明大页(THP)

### 性能基线:
- 调优前:QPS 15000, P99 50ms, 连接错误率 3%
- 调优后:QPS 22000, P99 30ms, 连接错误率 0.05%

### 回滚命令:
```bash
cp /etc/sysctl.conf.backup /etc/sysctl.conf
sysctl -p

监控与告警

关键内核指标监控

# 监听队列溢出
netstat -s | grep "times the listen queue of a socket overflowed"

# SYN 丢弃统计
netstat -s | grep "SYNs to LISTEN sockets dropped"

# TCP 重传率
netstat -s | grep "segments retransmitted"

**Prometheus 告警规则**:

```yaml
groups:
- name: kernel-tuning
  rules:
  - alert: HighConntrackUsage
    expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.9
    for: 5m
    annotations:
      summary: "连接跟踪表使用率超过 90%"

  - alert: ListenQueueOverflow
    expr: rate(node_netstat_TcpExt_ListenOverflows[5m]) > 0
    for: 1m
    annotations:
      summary: "监听队列溢出,需增大 somaxconn"

  - alert: HighSwapUsage
    expr: (node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes > 0.5
    for: 10m
    annotations:
      summary: "Swap 使用率超过 50%,检查内存泄漏"

性能与容量

不同业务场景推荐配置

场景 关键参数 推荐值
高并发 Web somaxconn 65535
tcp_max_syn_backlog 65535
ip_local_port_range 10000-65535
tcp_tw_reuse 1
数据库 swappiness 1-10
shmmax 物理内存 × 0.5
THP disabled
负载均衡器 nf_conntrack_max 2097152
tcp_tw_reuse 1
tcp_congestion_control bbr
容器宿主机 nf_conntrack_max 2097152
pid_max 4194304
bridge-nf-call-iptables 1
CDN 边缘节点 tcp_congestion_control bbr
tcp_fastopen 3
tcp_rmem/wmem 最大值 32MB

安全与合规

防 DDoS 参数

# 启用 SYN Cookie(防 SYN Flood)
net.ipv4.tcp_syncookies = 1

# 减少 SYN 重试次数(快速丢弃攻击连接)
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

# 启用反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁用 ICMP 重定向(防中间人攻击)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# 禁用源路由(防路由劫持)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 启用 TCP 时间戳(防序列号猜测)
net.ipv4.tcp_timestamps = 1

# 记录可疑数据包(Martian Packets)
net.ipv4.conf.all.log_martians = 1

合规核对点

  • [ ] 参数变更通过变更管理流程(CAB 审批)
  • [ ] 生产环境变更前在测试环境完整验证
  • [ ] 配置纳入版本控制(Git)并记录变更原因
  • [ ] 关键参数调整建立回滚剧本(5 分钟内可回退)
  • [ ] 压测验证性能提升(基线对比报告)
  • [ ] 监控告警规则同步更新(如 conntrack 阈值)

常见故障与排错

症状 诊断命令 可能根因 快速修复 永久修复
连接被拒绝(ECONNREFUSED) ss -lnt somaxconn 过小 sysctl -w net.core.somaxconn=65535 写入配置文件
大量 TIME_WAIT ss -tan \| grep TIME_WAIT \| wc -l 短连接过多 启用 tcp_tw_reuse 应用层改长连接
连接跟踪表满 dmesg \| grep nf_conntrack nf_conntrack_max 过小 增大 nf_conntrack_max 定期清理 NAT 规则
OOM Killer 触发 dmesg \| grep oom 内存超卖 降低 overcommit_ratio 增加物理内存
磁盘 I/O 卡顿 iostat -x 1 脏页过多 降低 dirty_ratio 优化应用写入
BBR 未生效 sysctl net.ipv4.tcp_congestion_control 内核版本过低 升级内核到 4.9+ -
端口耗尽 ss -tan \| wc -l ip_local_port_range 过小 扩大端口范围 使用长连接

变更与回滚剧本

维护窗口

推荐时间:凌晨 2:00 - 4:00(业务低峰期)
变更前置条件

  • [ ] 备份当前所有内核参数(sysctl -a
  • [ ] 在测试环境完成全部变更验证与压测
  • [ ] 准备回滚脚本与配置文件备份
  • [ ] 通知业务方与监控团队

灰度策略

阶段 1:单服务器验证(1 台)

# 应用配置
sysctl -p /etc/sysctl.d/99-production.conf

# 压测验证
wrk -t 8 -c 1000 -d 300s http://localhost/

# 监控 24 小时(连接数/延迟/错误率)

阶段 2:批量发布(剩余服务器)

# Ansible 批量应用
ansible webservers -m copy -a "src=/etc/sysctl.d/99-production.conf dest=/etc/sysctl.d/"
ansible webservers -m command -a "sysctl -p /etc/sysctl.d/99-production.conf"

健康检查

# 检查参数是否生效
sysctl -a | grep -E "somaxconn|tcp_max_syn_backlog|tcp_congestion_control"

# 检查连接状态
ss -s

# 检查系统日志错误
dmesg | grep -iE "error|fail|oom" | tail -20

回退条件与命令

触发条件

  • 应用层连接错误率 > 5%
  • 系统平均负载 > CPU 核心数 × 3
  • OOM Killer 触发

回退操作

# 恢复备份配置
cp /etc/sysctl.conf.backup /etc/sysctl.conf
rm /etc/sysctl.d/9*.conf

# 重新加载
sysctl -p

# 验证回退成功
sysctl -a | grep -E "somaxconn|tcp_max_syn_backlog" | head -5

最佳实践

  1. 先备份后修改:所有生产变更前必须导出 sysctl -a 与备份配置文件
  2. 分文件管理:按场景拆分配置文件(90-network, 91-memory, 92-limits)便于维护
  3. 版本控制:配置纳入 Git,变更通过 PR 审查
  4. 测试先行:新参数必须在测试环境压测验证 24 小时
  5. 监控先行:调整阈值类参数(如 conntrack_max)同步更新告警规则
  6. 保守调整:首次调优增幅不超过 2 倍(如 somaxconn 128 → 4096,而非 65535)
  7. 避免过度优化:默认值已优化的参数(如 tcp_rmem)无需盲目增大
  8. 内核版本适配:BBR/TFO 等新特性需检查内核版本支持
  9. 容器场景注意:宿主机参数影响所有容器,需考虑容器密度
  10. 定期审查:每半年审查一次配置,清理无效参数

附录

完整生产配置模板(通用 Web 服务器)

/etc/sysctl.d/99-production.conf

# ============================================
# 生产环境内核参数调优配置
# 适用场景:高并发 Web 服务器 + 容器宿主机
# 测试环境:RHEL 8.8, Ubuntu 22.04
# 测试日期:2025-10-31
# ============================================

# === 网络核心参数 ===
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# === TCP 协议栈 ===
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 786432 1048576 2097152

# === TCP 连接优化 ===
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# === TCP 拥塞控制 ===
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.ipv4.tcp_fastopen = 3

# === TCP 安全 ===
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

# === 连接跟踪 ===
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30

# === 内存管理 ===
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 200
vm.overcommit_memory = 1

# === 文件系统 ===
fs.file-max = 2097152

# === 容器支持(K8s)===
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

# === 安全加固 ===
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0

Ansible 自动化部署 Playbook

---
- name: 生产环境内核参数调优
  hosts: all
  become: yes
  vars:
    sysctl_config: /etc/sysctl.d/99-production.conf
    backup_dir: /root/sysctl-backup

  tasks:
  - name: 创建备份目录
    file:
      path: "{{ backup_dir }}"
      state: directory

  - name: 备份当前参数
    shell: sysctl -a > {{ backup_dir }}/sysctl-$(date +%Y%m%d-%H%M%S).txt

  - name: 部署调优配置
    copy:
      src: files/99-production.conf
      dest: "{{ sysctl_config }}"
      owner: root
      group: root
      mode: '0644'

  - name: 加载 br_netfilter 模块
    modprobe:
      name: br_netfilter
      state: present

  - name: 持久化模块加载
    lineinfile:
      path: /etc/modules-load.d/k8s.conf
      line: br_netfilter
      create: yes

  - name: 应用内核参数
    command: sysctl -p {{ sysctl_config }}
    register: sysctl_result

  - name: 验证关键参数
    command: sysctl net.core.somaxconn net.ipv4.tcp_congestion_control
    register: verify_result

  - name: 显示验证结果
    debug:
      msg: "{{ verify_result.stdout_lines }}"

测试环境:RHEL 8.8 / Ubuntu 22.04 LTS, Kernel 4.18.0 / 5.15.0
测试日期:2025-10-31
维护周期:参数每半年审查,内核每年升级评估


本文由 云栈社区 技术编辑整理,专注于提供高质量的运维与系统调优干货。关于更多网络/系统底层原理与实战,欢迎访问社区交流讨论。




上一篇:10分钟部署生产级Prometheus告警:规则模板、静默策略与零误报实战
下一篇:Node.js require函数模块导入指南:告别混乱代码的模块化实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-21 04:45 , Processed in 0.495259 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表