3126 字
16 分钟

sysctl运行时参数及面向场景的调优策略

主要参数类别#

前缀全称主要控制内容示例参数影响性能的方面
vmVirtual Memory内存与交换区管理vm.swappiness, vm.dirty_ratio内存调度、缓存回写、swap 行为
netNetworking网络协议栈net.ipv4.tcp_fin_timeout, net.core.somaxconnTCP/IP 性能、连接队列、缓冲区
fsFilesystem文件系统与 VFS 层fs.file-max, fs.nr_open文件句柄限制、IO 性能
kernelKernel Core核心参数、进程与调度kernel.pid_max, kernel.threads-max进程数、调度、内核行为
userUser Limits用户级限制user.max_user_namespaces容器化与命名空间
devDevices设备接口(块设备、tty 等)dev.cdrom.autocloseIO 与设备行为
debugDebugging内核调试参数debug.exception-trace内核日志、调试信息输出
abiApplication Binary Interface系统调用兼容性abi.vsyscall32兼容性和系统调用行为
cryptoCryptography内核加密框架crypto.fips_enabled加密、FIPS 模式
sunrpcSunRPC/NFSNFS 和 RPC 网络文件系统sunrpc.tcp_slot_table_entriesNFS 性能与连接
netfilterNetfilter/iptables防火墙与包过滤net.netfilter.nf_conntrack_max网络连接跟踪性能
busBus subsystem硬件总线参数(PCI、USB 等)bus.usb.autosuspend外设功耗与性能
vm.hugetlbHugeTLB subsystem大页内存管理vm.hugetlb_shm_group高性能内存映射
fs.aio-max-nrAsync I/O异步 I/O 限制fs.aio-max-nr高并发 IO 性能

常用参数#

内存(vm.*)#

参数作用常用取值说明
vm.swappiness控制系统使用 swap 的倾向0~100(默认60)值越大越倾向使用 swap;服务器常调小,如 101
vm.dirty_ratio系统允许的最大脏页比例默认20达到比例后开始写回到磁盘,此时写操作会被阻塞
vm.dirty_background_ratio到达该比例后台线程开始回写默认10达到比例后开始写回到磁盘,但不阻塞写操作(如果脏页增加速度远大于该值,那么当该值等于**dirty_ratio,**依然会触发写阻塞)
vm.dirty_writeback_centisecs内核刷盘线程的唤醒频率,每次唤醒时刷盘线程会检查是否有脏页堆积并需要写回到磁盘默认 500,即 5 秒减小:数据安全要求高、写密集型、容器和虚拟化环境、慢速存储设备 - 频繁写回减少数据丢失概率,提高多租户环境的数据一致性。
增大:高性能计算和批处理 - 合并写操作降低磁盘 IO、临时数据处理、UPS 断电保护环境、SSD 优化 - 本身随机写入性能好,降低刷盘频率提升 SSD 寿命
vm.dirty_expire_centisecs脏页在内存中允许停留的最大时间,超过该值,刷盘线程会在下一次唤醒时将其写回磁盘默认 3000,即 30 秒
vm.overcommit_memory控制内存分配策略0=启发式, 1=允许超分配, 2=严格检查数据库场景多用 1
vm.overcommit_ratio当 overcommit_memory=2 时的分配阈值默认50占总内存的百分比
vm.drop_caches手动清理缓存写入1,2,3触发一般用于测试,不建议常用
vm.min_free_kbytes系统预留的最小空闲内存默认自动计算低内存系统可调高避免OOM
vm.nr_hugepages预分配的大页(2MB) 数量整数,如 1024,则预留内存为 1024*2MB对数据库或大内存应用有帮助

vm.overcommit_memory#

该参数控制的不是实际可用的内存,而是应用在运行前申请的内存大小。如果设置为1,则可以申请到比物理内存加交换内存总和还大的内存空间,但运行时有可能因实际可以内存不足而OOM;而如果设置为0,则在当申请的内存空间大于当前可用的内存空间时,会直接请求失败。

