sysctl命令

sysctl 命令 #

sysctl是一个用于在运行时查看和修改 Linux 内核参数的命令行工具。它允许系统管理员调整各种内核设置,如网络配置、内存管理、文件系统操作等,而无需重新编译内核或重启系统。

语法 #

sysctl [选项] [变量[=]] [变量[=]] ...

常用选项 #

选项 描述
-a, --all 显示所有内核参数
-e, --ignore 忽略错误
-n, --values 只显示值,不显示参数名
-N, --names 只显示参数名,不显示值
-w, --write 写入值(与变量=值语法相同)
-p[文件], --load[=文件] 从文件加载参数(默认为/etc/sysctl.conf)
-q, --quiet 安静模式,不显示设置的值
-d, --deprecated 包含已弃用的参数
-h, --help 显示帮助信息
-V, --version 显示版本信息

常见用法 #

1. 显示所有内核参数 #

sysctl -a

2. 显示特定参数的值 #

sysctl net.ipv4.ip_forward

3. 设置参数值 #

sysctl -w net.ipv4.ip_forward=1

或者:

sysctl net.ipv4.ip_forward=1

4. 从配置文件加载参数 #

sysctl -p

从特定文件加载:

sysctl -p /etc/sysctl.d/99-custom.conf

5. 只显示参数值 #

sysctl -n net.ipv4.ip_forward

6. 只显示参数名 #

sysctl -N net.ipv4.ip_forward

7. 显示特定前缀的所有参数 #

sysctl net.ipv4

8. 一次设置多个参数 #

sysctl net.ipv4.ip_forward=1 net.ipv4.conf.all.rp_filter=1

常用内核参数 #

网络参数 #

参数 描述 常用值
net.ipv4.ip_forward 启用/禁用 IP 转发 0(禁用)或 1(启用)
net.ipv4.tcp_syncookies 启用/禁用 TCP SYN cookie 保护 0(禁用)或 1(启用)
net.ipv4.icmp_echo_ignore_all 忽略所有 ICMP 回显请求(ping) 0(响应)或 1(忽略)
net.ipv4.tcp_max_syn_backlog TCP SYN 队列大小 默认为 1024,可增加到 8192 或更高
net.core.somaxconn 连接队列大小 默认为 128,可增加到 1024 或更高
net.ipv4.tcp_keepalive_time TCP 保活时间(秒) 默认为 7200(2 小时)
net.ipv4.tcp_fin_timeout TCP FIN 超时时间(秒) 默认为 60
net.ipv4.tcp_max_tw_buckets TIME_WAIT 状态的最大数量 默认为 180000
net.ipv4.conf.all.rp_filter 启用/禁用反向路径过滤 0(禁用)、1(严格)或 2(宽松)

内存参数 #

参数 描述 常用值
vm.swappiness 交换倾向性 0-100,较低值减少交换使用
vm.overcommit_memory 内存过量使用策略 0(启发式)、1(总是允许)或 2(不允许)
vm.dirty_ratio 脏页刷新阈值(百分比) 默认为 20
vm.dirty_background_ratio 后台脏页刷新阈值(百分比) 默认为 10
vm.min_free_kbytes 最小空闲内存(KB) 根据系统内存调整
vm.vfs_cache_pressure 缓存回收压力 默认为 100,较低值保留更多缓存
vm.zone_reclaim_mode 区域回收模式 0(禁用)或 1(启用)

文件系统参数 #

参数 描述 常用值
fs.file-max 系统范围内的最大文件句柄数 默认值取决于系统内存
fs.nr_open 进程可打开的最大文件数 默认为 1048576
fs.inotify.max_user_watches 用户可监视的最大文件数 默认为 8192,可增加
fs.aio-max-nr 异步 I/O 请求的最大数量 默认为 65536

内核参数 #

参数 描述 常用值
kernel.shmmax 最大共享内存段大小(字节) 根据系统内存调整
kernel.shmall 共享内存总量(页) 根据系统内存调整
kernel.shmmni 共享内存段的最大数量 默认为 4096
kernel.sem 信号量参数 四个值:SEMMSL SEMMNS SEMOPM SEMMNI
kernel.pid_max 最大进程 ID 默认为 32768,可增加
kernel.threads-max 系统范围内的最大线程数 根据系统内存调整
kernel.panic 内核崩溃后自动重启的秒数 0(不重启)或正数(秒)
kernel.sysrq 启用/禁用 SysRq 键 0(禁用)到 1(完全启用)

配置文件 #

