概述

Linux 内核通过 /proc/sys/sysctl 接口暴露了数千个可调参数,涵盖网络、内存、文件系统、安全等各个方面。合理调整这些参数可以显著提升系统性能和稳定性,但盲目调参也可能适得其反。本文逐步梳理 sysctl 体系,按网络、文件描述符、内存、安全四大维度展开,并提供生产环境调优模板和参数验证方法。

sysctl 体系

参数查看与修改

# 查看所有参数
$ sysctl -a

# 查看特定参数
$ sysctl net.ipv4.tcp_max_syn_backlog
$ sysctl vm.swappiness

# 临时修改(重启失效)
$ sysctl -w vm.swappiness=10

# 从文件加载
$ sysctl -p /etc/sysctl.d/99-custom.conf

# 永久生效:写入配置文件
# /etc/sysctl.conf          — 传统配置文件
# /etc/sysctl.d/*.conf      — 推荐方式(按字母序加载)

配置文件加载顺序

/etc/sysctl.d/ 下按文件名字母序加载:
  00-default.conf       → 默认值
  50-network.conf       → 网络参数
  99-custom.conf        → 自定义参数(最后加载,覆盖前面)
  
最后加载 /etc/sysctl.conf(如果存在)

参数命名空间

kernel.*    — 内核通用参数
vm.*        — 虚拟内存参数
fs.*        — 文件系统参数
net.*       — 网络参数
net.ipv4.*  — IPv4 特定参数
net.ipv6.*  — IPv6 特定参数
net.core.*  — 网络核心参数
dev.*       — 设备参数
abi.*       — ABI 参数
user.*      — 用户命名空间参数

网络参数

TCP 连接相关

# TCP SYN 队列长度(半连接队列)
$ sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 4096

# 全连接队列长度
# 通过 net.core.somaxconn 控制
$ sysctl net.core.somaxconn
net.core.somaxconn = 4096

# SYN/ACK 重试次数(防 SYN Flood)
$ sysctl net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries = 2  # 默认 5,建议 2

# SYN 重试次数
$ sysctl net.ipv4.tcp_syn_retries
net.ipv4.tcp_syn_retries = 3     # 默认 6,建议 3
参数默认值生产推荐说明
tcp_max_syn_backlog10248192半连接队列长度
somaxconn1284096全连接队列长度
tcp_synack_retries52SYN/ACK 重试次数
tcp_syn_retries63SYN 重试次数

TCP 缓冲区

# TCP 读缓冲区(min/default/max)
$ sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 87380 6291456

# TCP 写缓冲区(min/default/max)
$ sysctl net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096 16384 4194304

# 网络栈读写缓冲区
$ sysctl net.core.rmem_max
net.core.rmem_max = 212992
$ sysctl net.core.wmem_max
net.core.wmem_max = 212992

# 网络栈默认缓冲区
$ sysctl net.core.rmem_default
net.core.rmem_default = 212992
$ sysctl net.core.wmem_default
net.core.wmem_default = 212992

生产环境推荐:

net.core.rmem_max = 16777216      # 16MB
net.core.wmem_max = 16777216      # 16MB
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

TCP Keepalive

# Keepalive 空闲时间(秒)
$ sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 7200   # 2 小时

# Keepalive 探测间隔
$ sysctl net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_intvl = 75

# Keepalive 探测次数
$ sysctl net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_probes = 9
# 生产推荐(快速检测死连接)
net.ipv4.tcp_keepalive_time = 600      # 10 分钟
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

TIME_WAIT 优化

# TIME_WAIT 状态连接的最大数量
$ sysctl net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_max_tw_buckets = 5000

# 是否启用 TIME_WAIT 快速回收(危险!NAT 环境下禁用)
$ sysctl net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_recycle = 0  # 4.x 内核已移除此参数

# 是否允许 TIME_WAIT 状态的 socket 重用
$ sysctl net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_reuse = 1   # 推荐

