Linux内核参数调优是服务器性能优化的基础环节。默认内核配置面向通用场景,在高并发Web服务、数据库、消息队列等生产负载下,网络缓冲区、文件描述符、内存管理等参数需要针对性调整。本文通过实际配置案例,覆盖网络栈、文件系统、内存管理三个维度的内核调优。
网络内核参数调优:TCP连接与缓冲区配置
高并发场景下,TCP连接的建立、保持和回收效率直接影响服务吞吐。以下参数通过sysctl命令动态修改,修改后立即生效。
TCP连接复用与回收:
# 允许TIME_WAIT状态的socket快速回收
net.ipv4.tcp_tw_reuse = 1
# 缩短FIN_WAIT_2状态超时时间(秒)
net.ipv4.tcp_fin_timeout = 15
# 缩短keepalive探测间隔(秒)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# SYN队列长度,高并发场景建议加大
net.ipv4.tcp_max_syn_backlog = 65535
# 增加系统最大连接跟踪数
net.netfilter.nf_conntrack_max = 1048576
TCP接收和发送缓冲区:
# TCP读写缓冲区最小值/默认值/最大值(字节)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP自动调节窗口开启
net.ipv4.tcp_moderate_rcvbuf = 1
# 启用窗口缩放
net.ipv4.tcp_window_scaling = 1
# 启用TCP Fast Open
net.ipv4.tcp_fastopen = 3
网卡队列与积压参数:
# 全局最大积压队列
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# 接收/发送缓冲区最大值
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
# 启用BBR拥塞控制算法
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
BBR(Bottleneck Bandwidth and RTT)相比传统CUBIC算法,在高带宽延迟网络中能更好利用带宽。fq(Fair Queue)队列调度配合BBR效果最佳。
文件系统性能优化:I/O调度器与挂载选项
磁盘I/O调度器决定了内核如何排序和合并I/O请求。不同工作负载适用不同调度器。
查看当前调度器:
cat /sys/block/sda/queue/scheduler
# 输出示例: noop deadline [cfq] mq-deadline kyber bfq none
切换I/O调度器:
# SSD/NVMe推荐none或mq-deadline
echo none > /sys/block/nvme0n1/queue/scheduler
# 机械硬盘推荐mq-deadline或bfq
echo mq-deadline > /sys/block/sda/queue/scheduler
各调度器适用场景:
– none:不进行任何调度,设备自行处理。NVMe SSD延迟极低,调度开销大于收益。
– mq-deadline:多队列截止时间调度,保证请求在截止时间内完成。通用性最好。
– bfq:带宽公平分配,适合交互式应用和桌面环境,开销较大。
文件系统挂载选项优化:
# /etc/fstab 优化配置
# ext4 文件系统
UUID=xxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
# xfs 文件系统
UUID=xxx /var/lib/docker xfs defaults,noatime,nodiratime,allocsize=64m 0 0
– noatime:禁止更新文件访问时间,减少元数据写操作。
– data=writeback(ext4):数据写入顺序不保证,提升性能但崩溃时可能丢失最近写入。仅适合可重建的数据。
– allocsize=64m(xfs):预分配64MB空间,减少碎片。
I/O队列深度调整:
# 查看当前队列深度
cat /sys/block/nvme0n1/queue/nr_requests
# 调整为1024(高I/O负载场景)
echo 1024 > /sys/block/nvme0n1/queue/nr_requests
内存管理参数调优:Swappiness与OOM控制
Linux内存管理参数控制交换分区使用策略和OOM(Out of Memory)行为。
# 降低swap使用倾向(0-100,值越低越倾向使用物理内存)
# 数据库服务器建议设为1,Web服务器建议10-20
vm.swappiness = 10
# 限制单进程最大内存映射区域数量
vm.max_map_count = 262144
# 脏页占比阈值,超过此值触发同步写入
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 脏页过期时间(百分之一秒)
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
OOM Killer行为调整:
# 禁止OOM Killer杀掉关键进程(需配合cgroup使用)
# 将进程PID写入oom_score_adj为-1000可完全保护
echo -1000 > /proc/$(pidof mysqld)/oom_score_adj
# 全局OOM行为:0=启用OOM Killer, 1=禁用
vm.panic_on_oom = 0
# 内存过量提交策略
# 0=启发式过量提交, 1=总是允许, 2=严格不允许
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
透明大页(THP)配置:
# 查看THP状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 数据库环境建议关闭THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
THP在连续内存访问场景能减少TLB miss,但数据库随机访问工作负载下可能导致延迟抖动。Oracle、PostgreSQL、Redis均建议关闭THP。
文件描述符与连接数限制调整
高并发服务需要大量文件描述符。Linux默认值通常为1024,远不能满足生产需求。
临时修改限制:
# 查看当前限制
ulimit -n
# 临时提升
ulimit -n 1048576
永久修改(/etc/security/limits.conf):
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
Systemd服务文件描述符限制(/etc/systemd/system/myservice.service):
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
内核级文件描述符上限:
# 查看当前值
cat /proc/sys/fs/file-max
# 设置为更大的值
echo 2097152 > /proc/sys/fs/file-max
# 查看已分配/未分配/最大值
cat /proc/sys/fs/file-nr
inotify监控限制(文件监控服务如Prometheus需要调整):
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.inotify.max_queued_events = 16384
内核参数持久化配置与验证
所有通过sysctl动态修改的参数在重启后失效。持久化配置写入/etc/sysctl.conf或/etc/sysctl.d/目录。
创建专用配置文件:
cat > /etc/sysctl.d/99-production.conf << 'EOF'
# 网络参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# 内存参数
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 文件描述符
fs.file-max = 2097152
fs.inotify.max_user_watches = 1048576
EOF
加载配置并验证:
# 应用配置
sysctl -p /etc/sysctl.d/99-production.conf
# 验证关键参数
sysctl net.ipv4.tcp_congestion_control
sysctl vm.swappiness
sysctl net.core.somaxconn
使用sysstat工具包验证调优效果:
# 安装
yum install sysstat -y # CentOS/RHEL
apt install sysstat -y # Debian/Ubuntu
# 实时查看网络统计
sar -n DEV 1 5
# 查看TCP连接状态分布
ss -s
# 查看各状态TCP连接数
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
调优是一个持续过程,建议每次只调整一组参数,通过基准测试对比效果,避免同时修改多个参数导致无法定位性能变化的原因。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nei-he-can-shu-diao-you-shi-zhan-wang-luo-yu/