三种模式

  • 0 — Heuristic overcommit(默认)
    • 内核使用启发式算法判断是否允许分配内存。
    • 不严格,也不完全自由。
    • 基本原则:申请阶段尽量不超过(物理 + swap)的大约一定比例。
  • 1 — Always overcommit
    • 分配阶段永远不会拒绝 malloc 请求。
    • 可以申请到巨大内存(如 100GB),即使实际只有 2GB。
    • 运行时写入时才会真正分配物理页。
    • 一旦真实内存不足 → OOM Killer 出手。
  • 2 — Strict overcommit
    • 使用严格公式判断申请是否允许:CommitLimit = Swap + (RAM * overcommit_ratio / 100)
    • 申请阶段必须小于 CommitLimit,否则直接失败(ENOMEM)
    • 常用情景:数据库服务器高性能计算(HPC)集群 / 科研计算节点零容忍 OOM 的实时/关键系统,共同点是需要确保关键服务不会因为内存超载而被 OOM,与其在运行中因内存超载爆掉,不如一开始就在内存申请阶段失败,这样对主系统/应用更安全

vm.overcommit_ratio#

该参数只在 vm.overcommit_memory=2(严格模式) 时生效,用来控制允许应用在“申请阶段”能分配的最大虚拟内存额度。

HugePages(vm.nr_hugepages) vs Transparent HugePages(THP)#

