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 设置在系统重启后仍然有效,应将其添加到配置文件中:
- 创建自定义配置文件:
sudo nano /etc/sysctl.d/99-custom.conf
- 添加所需参数:
# 网络优化
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
- 应用配置:
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.conf
、30-memory.conf
)可以控制参数加载顺序 - 在生产环境中更改参数前,先在测试环境中验证
- 某些参数更改可能会对系统稳定性产生负面影响,请谨慎操作
- 使用
sysctl -p
时如果不指定文件,它将加载/etc/sysctl.conf
中的设置