重要tcp_tw_recycle 在内核 4.12 后已移除。在 NAT 环境下启用会导致丢包,切勿使用。

TCP Fast Open

# TCP Fast Open(减少一个 RTT)
$ sysctl net.ipv4.tcp_fastopen
net.ipv4.tcp_fastopen = 0   # 默认关闭

# 启用(客户端+服务端)
$ sysctl -w net.ipv4.tcp_fastopen=3
# 1 = 客户端
# 2 = 服务端
# 3 = 客户端+服务端

###拥塞控制算法

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

# 当前算法
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic

# 加载 BBR
$ modprobe tcp_bbr
$ sysctl -w net.ipv4.tcp_congestion_control=bbr

# 查看是否加载成功
$ sysctl net.ipv4.tcp_available_congestion_control
reno cubic bbr
算法特点适用场景
reno经典算法保守环境
cubic默认,基于丢包通用
bbr基于带宽和延迟高延迟/丢包网络
westwood估算可用带宽无线网络
vegas基于延迟低延迟局域网

网络栈核心参数

# 网卡接收队列长度
$ sysctl net.core.netdev_max_backlog
net.core.netdev_max_backlog = 1000
# 生产推荐:8192

# 本地端口范围
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
# 生产推荐:1024 65535

# ICMP 速率限制
$ sysctl net.ipv4.icmp_ratelimit
net.ipv4.icmp_ratelimit = 1000

# ARP 表大小
$ sysctl net.ipv4.neigh.default.gc_thresh3
net.ipv4.neigh.default.gc_thresh3 = 1024
# 生产推荐:8192

生产环境网络调优模板

# /etc/sysctl.d/99-network-tuning.conf

# === 连接队列 ===
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# === 缓冲区 ===
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# === Keepalive ===
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# === TIME_WAIT ===
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# === SYN ===
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3

# === 网卡队列 ===
net.core.netdev_max_backlog = 8192

# === 端口范围 ===
net.ipv4.ip_local_port_range = 1024 65535

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

# === Fast Open ===
net.ipv4.tcp_fastopen = 3

# === MTU 探测 ===
net.ipv4.tcp_mtu_probing = 1

# === ARP ===
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 6144
net.ipv4.neigh.default.gc_thresh3 = 8192

文件描述符

系统级限制

# 系统最大文件描述符数
$ sysctl fs.file-max
fs.file-max = 1886960

# 查看当前已使用
$ cat /proc/sys/fs/file-nr
1234   0  1886960
# 已分配  未使用  最大值

进程级限制

# ulimit 限制
$ ulimit -n
1024

# 查看软限制和硬限制
$ ulimit -Sn  # 软限制
$ ulimit -Hn  # 硬限制

# 临时修改
$ ulimit -n 65535

# 永久修改:/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

# 或 /etc/security/limits.d/*.conf
# /etc/security/limits.d/99-nofile.conf
* soft nofile 65535
* hard nofile 65535

systemd 服务的文件描述符限制

# systemd 服务不受 limits.conf 控制,需在 unit 文件中配置
# /etc/systemd/system/myservice.service
[Service]
LimitNOFILE=65535

# 或创建 override
$ systemctl edit myservice
[Service]
LimitNOFILE=65535

# 查看服务的限制
$ systemctl show myservice | grep LimitNOFILE

inotify 限制

# 最大监控文件数
$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192

# 最大 inotify 实例数
$ sysctl fs.inotify.max_user_instances
fs.inotify.max_user_instances = 128

# 生产推荐(文件监控服务如 Promtail)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

文件描述符调优模板

# /etc/sysctl.d/99-fd-tuning.conf
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
fs.nr_open = 1048576  # 单进程最大 fd 数

# /etc/security/limits.d/99-nofile.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

内存参数

Swap 控制

# swappiness(0-100)
$ sysctl vm.swappiness
vm.swappiness = 60