sysctl 参数可以通过以下文件进行持久化配置:

  • /etc/sysctl.conf - 主配置文件
  • /etc/sysctl.d/*.conf - 附加配置文件目录

配置文件格式示例:

# 网络参数
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1

# 内存参数
vm.swappiness = 10
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5

# 文件系统参数
fs.file-max = 2097152

实用示例 #

1. 配置服务器网络性能 #

# 启用IP转发(用于路由器或NAT)
sysctl -w net.ipv4.ip_forward=1

# 增加连接队列大小
sysctl -w net.core.somaxconn=4096

# 增加TCP缓冲区大小
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# 启用TCP快速打开
sysctl -w net.ipv4.tcp_fastopen=3

# 优化TCP保活设置
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_intvl=60
sysctl -w net.ipv4.tcp_keepalive_probes=10

2. 优化数据库服务器内存使用 #

# 减少交换使用
sysctl -w vm.swappiness=10

# 增加脏页阈值
sysctl -w vm.dirty_ratio=40
sysctl -w vm.dirty_background_ratio=10

# 禁用区域回收
sysctl -w vm.zone_reclaim_mode=0

# 增加共享内存限制(对PostgreSQL和Oracle很重要)
sysctl -w kernel.shmmax=68719476736
sysctl -w kernel.shmall=4294967296

3. 提高文件服务器性能 #

# 增加文件句柄限制
sysctl -w fs.file-max=6553600

# 优化目录缓存
sysctl -w vm.vfs_cache_pressure=50

# 增加inotify监视限制(对文件同步工具很重要)
sysctl -w fs.inotify.max_user_watches=524288

4. 增强系统安全性 #

# 启用反向路径过滤(防止IP欺骗)
sysctl -w net.ipv4.conf.all.rp_filter=1
sysctl -w net.ipv4.conf.default.rp_filter=1

# 禁用ICMP重定向
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_redirects=0

# 启用TCP SYN cookie保护(防止SYN洪水攻击)
sysctl -w net.ipv4.tcp_syncookies=1

# 忽略广播ping(防止Smurf攻击)
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

# 启用源路由验证
sysctl -w net.ipv4.conf.all.log_martians=1

5. 配置容器主机 #

# 允许非特权容器绑定到1024以下的端口
sysctl -w net.ipv4.ip_unprivileged_port_start=0

# 增加网络命名空间的数量限制
sysctl -w user.max_user_namespaces=28633

# 启用IPv4转发(Docker需要)
sysctl -w net.ipv4.ip_forward=1

# 配置桥接网络
sysctl -w net.bridge.bridge-nf-call-iptables=1
sysctl -w net.bridge.bridge-nf-call-ip6tables=1

持久化配置 #

要使 sysctl 设置在系统重启后仍然有效,应将其添加到配置文件中:

  1. 创建自定义配置文件:
sudo nano /etc/sysctl.d/99-custom.conf
  1. 添加所需参数:
# 网络优化
net.ipv4.ip_forward = 1
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
  1. 应用配置:
sudo sysctl -p /etc/sysctl.d/99-custom.conf

通过 procfs 直接访问 #

sysctl 参数也可以通过/proc/sys/目录直接访问:

# 读取参数
cat /proc/sys/net/ipv4/ip_forward

# 写入参数
echo 1 > /proc/sys/net/ipv4/ip_forward

sysctl 命令实际上是对这些文件的一个更方便的接口。

常见问题排查 #

1. 参数设置不生效 #

可能的原因:

  • 参数名称错误
  • 参数不存在于当前内核版本
  • 权限不足(需要 root 权限)
  • 参数受到其他机制的限制

解决方法:

# 检查参数是否存在
sysctl -a | grep parameter_name

# 使用sudo获取足够权限
sudo sysctl -w parameter=value

# 检查是否有模块需要加载
sudo modprobe module_name

2. 配置文件不加载 #

可能的原因:

  • 文件格式错误
  • 文件权限问题
  • 文件名不符合要求

解决方法:

# 检查文件格式
cat -A /etc/sysctl.d/99-custom.conf

# 修复文件权限
sudo chmod 644 /etc/sysctl.d/99-custom.conf

# 确保文件名以.conf结尾
sudo mv /etc/sysctl.d/custom /etc/sysctl.d/custom.conf

3. 参数被其他服务覆盖 #

某些服务(如 NetworkManager、Docker 等)可能会覆盖 sysctl 设置。

解决方法:

# 检查服务配置
grep -r sysctl /etc/

# 在服务启动后应用设置
echo "sysctl -p /etc/sysctl.d/99-custom.conf" >> /etc/rc.local
chmod +x /etc/rc.local

提示 #

  • 在修改关键系统参数前,先备份当前值
  • 使用sysctl -a > sysctl_backup.txt可以备份所有参数
  • 一次只修改一个参数,并测试其效果
  • 某些参数更改可能需要重启相关服务才能生效
  • 使用/etc/sysctl.d/目录而不是直接修改/etc/sysctl.conf,这样更易于管理
  • 参数名称中的点(.)在/proc/sys/路径中对应斜杠(/)
  • 使用描述性的文件名(如10-network.conf30-memory.conf)可以控制参数加载顺序
  • 在生产环境中更改参数前,先在测试环境中验证
  • 某些参数更改可能会对系统稳定性产生负面影响,请谨慎操作
  • 使用sysctl -p时如果不指定文件,它将加载/etc/sysctl.conf中的设置