特性HugePages(HugeTLB,大页)THP(透明大页)
本质**静态预留大页, 系统启动后就从物理内存中直接划分出去 **动态自动合并大页
启用方式手动配置 vm.nr_hugepages自动,只要 THP 打开
何时分配开机后即从物理内存预留进程运行中内核根据需要合并 4KB 页
是否可用作普通内存不可以,被固定保留可以
是否可 swap不能 swap可能 swap(取决于内核版本)
是否可回收不可可在压力下拆分回 4KB
是否需要应用配合需要应用程序显式申请大页完全透明( 进程在不知道的情况下就得到大页
性能高,稳定,无碎片影响中,受内存碎片化影响 (内存碎片化程度高时会拆分会小页)

Transparent HugePages 配置#

  • transparent_hugepage.enabled - 决定 是否使用透明大页 以及 使用策略 ,常见值有:** **
    • always - 尽可能使用 THP,只要能分配到 2MB 大页就使用。如果没有连续大块内存,内核 可能会触发同步 defrag 来整理内存。最激进、最容易导致性能抖动。
    • madvise - 默认不使用 THP,只有进程使用 madvise(MADV_HUGEPAGE) 明确请求时才用。这是 性能最可控 的方式。
    • never - 完全禁用 THP,不透明合并,不使用大页。传统数据库通常推荐此项。
  • transparent_hugepage.defrag - 决定 为了分配透明大页,内核是否愿意整理(compaction)内存; 整理内存是昂贵的,会引发暂停(latency spike),所以这个参数非常重要。
    • always - 为了分配 THP,内核会做同步的 memory compaction → 可能卡顿
    • madvise - 只有进程显式请求 THP(MADV_HUGEPAGE)时,才会进行内存整理
    • defer - 尝试分配 THP,但如果没有连续内存则 不阻塞,推迟到后台异步整理。
    • defer+madvise - 与 defer 类似,但只对 madvise 的进程做整理,最平衡。
    • never - 不会为了分配 THP 整理内存。若内存不可连续则直接使用 4KB 小页。

修改Transparent HugePages 配置#

  1. 通过 systemd 服务文件配置
    1. 创建服务/etc/systemd/system/disable-thp.service
    2. 写入内容
Terminal window
[Unit]
Description=Disable Transparent Huge Pages
After=sysinit.target local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WantedBy=multi-user.target
  1. 通过内核启动参数关闭 THP
    1. 修改 /etc/default/grub,加入一行GRUB_CMDLINE_LINUX="transparent_hugepage=never"
    2. 重新生成 grub 配置
      1. Ubuntu/Debian: update-grub
      2. CentOS/RHEL: grub2-mkconfig -o /boot/grub2/grub.cfg
  2. 临时修改
Terminal window
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

网络(net.*)#

通用网络参数#

参数作用常用取值说明
net.ipv4.ip_forward是否允许路由转发0/1网关或容器网络中需开启
net.ipv4.conf.all.rp_filter反向路径过滤0/1/2某些多网卡主机建议关闭
net.ipv4.icmp_echo_ignore_all忽略所有 ping 请求0/1安全要求高时可设为1
net.ipv4.tcp_syncookiesSYN 洪水防御0/1建议开启(默认开启)

TCP 优化#

参数作用常用取值说明
net.ipv4.tcp_fin_timeoutFIN_WAIT2 超时时间默认60可适当调小如 15
net.ipv4.tcp_keepalive_timeKeepalive 发包间隔默认7200秒长连接可适当调小
net.ipv4.tcp_tw_reuse允许 TIME_WAIT socket 复用0/1Web服务器常开启
net.ipv4.tcp_max_syn_backlog半连接队列长度默认128高频并发系统调大,如 4096
net.core.somaxconnlisten 队列最大值默认128Web服务器建议 1024+
net.core.netdev_max_backlog接收队列最大值默认1000网络密集型系统可调至 5000~10000

I/O 与文件系统(fs.*)#

参数作用常用取值说明
fs.file-max系统最大打开文件数整数默认较小,生产环境可调大
fs.nr_open每进程最大文件描述符整数通常配合 ulimit 调整
fs.aio-max-nr最大 AIO 请求数默认65536I/O 密集型程序可调大
fs.inotify.max_user_watches单用户最大 inotify 监听数默认8192常用于监控、同步程序(如 inotifywait)

进程与安全(kernel.*)#

参数作用常用取值说明
kernel.pid_max最大进程号默认32768高并发系统可调至 4194304
kernel.threads-max最大线程数整数控制系统并发上限
kernel.msgmnb / msgmax / msgmni消息队列相关各种整数值IPC 调整时常用
kernel.shmall / shmmax共享内存段总量与单段大小字节数数据库常调大
kernel.sched_migration_cost_ns调度迁移延迟纳秒值调度优化时可微调

使用#

查看参数#

Terminal window
sysctl vm.swappiness

修改参数#

Terminal window
# 临时修改(立即生效,重启失效)
sysctl -w vm.swappiness=10
# 永久修改(写入配置文件)
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p # 重新加载

常见组合参数#

数据库服务器(MySQL、PostgreSQL、Oracle)#

调优目标:#

  • 稳定性优先
  • 减少 Swap、保证 I/O 连续性
  • 支持大页内存与共享内存段

常用参数组合#

参数推荐值说明
vm.swappiness1~10尽量不使用 swap
vm.overcommit_memory1允许一定内存超分配
vm.dirty_ratio10减少脏页堆积
vm.dirty_background_ratio5更早触发后台写回
vm.nr_hugepages若干(根据DB内存)启用大页(HugePage)减少TLB miss
kernel.shmmax总内存的 50%~80%允许数据库大共享内存段
kernel.shmall与上匹配系统可用共享内存总量
fs.file-max≥1000000增加文件句柄数
fs.aio-max-nr1048576支持更多异步I/O请求
net.core.somaxconn1024+增加连接排队队列
net.ipv4.tcp_fin_timeout15减少TIME_WAIT积压

另外,MySQL 数据库部署的系统上建议关闭 透明大页(THP),有助于小文件随机读写性能

Terminal window
echo never > /sys/kernel/mm/transparent_hugepage/enabled

高并发 Web / API 服务器(Nginx、Node.js、Gunicorn 等)#

调优目标:#

  • 提升连接承载量
  • 降低 TIME_WAIT 影响
  • 增大队列和缓冲区

常用参数组合#

参数推荐值说明
net.core.somaxconn1024~65535listen() 队列上限
net.ipv4.tcp_max_syn_backlog4096+半连接队列上限
net.ipv4.tcp_tw_reuse1复用 TIME_WAIT 连接
net.ipv4.tcp_fin_timeout15提高连接回收速度
net.ipv4.ip_local_port_range1024 65535扩大本地端口范围
net.core.netdev_max_backlog10000NIC 接收队列上限
fs.file-max1048576提高系统文件句柄
net.ipv4.tcp_sack1启用 SACK 提高传输效率
  • Web 服务高峰期常出现 TIME_WAIT 激增,可通过 tcp_tw_reuse=1 缓解。
  • 配合 ulimit -n 调整进程级文件描述符限制。

文件存储 / NFS / 对象存储服务器#

调优目标:#

  • 提高磁盘缓存写入效率
  • 减少脏页滞留
  • 增加 I/O 并行度

常用参数组合#

参数推荐值说明
vm.dirty_ratio15系统允许的最大脏页比例
vm.dirty_background_ratio5后台写回比例
vm.vfs_cache_pressure50保留更多 inode/dentry 缓存
fs.aio-max-nr1048576异步I/O上限
vm.laptop_mode0服务器上应禁用节能延迟写入
vm.swappiness5降低 Swap 使用
fs.file-max500000+提高文件句柄数
  • 如果是大量小文件读写,可以考虑关闭 THP。
  • 对 SSD 或 NVMe 存储,I/O 调度器推荐使用 nonemq-deadline

容器宿主机(Kubernetes / Docker / Podman)#

调优目标:#

  • 提高 cgroup 调度效率
  • 限制资源滥用
  • 提升网络与进程数量上限

常用参数组合#

参数推荐值说明
vm.overcommit_memory1容器内进程灵活分配内存
kernel.pid_max4194304提高 PID 上限
kernel.threads-max2097152提高线程数
net.ipv4.ip_forward1启用容器网络转发
net.bridge.bridge-nf-call-iptables1启用容器网络规则
fs.inotify.max_user_instances512提高容器内监控上限
fs.inotify.max_user_watches1048576常用于 k8s + inotify 场景
net.netfilter.nf_conntrack_max1048576设置连接跟踪表的最大条目数
net.ipv4.netfilter.ip_conntrack_max1048576旧版内核的连接跟踪参数,与上面功能相同
net.core.somaxconn65535设置每个端口监听队列的最大长度
net.ipv4.tcp_max_syn_backlog65535TCP半连接队列(SYN队列)的最大长度
net.core.netdev_max_backlog65535网络设备接收队列的最大数据包数量
vm.dirty_ratio15系统内存中”脏页”(待写入磁盘的数据)的最大比例
vm.swappiness10减少swap使用
vm.dirty_background_ratio 5后台回写进程开始工作的脏页比例阈值
fs.file-max 2097152系统级别最大可打开文件句柄数
  • 容器主机经常 hit “Too many open files” 或 “too many processes”,要同时调整 ulimit + sysctl
  • 可以使用 systemd-cgls 查看容器对应的 cgroup 层级。

安全 / 网关类主机#

调优目标#

  • 增强网络安全性
  • 降低攻击面

常用参数组合#

参数推荐值说明
net.ipv4.conf.all.rp_filter1启用反向路径过滤
net.ipv4.conf.all.accept_redirects0禁止 ICMP 重定向
net.ipv4.conf.all.accept_source_route0禁止源路由包
net.ipv4.icmp_echo_ignore_broadcasts1忽略广播 ICMP
net.ipv4.tcp_syncookies1SYN 攻击防御

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
sysctl运行时参数及面向场景的调优策略
https://white-festa.net/posts/sysctl_arguments/sysctl-运行时参数/
作者
常世常暗
发布于
2025-01-11
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-01-11,距今已过 346 天

部分内容可能已过时

评论区

目录