2. sysctl 命令基础:语法、查看、临时与永久修改
sysctl 是 Linux 内核运行时参数配置的核心工具,它允许系统管理员在不重新编译内核、不重启系统的情况下,动态调整内核行为。本章将系统讲解 sysctl 命令的完整用法,包括语法结构、参数查看、临时修改与永久保存,为后续内存与 IO 子系统的深度调优打下坚实基础。
核心概念:sysctl 操作的是
/proc/sys/ 虚拟文件系统下的内核参数文件。每个参数对应一个文件路径,例如 vm.swappiness 对应 /proc/sys/vm/swappiness。理解这个映射关系是掌握 sysctl 的关键。
2.1 sysctl 命令语法与参数结构
sysctl 命令的基本语法如下:
sysctl [选项] [参数名=值]
sysctl [选项] [参数名]
sysctl [选项] -f [配置文件]
常用选项说明:
| 选项 | 全称 | 功能说明 |
|---|---|---|
-a |
--all | 显示所有可读的内核参数及其当前值 |
-w |
--write | 临时修改指定参数的值 |
-p |
--load | 从配置文件(默认 /etc/sysctl.conf)加载参数 |
-n |
--values | 只显示参数值,不显示参数名 |
-e |
--ignore | 忽略未知参数的错误提示 |
-r |
--pattern | 使用正则表达式匹配参数名 |
参数命名规则:内核参数采用 点分层次结构,例如 vm.dirty_ratio、net.ipv4.tcp_syncookies。这种命名方式直接映射到 /proc/sys/ 下的目录层级:
vm.dirty_ratio→/proc/sys/vm/dirty_rationet.ipv4.tcp_syncookies→/proc/sys/net/ipv4/tcp_syncookieskernel.shmall→/proc/sys/kernel/shmall
实战提示:使用
sysctl -a | grep vm. 可以快速过滤出所有与虚拟内存子系统相关的参数,这是调优前的标准探查步骤。
2.2 查看当前内核参数
查看参数是调优的第一步,sysctl 提供了多种查看方式:
2.2.1 查看所有参数
# 查看所有可读参数(输出量极大,建议配合 grep 使用)
sysctl -a
# 查看所有参数,只显示值
sysctl -a -n
# 统计当前系统可调参数总数
sysctl -a | wc -l
2.2.2 查看指定参数
# 查看单个参数
sysctl vm.swappiness
# 查看多个参数
sysctl vm.dirty_ratio vm.dirty_background_ratio
# 使用正则匹配查看一组参数
sysctl -r '^vm\.dirty'
# 查看参数值,不显示名称
sysctl -n vm.swappiness
2.2.3 通过 /proc/sys 直接查看
# 等效于 sysctl vm.swappiness
cat /proc/sys/vm/swappiness
# 查看目录下的所有参数
ls /proc/sys/vm/
注意:并非所有
/proc/sys/ 下的文件都是可读的。部分安全敏感参数(如 kernel.pty.max)可能对非 root 用户不可见。使用 sysctl -a 时,不可读的参数会被静默跳过。
2.3 临时修改参数
临时修改参数使用 -w 选项,修改后立即生效,但重启后失效。适用于测试和临时调优场景。
2.3.1 基本用法
# 临时修改 vm.swappiness 为 10
sysctl -w vm.swappiness=10
# 同时修改多个参数
sysctl -w vm.swappiness=10 vm.dirty_ratio=30
# 验证修改是否生效
sysctl vm.swappiness
2.3.2 通过 /proc/sys 直接写入
# 等效于 sysctl -w vm.swappiness=10
echo 10 > /proc/sys/vm/swappiness
# 使用 tee 命令(适合需要 sudo 的场景)
echo 10 | sudo tee /proc/sys/vm/swappiness
2.3.3 临时修改的注意事项
| 注意事项 | 说明 |
|---|---|
| 权限要求 | 修改参数需要 root 权限,普通用户无法执行 sysctl -w |
| 立即生效 | 修改后内核立即使用新值,无需重启任何服务 |
| 重启失效 | 系统重启后参数恢复为默认值或 /etc/sysctl.conf 中的配置 |
| 类型校验 | sysctl 会对值进行基本类型检查,写入非法值会报错 |
| 范围限制 | 部分参数有取值范围,超出范围的值会被拒绝 |
最佳实践:在生产环境中进行临时修改时,建议先记录原始值:
ORIG_VAL=$(sysctl -n vm.swappiness),以便在需要时快速恢复。
2.4 永久修改参数
永久修改参数需要将配置写入 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下的自定义配置文件。系统启动时,init 系统(systemd 或 sysvinit)会自动加载这些配置。
2.4.1 配置文件格式
# /etc/sysctl.conf 示例
# 注释以 # 开头
# 虚拟内存参数
vm.swappiness = 10
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5
# 内核参数
kernel.sysrq = 0
kernel.core_uses_pid = 1
# 网络参数
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
格式规则:
- 每行一个参数,格式为
参数名 = 值 =两侧的空格是可选的,但建议保留以提高可读性- 以
#开头的行是注释 - 空行会被忽略
2.4.2 加载配置文件
# 加载默认配置文件 /etc/sysctl.conf
sysctl -p
# 加载指定配置文件
sysctl -p /etc/sysctl.d/99-custom.conf
# 加载所有 /etc/sysctl.d/*.conf 文件(systemd 系统)
sysctl --system
2.4.3 使用 /etc/sysctl.d/ 目录
现代 Linux 发行版推荐使用 /etc/sysctl.d/ 目录管理配置,而不是直接修改 /etc/sysctl.conf:
# 创建自定义配置文件
cat > /etc/sysctl.d/99-vm-tuning.conf << 'EOF'
# 自定义虚拟内存调优配置
vm.swappiness = 10
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50
EOF
# 加载新配置
sysctl --system
# 验证配置已生效
sysctl vm.swappiness vm.dirty_ratio
推荐做法:使用
/etc/sysctl.d/ 目录管理配置,文件名使用两位数字前缀控制加载顺序(如 10-*.conf、99-*.conf)。后加载的配置会覆盖先加载的配置,/etc/sysctl.conf 的优先级最低。
2.4.4 永久修改的完整流程
- 查看当前值:
sysctl vm.swappiness - 临时修改测试:
sysctl -w vm.swappiness=10 - 验证效果:观察系统行为是否符合预期
- 写入配置文件:
echo "vm.swappiness = 10" >> /etc/sysctl.d/99-vm-tuning.conf - 加载配置:
sysctl --system - 确认持久化:
sysctl vm.swappiness
2.5 常用操作速查表
| 操作场景 | 命令 | 说明 |
|---|---|---|
| 查看所有参数 | sysctl -a |
输出所有可读参数,建议配合 less 或 grep 使用 |
| 查看单个参数 | sysctl vm.swappiness |
显示参数名和当前值 |
| 查看参数值(仅值) | sysctl -n vm.swappiness |
只输出数值,适合脚本调用 |
| 正则匹配参数 | sysctl -r '^vm\.dirty' |
使用正则表达式过滤参数名 |
| 临时修改参数 | sysctl -w vm.swappiness=10 |
立即生效,重启失效 |
| 加载默认配置 | sysctl -p |
加载 /etc/sysctl.conf |
| 加载所有配置 | sysctl --system |
加载 /etc/sysctl.d/*.conf 和 /etc/sysctl.conf |
| 导出当前配置 | sysctl -a > backup.conf |
备份当前所有参数值 |
安全提醒:修改内核参数前,务必确认参数的含义和影响范围。错误的参数配置可能导致系统性能下降、服务异常甚至系统崩溃。建议在测试环境验证后再应用到生产环境。
2.6 本章小结
sysctl 是 Linux 内核调优的核心工具,掌握其基本用法是后续深入学习的前提。本章要点:
- 语法结构:
sysctl [选项] [参数名=值],参数名映射到/proc/sys/下的文件路径 - 查看参数:使用
-a查看全部,直接指定参数名查看单个,-r支持正则匹配 - 临时修改:使用
-w选项,立即生效但重启失效,适合测试场景 - 永久修改:写入
/etc/sysctl.d/*.conf文件,使用sysctl --system加载,重启后依然生效 - 最佳实践:先临时修改测试,确认无误后再写入配置文件实现持久化