首页/系统/Linux 内核与性能调优速查/sysctl 查看与修改内核参数
sysctl 内核参数72 条

sysctl 查看与修改内核参数

读写运行时内核参数的入口命令:sysctl 直接对应 /proc/sys 下的文件,-w 修改立即生效但不持久,正式变更应落盘到配置文件。

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 确认参数存在并读出现值。

易错点

  • 只在内存里改而不落盘:重启后调优全部丢失,同一问题会被反复重新排查
  • 改完不回读:参数名拼错或内核不支持时可能直接报错,也可能静默保持旧值,必须以回读结果为准
  • 没查清所有定义点:sysctl.d 按文件名字典序加载、后加载覆盖先加载,容易被别的文件把值写回
  • 在容器内改参数却以为改了宿主机:多数网络参数属于 network namespace,容器内的修改不影响宿主全局值
  • 把某台机器的 sysctl -a 输出整份搬到另一台:不同内核与模块集合不同,写不存在的参数会报错或埋下隐患

数据来源与参考

  • man 8 sysctl(procps-ng)
  • Linux 内核 Documentation/admin-guide/sysctl/index.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