Linux命令-sysctl(运行时修改内核参数)

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 分模块管理配置,便于维护和版本控制
  • 记录每次修改的日期和原因,方便回溯
  • 某些参数修改可能立即影响线上服务(如网络参数),需在维护窗口执行
相关推荐
yunwei371 小时前
eBPF 教程:使用 fsession 追踪慢速 vfs_read 调用
linux·云原生
A_humble_scholar1 小时前
Linux 网络基础(三)下的 HTTP 核心详解:从请求响应到状态管
linux·网络·http
Lucis__1 小时前
如何实现长连接通信机制?Websocket的最佳实践
网络·websocket·网络协议
Albart5751 小时前
Docker Desktop最新版安装踩坑全记录(Windows_Mac_Linux)【2026 4.74.0 终版】
linux·windows·macos·docker·环境搭建·踩坑记录
举手2 小时前
Epoll模型
linux·c++·学习
JAVA面经实录9172 小时前
网络编程基础(Java Web/分布式前置·完整版)(十一)
java·前端·网络
Escalating_xu2 小时前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
qetfw2 小时前
Debian 部署 Discuz! 论坛:Nginx、PHP 与 MariaDB 配置
linux·运维·nginx·debian·php·discuz
烛之武3 小时前
Linux 命令速查表
linux·运维·服务器