sysctl 是什么
sysctl 是读写内核运行时参数的入口命令,参数视图与 /proc/sys 目录树一一对应:net.ipv4.ip_forward 就是 /proc/sys/net/ipv4/ip_forward。它不加载内核模块,只能调整已编译进内核或已加载模块暴露出来的开关与阈值,所以某台机器上不存在的参数,换一个内核版本可能才可用。它是 Linux 全平台命令,由 procps-ng 提供;在容器里能否修改取决于所在命名空间与 /proc/sys 的挂载权限。
基本信息
| 适用平台 | Linux 全平台(procps-ng 或 procps 包提供) |
|---|---|
| 语法 | sysctl [选项] 变量[=值] |
| 权限 | 读取普通用户可,写入需 root 或 CAP_SYS_ADMIN |
| 参数视图 | /proc/sys 目录树,点号命名与路径逐层对应 |
| 持久化位置 | /etc/sysctl.conf 与 /etc/sysctl.d/*.conf |
| 等价写法 | echo 值 > /proc/sys/... 只对当前命名空间生效 |
典型使用场景
- 临时验证调优假设:先用 -w 改运行时值观察效果,确认有效再落盘持久化
- 排障时读取现值:确认 somaxconn、ip_forward 等参数是否被压测脚本或容器运行时改写过
- 批量核对基线:用 sysctl -a 导出全量参数,与安全基线或历史快照做差异比对
- 容器与命名空间排查:确认容器内看到的网络参数来自宿主全局值还是局部 network namespace
- 定位配置漂移:把 /etc/sysctl.d 里声明过的值与运行时实际值逐一比对,找出被覆盖的项
- 写自动化脚本:用 -n 只输出数值,省去在脚本里切分变量名的步骤
常用示例与校验
常用示例与校验
sysctl net.ipv4.ip_forward # 读单个参数,输出为 变量 = 值
sysctl -n net.core.somaxconn # 只要数值,便于脚本判断
sysctl -a | grep -E 'swappiness|overcommit' # 过滤查看相关参数,全量输出很长
sysctl -w net.ipv4.tcp_fin_timeout=30 # 临时修改,立即生效但不落盘
sysctl net.ipv4.tcp_fin_timeout # 回读确认,避免拼错后静默不生效
sysctl -p /etc/sysctl.d/99-tuning.conf # 只加载指定文件,用于单文件验证
sysctl --system # 按顺序重新加载全部持久化配置结果逐项读法
| 观察点 | 含义 | 异常信号 |
|---|---|---|
| 变量名 | 点号分层的参数全名 | 报 cannot stat 多为拼写错误或内核不支持该参数 |
| 等号后的值 | 当前运行时生效值 | 与配置文件声明值不一致,说明未加载或被后加载文件覆盖 |
| -a 全量输出 | 含内核默认值与已加载模块参数 | 直接拿它当基线批量导入,会写入本机不存在的项 |
| 写入报错 | Permission denied 或 Read-only file system | 容器内只读挂载或非特权容器,属环境限制而非参数问题 |
参数名与目录并非总能机械互转:net.netfilter.nf_conntrack_max 对应 /proc/sys/net/netfilter/nf_conntrack_max,net.ipv4.conf.all.rp_filter 则在 conf/all 子目录里。拿不准时先用 sysctl 的参数名,或到 /proc/sys 下逐层浏览确认。
-w 只改内存中的值,重启即失效,系统里也不会留下任何记录。生产变更一律写进 /etc/sysctl.d/ 下的新文件(文件名用 99- 前缀排到最后),再执行 sysctl --system 重载并回读确认。
落盘写法
落盘写法
# /etc/sysctl.d/99-net-tuning.conf
net.core.somaxconn = 8192 # 应用侧 backlog 需同步调整才真正生效
net.ipv4.tcp_fin_timeout = 30 # FIN_WAIT2 等待对端关闭的秒数
vm.swappiness = 10 # 降低匿名页换出倾向生效与回读
生效与回读
sysctl --system # 加载全部 sysctl.d 与 sysctl.conf
grep -r 'somaxconn' /etc/sysctl.d /etc/sysctl.conf # 查清所有定义点,避免被覆盖
sysctl net.core.somaxconn # 回读运行时值,确认最后生效者同名参数在不同内核版本上的语义与默认值可能变化:tcp_tw_recycle 在 Linux 4.12 起被移除,tcp_max_tw_buckets 等参数的默认值也在版本之间调整过。照抄别人的调优清单之前,先在本机用 sysctl 确认参数存在并读出现值。