# 生产推荐
# 数据库: 1
# 容器宿主机: 10
# 通用: 10-20

# vfs_cache_pressure
$ sysctl vm.vfs_cache_pressure
vm.vfs_cache_pressure = 100

# 生产推荐: 50-100
# 过高会频繁回收 dentry/inode cache
# 过低会导致 slab 占用过多内存

脏页控制

# 脏页占内存比例
$ sysctl vm.dirty_ratio
vm.dirty_ratio = 20

$ sysctl vm.dirty_background_ratio
vm.dirty_background_ratio = 10

# 生产推荐(大内存服务器用 bytes)
vm.dirty_background_bytes = 268435456   # 256MB
vm.dirty_bytes = 1073741824             # 1GB

Overcommit

# 内存过度分配策略
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0

# 0 = 启发式(默认,合理)
# 1 = 总是允许(Redis 推荐但危险)
# 2 = 严格检查(不允许超过 swap + ratio×RAM)

$ sysctl vm.overcommit_ratio
vm.overcommit_ratio = 50

# overcommit_memory=2 时:
# 可分配内存 = swap + overcommit_ratio% × RAM

内存大页

# 透明大页
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

# 数据库推荐关闭 THP
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 静态大页
$ sysctl vm.nr_hugepages
vm.nr_hugepages = 0

# 配置 100 个 2MB 大页
$ sysctl -w vm.nr_hugepages=100

内存调优模板

# /etc/sysctl.d/99-memory-tuning.conf

# Swap
vm.swappiness = 10
vm.vfs_cache_pressure = 50

# 脏页
vm.dirty_background_bytes = 268435456
vm.dirty_bytes = 1073741824
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500

# Overcommit
vm.overcommit_memory = 0
vm.overcommit_ratio = 90

# 内存回收
vm.min_free_kbytes = 262144    # 256MB(64GB 服务器)
vm.watermark_scale_factor = 10

# NUMA
vm.zone_reclaim_mode = 0

安全参数

网络安全

# IP 转发
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
# 路由器/容器宿主机需设为 1

# ICMP 重定向
$ sysctl net.ipv4.conf.all.send_redirects
net.ipv4.conf.all.send_redirects = 0

$ sysctl net.ipv4.conf.all.accept_redirects
net.ipv4.conf.all.accept_redirects = 0

# 源路由
$ sysctl net.ipv4.conf.all.accept_source_route
net.ipv4.conf.all.accept_source_route = 0

# 反向路径过滤
$ sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 1

# ICMP 广播
$ sysctl net.ipv4.icmp_echo_ignore_broadcasts
net.ipv4.icmp_echo_ignore_broadcasts = 1

# martian 包记录
$ sysctl net.ipv4.conf.all.log_martians
net.ipv4.conf.all.log_martians = 1

# TCP SYN Cookies(防 SYN Flood)
$ sysctl net.ipv4.tcp_syncookies
net.ipv4.tcp_syncookies = 1

内核安全

# 内核地址空间随机化
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2
# 0 = 禁用
# 1 = 共享库随机化
# 2 = 完全随机化(默认)

# dmesg 限制
$ sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 1
# 非 root 不能读取内核日志

# kptr_restrict
$ sysctl kernel.kptr_restrict
kernel.kptr_restrict = 2
# 隐藏内核指针

# ptrace 限制
$ sysctl kernel.yama.ptrace_scope
kernel.yama.ptrace_scope = 1
# 0 = 任何进程可 ptrace
# 1 = 只能 ptrace 子进程
# 2 = 只有 root 能 ptrace
# 3 = 完全禁用

# core dump 路径
$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h

安全参数模板

# /etc/sysctl.d/99-security-hardening.conf

# 网络安全
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# 内核安全
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.yama.ptrace_scope = 1

# 用户空间
fs.suid_dumpable = 0
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_fifos = 2
fs.protected_regular = 2

生产环境调优模板

数据库服务器

# /etc/sysctl.d/99-database.conf

