Linux命令-sysctl(运行时修改内核参数))
sysctl 是 Linux 系统中用于在运行时查看和修改内核参数的强大工具。它通过 /proc/sys/ 虚拟文件系统直接与内核通信,可以实时调整网络栈、虚拟内存、文件系统、安全策略等数百个内核参数。系统管理员通过 sysctl 进行性能调优和安全加固是运维工作的基本功。
快速参考
bash
sysctl [选项] [变量[=值]]
sysctl的临时修改在重启后失效。持久化配置需写入/etc/sysctl.conf或/etc/sysctl.d/*.conf。
基本用法
bash
# 查看所有内核参数
sysctl -a
# 查看特定参数
sysctl net.ipv4.ip_forward
# 查看一组参数(前缀匹配)
sysctl net.ipv4.tcp
# 查看并显示简短描述
sysctl -d vm.swappiness
# 修改参数(运行时,重启失效)
sudo sysctl -w net.ipv4.ip_forward=1
# 从配置文件加载
sudo sysctl -p
# 从指定文件加载
sudo sysctl -p /etc/sysctl.d/custom.conf
# 显示所有参数(仅名称,无值)
sysctl -aN
# 以 JSON 格式输出(systemd-sysctl)
sysctl --json net.ipv4.tcp_rmem
常用选项
| 选项 | 说明 |
|---|---|
-a |
显示所有参数 |
-w VAR=VALUE |
写入参数值 |
-p [FILE] |
从文件加载参数(默认 /etc/sysctl.conf) |
-n |
仅显示值(不显示参数名) |
-N |
仅显示参数名 |
-e |
忽略未知参数(不报错) |
-d |
显示参数描述 |
-q |
静默模式 |
--system |
加载所有系统配置目录的文件 |
网络调优
bash
# === IP 转发(路由器必备) ===
sudo sysctl -w net.ipv4.ip_forward=1
# === TCP 缓冲区调优 ===
# 查看当前缓冲区设置
sysctl net.ipv4.tcp_rmem # 读缓冲: min default max
sysctl net.ipv4.tcp_wmem # 写缓冲: min default max
# 优化高带宽延迟网络
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# === TCP KeepAlive ===
sudo sysctl -w net.ipv4.tcp_keepalive_time=300
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30
sudo sysctl -w net.ipv4.tcp_keepalive_probes=5
# === 连接队列大小 ===
sudo sysctl -w net.core.somaxconn=1024
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192
# === TIME-WAIT 优化(高并发服务器) ===
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# === 启用 TCP Fast Open ===
sudo sysctl -w net.ipv4.tcp_fastopen=3 # 客户端+服务端
# === BBR 拥塞控制算法 ===
sudo sysctl -w net.core.default_qdisc=fq
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
# === 端口范围扩展 ===
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
内存与虚拟内存调优
bash
# === 交换倾向(swappiness) ===
# 值越小越倾向使用物理内存
sudo sysctl -w vm.swappiness=10
# === 脏页写回 ===
sudo sysctl -w vm.dirty_ratio=10 # 脏页比率上限
sudo sysctl -w vm.dirty_background_ratio=5 # 后台写回阈值
sudo sysctl -w vm.dirty_expire_centisecs=1500 # 脏页过期时间(15秒)
# === 过度提交内存策略 ===
sysctl vm.overcommit_memory # 0=启发式 1=总是允许 2=拒绝
sysctl vm.overcommit_ratio # overcommit_memory=2时的百分比
# === OOM 相关 ===
sudo sysctl -w vm.panic_on_oom=0 # OOM 时是否触发内核 panic
sudo sysctl -w vm.oom_kill_allocating_task=0
# === 大页内存 ===
sysctl vm.nr_hugepages # 当前大页数量
sudo sysctl -w vm.nr_hugepages=1024
# === 文件缓存回收 ===
sudo sysctl -w vm.vfs_cache_pressure=50 # <100减少回收
文件系统调优
bash
# === 文件句柄限制 ===
sysctl fs.file-max # 查看最大文件句柄
sudo sysctl -w fs.file-max=655360
sysctl fs.file-nr # 查看当前使用情况
# 输出:已分配 未使用 最大值
# === inode 相关 ===
sysctl fs.inode-nr
sudo sysctl -w fs.inode-max=524288
# === aio(异步 IO) ===
sudo sysctl -w fs.aio-max-nr=1048576
# === 核心转储 ===
sudo sysctl -w kernel.core_pattern="/var/coredumps/core.%e.%p"
# === 管道缓冲区 ===
sudo sysctl -w fs.pipe-max-size=1048576
安全加固
bash
# === 网络安全 ===
# 禁用 IP 源路由(防 IP 欺骗)
sudo sysctl -w net.ipv4.conf.all.accept_source_route=0
# 启用反向路径过滤
sudo sysctl -w net.ipv4.conf.all.rp_filter=1
# 忽略 ICMP 重定向
sudo sysctl -w net.ipv4.conf.all.accept_redirects=0
sudo sysctl -w net.ipv4.conf.all.send_redirects=0
# 忽略广播 ping
sudo sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# 启用 TCP SYN Cookie(防 SYN Flood)
sudo sysctl -w net.ipv4.tcp_syncookies=1
# 日志记录 Martian 包(不可路由的源地址)
sudo sysctl -w net.ipv4.conf.all.log_martians=1
# === 内核安全 ===
# 限制内核指针泄露(防内核地址泄露)
sudo sysctl -w kernel.kptr_restrict=2
# 限制 dmesg 访问
sudo sysctl -w kernel.dmesg_restrict=1
# 禁用 kexec
sudo sysctl -w kernel.kexec_load_disabled=1
# ASLR 地址空间随机化
sudo sysctl -w kernel.randomize_va_space=2
# 限制 ptrace 作用域
sudo sysctl -w kernel.yama.ptrace_scope=1
持久化配置
bash
# 主配置文件
sudo vim /etc/sysctl.conf
# 分模块配置(推荐)
sudo mkdir -p /etc/sysctl.d
# 网络优化
cat > /etc/sysctl.d/60-network-tuning.conf << 'EOF'
# TCP 缓冲区优化
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.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 高并发优化
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
EOF
# 安全加固
cat > /etc/sysctl.d/70-security-hardening.conf << 'EOF'
# IP 转发(仅在需要时启用)
# net.ipv4.ip_forward = 1
# 网络安全
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 内核安全
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.randomize_va_space = 2
EOF
# 内存管理
cat > /etc/sysctl.d/80-memory-tuning.conf << 'EOF'
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
EOF
# 加载所有配置
sudo sysctl --system
# 或逐个加载
sudo sysctl -p /etc/sysctl.d/60-network-tuning.conf
sudo sysctl -p /etc/sysctl.d/70-security-hardening.conf
sudo sysctl -p /etc/sysctl.d/80-memory-tuning.conf
诊断与验证脚本
bash
# 验证已加载的参数
cat > /usr/local/bin/sysctl_verify.sh << 'EOF'
#!/bin/bash
echo "===== 关键内核参数状态 ====="
check_param() {
local param="$1" expected="$2"
local actual=$(sysctl -n "$param" 2>/dev/null)
if [ "$actual" = "$expected" ]; then
echo "✅ $param = $actual"
else
echo "❌ $param = $actual (期望: $expected)"
fi
}
check_param net.ipv4.ip_forward 1
check_param net.ipv4.tcp_syncookies 1
check_param kernel.randomize_va_space 2
check_param kernel.kptr_restrict 2
check_param vm.swappiness 10
echo ""
echo "=== 网络关键参数 ==="
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_fastopen
echo ""
echo "=== 内存关键参数 ==="
sysctl vm.dirty_ratio
sysctl vm.vfs_cache_pressure
EOF
chmod +x /usr/local/bin/sysctl_verify.sh
# 批量比较两台服务器的参数差异
# 服务器 A
ssh server_a 'sysctl -a' > /tmp/sysctl_a.txt
# 服务器 B
ssh server_b 'sysctl -a' > /tmp/sysctl_b.txt
# 对比
diff <(sort /tmp/sysctl_a.txt) <(sort /tmp/sysctl_b.txt) | head -30
# 导出当前参数作为备份
sysctl -a > /tmp/sysctl_backup_$(date +%Y%m%d).txt
# 恢复(谨慎!)
# sudo sysctl -p /tmp/sysctl_backup_20240115.txt
常用 sysctl 速查
| 参数 | 推荐值 | 用途 |
|---|---|---|
net.ipv4.ip_forward |
1 (路由) / 0 (主机) | IP 转发 |
net.ipv4.tcp_syncookies |
1 | 防 SYN Flood |
vm.swappiness |
10 | 减少交换倾向 |
net.core.somaxconn |
1024-4096 | 监听队列长度 |
kernel.randomize_va_space |
2 | ASLR |
kernel.kptr_restrict |
2 | 内核指针保护 |
net.ipv4.tcp_tw_reuse |
1 | TIME-WAIT 复用 |
net.ipv4.tcp_congestion_control |
bbr | 拥塞控制算法 |
fs.file-max |
根据需求 | 最大文件句柄 |
vm.dirty_ratio |
10 | 脏页上限 |
调优原则:
- 先测量,后调整------不要盲目应用网上的"优化秘籍"
- 在生产环境中先在测试环境验证参数效果
- 使用
sysctl.d分模块管理配置,便于维护和版本控制- 记录每次修改的日期和原因,方便回溯
- 某些参数修改可能立即影响线上服务(如网络参数),需在维护窗口执行