Linux服务器性能优化总结
1. 引言
系统性能是一个多维度的综合指标,它不仅仅取决于应用程序本身的质量和底层硬件资源的多寡,更取决于操作系统(OS)作为中间层,能否将硬件资源高效、稳定地分配给应用程序。错误或保守的OS配置会成为性能瓶颈,无法充分发挥硬件和软件的全部潜力。
本文档聚焦于Linux操作系统层面的关键性能调优点,通过一系列易于操作的配置调整,旨在提升服务器在高并发、高I/O、高计算负载下的稳定性和吞吐量,为上层应用(如数据库、大数据平台、Web服务等)提供一个坚实且高效的基础运行环境。
2. 资源限制 (ulimit) 优化
优化目标:防止因单个用户或进程耗尽系统资源(如文件句柄、进程数)而导致的服务拒绝、意外崩溃或系统不稳定。
2.1 文件句柄数 (nofile
)
- 说明:Linux中一切皆文件,网络连接(Socket)、打开的文件、监听的端口等都消耗文件描述符(句柄)。过小的限制会导致应用报
"Too many open files"
错误。 - 检查命令:
ulimit -n
- 建议值:生产环境建议调整为 655350 或更高。
- 调整方法:
# 临时调整(生效至下次重启或用户退出) ulimit -n 655350# 永久调整(对所有登录用户生效) echo -e '* soft nofile 655350\n* hard nofile 655350' >> /etc/security/limits.conf # 如需对特定用户生效,将 '*' 替换为用户名,如 'oracle soft nofile 655350'
2.2 用户进程数 (nproc
)
- 说明:限制单个用户可创建的最大进程数。对于会频繁创建子进程的服务(如Java应用、PHP-FPM等),过小的限制会导致
"fork: retry: Resource temporarily unavailable"
错误。 - 检查命令:
ulimit -u
- 建议值:生产环境建议 655350。
- 调整方法:
# 临时调整 ulimit -u 655350# 永久调整 echo -e '* soft nproc 655350\n* hard nproc 655350' >> /etc/security/limits.conf # 注意:在 CentOS 7+ 系统中,可能还需修改 /etc/security/limits.d/20-nproc.conf 文件
3. 磁盘I/O调度算法优化
优化目标:为不同的存储介质(HDD/SSD)选择最合适的I/O请求排序策略,最大化磁盘吞吐量和响应速度。
-
调度算法对比:
调度算法 特点 适用场景 deadline
保证请求的截止时间,避免I/O饥饿 传统机械硬盘 (HDD) noop
简单的FIFO队列,无额外排序 SSD、NVMe、虚拟化环境(Guest OS) cfq
完全公平队列,为每个进程分配时间片 旧版本默认,现已逐渐淘汰 kyber
针对现代低延迟设备(如SSD)优化 现代SSD bfq
预算公平队列,保证带宽公平性 桌面系统等需要公平性的场景 -
检查与调整方法:
# 1. 查看磁盘设备名 lsblk# 2. 检查当前磁盘调度算法(以 sdb 为例) cat /sys/block/sdb/queue/scheduler # 输出示例:`noop [deadline] cfq`,中括号[]内为当前生效的算法# 3. 临时调整(将sdb调整为noop) echo noop > /sys/block/sdb/queue/scheduler# 4. 永久调整(将命令写入启动脚本) echo 'echo noop > /sys/block/sdb/queue/scheduler' >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local
4. Swap分区管理
优化目标:平衡内存不足时的系统稳定性与极致性能需求。Swap可防止因内存耗尽而触发OOM Killer导致进程被强制杀死,但频繁的Swap交换(Swapping)会严重拖慢性能。
- 查看Swap状态:
free -h cat /proc/meminfo | grep -i swap
4.1 禁用Swap(追求极致性能)
- 场景:适用于内存容量绝对充足(如远大于应用峰值需求)的数据密集型应用,如Redis、Elasticsearch、HBase等,以避免任何不可预测的I/O延迟。
- 操作方法:
# 临时禁用所有Swap swapoff -a# 永久禁用:注释掉 /etc/fstab 中所有含 'swap' 的行 sed -ri 's/.*swap.*/#&/' /etc/fstab
4.2 启用/创建Swap(保障系统稳定性)
- 场景:内存紧张或需要应对突发流量的通用服务器。
- 建议大小:通常为物理内存的 1~2倍,但最大一般不超过16GB。
- 操作方法(创建4G Swap文件):
# 创建Swap文件 sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 # 或使用更快的 fallocate(但某些文件系统不支持) # sudo fallocate -l 4G /swapfilesudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile# 永久生效 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
5. CPU性能模式调优
优化目标:让CPU始终以最高性能状态运行,避免因节能策略(频率动态调整)引入的性能波动和响应延迟。
-
安装工具:
yum install kernel-tools
或yum install cpupowerutils
-
检查当前策略:
cpupower frequency-info
-
常用调速器 (Governor):
performance
:推荐。CPU始终以支持的最高主频运行。powersave
:CPU始终以最低主频运行。ondemand
:按需动态调整,较平衡。schedutil
:基于调度器负载调整,新一代默认策略。
-
调整方法:
# 1. 检查CPU是否支持调整 cpupower frequency-info --policy# 2. 临时设置为performance模式(对所有CPU核心生效) cpupower frequency-set -g performance # 或 echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor# 3. 永久设置 echo 'cpupower frequency-set -g performance' >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local
6. 内存分配策略 (Overcommit) 优化
优化目标:调整内核的内存分配策略,以满足特定应用(如数据库)的内存需求,避免因内核过于保守的拒绝分配而导致应用异常。
-
模式说明:
- 0 (启发式overcommit,默认):内核根据一些启发式算法判断是否有足够内存。
- 1 (总是overcommit):推荐用于数据库等内存消耗型应用。内核总是答应所有内存申请请求,实际物理内存只在真正写入时分配。风险是可能触发OOM Killer。
- 2 (禁止overcommit):分配内存总量不超过
Swap + RAM * overcommit_ratio%
。
-
调整方法:
# 查看当前设置 cat /proc/sys/vm/overcommit_memory# 临时设置为模式1 echo 1 > /proc/sys/vm/overcommit_memory# 永久设置为模式1 echo "vm.overcommit_memory=1" >> /etc/sysctl.conf sysctl -p
7. 透明大页 (Transparent Hugepages - THP) 管理
优化目标:根据应用的内存访问模式决定是否启用THP。THP旨在通过减少TLB失效来提升性能,但其碎片整理过程可能对延迟敏感型应用(如数据库)产生负面性能影响。
-
检查状态:
cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag # 输出 `[always]` 表示启用,`[never]` 表示禁用,`[madvise]` 表示按建议启用。
-
建议:
- 对于数据库(Oracle, MySQL, PostgreSQL等)、Redis:强烈建议禁用。
- 对于科学计算、大数据处理(Hadoop):通常受益,建议开启。
-
禁用方法(数据库场景):
# 临时禁用 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag# 永久禁用 echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local
8. 网络参数调优
优化目标:优化TCP/IP协议栈行为,提升高并发网络连接下的处理能力、减少连接延迟和资源占用。
-
关键参数及建议:
# 连接队列优化 (预防连接溢出、SYN Flood) net.core.somaxconn = 4096 # 增大监听队列长度 net.ipv4.tcp_max_syn_backlog = 8192 # 增大SYN队列长度 net.ipv4.tcp_abort_on_overflow = 1 # 队列满时直接发送RST拒绝,快速失败# 连接状态优化 (快速回收端口资源) net.ipv4.tcp_tw_reuse = 1 # 允许TIME-WAIT套接字用于新的TCP连接 net.ipv4.tcp_fin_timeout = 30 # 减少FIN-WAIT-2状态等待时间# 保活与检测 net.ipv4.tcp_keepalive_time = 600 # 减少不必要的保活包发送频率
-
应用方法:
# 临时调整 echo 4096 > /proc/sys/net/core/somaxconn # ... (其他参数同理)# 永久调整:将以下内容追加至 /etc/sysctl.conf cat >> /etc/sysctl.conf << EOF net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_abort_on_overflow = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 600 EOF# 使配置立即生效 sysctl -p
9. 注意事项与最佳实践
- 测试先行:任何生产环境的修改都应在测试环境充分验证。
- 逐步调整:不要一次性修改所有参数,应逐个调整并观察效果,便于定位问题。
- 监控验证:调整前后使用监控工具(如
vmstat
,iostat
,netstat
,sar
,top
)对比系统指标(CPU、内存、I/O、网络)。 - 文档记录:记录所有变更的配置、时间、理由及预期效果。
- 理解业务:最优配置高度依赖于具体业务负载。数据库、Web服务器、文件服务器的优化侧重点各不相同。
免责声明:本文档仅供参考。请根据您的具体硬件环境、工作负载和应用特性进行谨慎调整。不恰当的配置可能导致系统不稳定或性能下降。