# 网络
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_tw_reuse = 1

# 内存
vm.swappiness = 1
vm.vfs_cache_pressure = 50
vm.dirty_background_bytes = 268435456
vm.dirty_bytes = 1073741824
vm.overcommit_memory = 0
vm.min_free_kbytes = 524288

# 文件描述符
fs.file-max = 2097152
fs.aio-max-nr = 1048576

# THP 关闭
# 通过 systemd 或 rc.local 设置

Web 服务器

# /etc/sysctl.d/99-webserver.conf

# 网络(高并发)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.core.netdev_max_backlog = 8192
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2

# 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# BBR
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

# 文件描述符
fs.file-max = 2097152

容器宿主机

# /etc/sysctl.d/99-container-host.conf

# 网络转发
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

# 连接追踪
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_udp_timeout = 30

# 桥接
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 网络
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535

# 内存
vm.swappiness = 10
vm.overcommit_memory = 1

# 文件描述符
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

通用服务器基线

# /etc/sysctl.d/99-general-baseline.conf

# 网络
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.core.netdev_max_backlog = 4096
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

# 内存
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

# 文件描述符
fs.file-max = 1048576
fs.inotify.max_user_watches = 524288

# 安全
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
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
fs.suid_dumpable = 0
fs.protected_hardlinks = 1
fs.protected_symlinks = 1

参数验证方法

网络参数验证

# 1. 验证 SYN 队列
$ ss -lnt | awk '{print $2}'  # Recv-Q 接近 somaxconn 说明队列满
$ ss -lnt | awk 'NR>1{print $2}' | sort -rn | head

# 2. 验证 TCP 连接数
$ ss -s
# Total: 12345
# TCP:   8765 (estab 5432, closed 2100, orphaned 0, timewait 2000)

# 3. 验证 TIME_WAIT 数量
$ ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
#    5432 ESTAB
#    2100 TIME-WAIT

# 4. 验证 conntrack
$ cat /proc/sys/net/netfilter/nf_conntrack_count
# 接近 nf_conntrack_max 说明需调大

# 5. 验证端口范围
$ cat /proc/sys/net/ipv4/ip_local_port_range
# 确认范围是否足够

# 6. 使用 ss 查看队列情况
$ ss -lnt state listening
# Recv-Q = 0 表示队列未满
# Recv-Q > 0 表示队列积压

内存参数验证

# 1. 验证 swappiness
$ cat /proc/sys/vm/swappiness

# 2. 查看 swap 使用
$ free -h
$ swapon --show

# 3. 查看 dirty page
$ cat /proc/meminfo | grep -E "Dirty|Writeback"
$ grep -E "dirty|writeback" /proc/vmstat

# 4. 查看 slab
$ cat /proc/meminfo | grep -E "Slab|SReclaimable|SUnreclaim"

# 5. 查看 overcommit
$ cat /proc/meminfo | grep -E "CommitLimit|Committed_AS"
# CommitLimit = swap + overcommit_ratio% × RAM
# Committed_AS = 当前已分配的虚拟内存
# Committed_AS > CommitLimit 说明过度分配

文件描述符验证

# 1. 系统级
$ cat /proc/sys/fs/file-nr
# 当前分配  未使用  最大值

# 2. 进程级
$ cat /proc/$PID/limits | grep "Max open files"
Max open files  65535  65535  files

# 3. 进程实际使用
$ ls /proc/$PID/fd | wc -l

# 4. 查看使用 fd 最多的进程
$ lsof -n | awk '{print $2}' | sort | uniq -c | sort -rn | head -10

压力测试验证

# TCP 连接压测
$ sysbench --threads=256 --time=60 memory run

# 网络压测
$ iperf3 -c target -P 10 -t 60

# 文件描述符压测
$ python3 -c "
import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (65535, 65535))
fds = []
try:
    while True:
        fds.append(open('/dev/null'))
except IOError:
    print(f'Opened {len(fds)} file descriptors')
"

# 使用 wrk 压测 Web
$ wrk -t12 -c10000 -d60s http://localhost:8080

监控参数效果

# 使用 sar 持续监控
$ sar -n SOCK 1 60       # socket 统计
$ sar -n TCP 1 60        # TCP 统计
$ sar -r 1 60            # 内存统计
$ sar -B 1 60            # 分页统计

# 使用 ss 监控 TCP 状态
$ watch -n 1 'ss -ant | awk "{print \$1}" | sort | uniq -c | sort -rn'

# 使用 nstat 查看内核网络统计
$ nstat -az | grep -E "TcpExt|TcpInSegs|TcpOutSegs"

常见问题排查

问题 1:连接队列满

# 现象:连接超时、连接被拒绝
# 排查:
$ ss -lnt state listening
# Recv-Q > 0 表示全连接队列积压
$ ss -ant state syn-recv | wc -l
# 数量接近 tcp_max_syn_backlog 表示半连接队列满

# 解决:
$ sysctl -w net.core.somaxconn=65535
$ sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 同时调整应用 listen backlog

问题 2:Too many open files

# 现象:应用报 "Too many open files"
# 排查:
$ cat /proc/sys/fs/file-nr
$ cat /proc/$PID/limits | grep "Max open files"
$ ls /proc/$PID/fd | wc -l

# 解决:
# 1. 提高系统限制
$ sysctl -w fs.file-max=2097152
# 2. 提高进程限制(limits.conf 或 systemd)
# 3. 排查 fd 泄漏
$ ls -la /proc/$PID/fd | head -50
$ lsof -p $PID | awk '{print $5}' | sort | uniq -c | sort -rn

问题 3:conntrack 表满

# 现象:日志报 "nf_conntrack: table full, dropping packet"
# 排查:
$ cat /proc/sys/net/netfilter/nf_conntrack_count
$ cat /proc/sys/net/netfilter/nf_conntrack_max
# count 接近 max 说明表满

# 解决:
$ sysctl -w net.netfilter.nf_conntrack_max=1048576
# 同时缩短超时
$ sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400

问题 4:BBR 未生效

# 排查:
$ sysctl net.ipv4.tcp_congestion_control
# 如果不是 bbr:
$ modprobe tcp_bbr
$ sysctl -w net.ipv4.tcp_congestion_control=bbr

# 确认模块加载
$ lsmod | grep tcp_bbr
# 如果没有,添加到 /etc/modules-load.d/
$ echo "tcp_bbr" > /etc/modules-load.d/bbr.conf

总结

内核参数调优是系统优化的基础环节,但需要遵循科学方法。核心要点:

  1. 先测量再调优:用 sar/ss/sysctl 采集基线数据,明确瓶颈所在,而非盲目套用模板。
  2. 网络参数影响最大somaxconn/tcp_max_syn_backlog/tcp_tw_reuse/BBR 是高并发服务的必调项。
  3. 文件描述符是常见瓶颈:系统级 fs.file-max 和进程级 nofile 都要调整,systemd 服务需在 unit 文件中设置。
  4. 内存参数要因场景而异:数据库 swappiness=1,容器 swappiness=10,大内存机用 dirty_bytes 替代 dirty_ratio
  5. 安全参数是基线要求:反向路径过滤、禁用 ICMP 重定向、限制 dmesg/ptrace 是生产环境的基本要求。
  6. 配置文件用 /etc/sysctl.d/:按功能分文件管理,命名规范(99-xxx.conf),便于维护和审计。
  7. 参数修改后要验证:用 ss/free/sar 等工具验证参数是否生效,效果是否符合预期。
  8. BBR 是网络调优的标配:对高延迟、丢包网络有显著改善,但需要配合 fq 队列调度。

内核调优的终极原则:不要调你不懂的参数。每个参数都有其设计意图和副作用,调优前务必理解其含义,调优后务必验证效果。