Linux系统性能优化技巧

描述

前言: 经过10年一线运维经验,我发现大多数工程师只掌握了Linux优化的冰山一角。今天分享的这些秘技,能让你的系统性能提升200%以上!

秘技一:内核参数的隐藏优化点

1.1 网络性能的终极优化

大多数人只知道调整net.core.somaxconn,但真正的高手会这样做:

 

# 99%的人不知道的TCP优化组合拳
echo'net.core.rmem_default = 262144' >> /etc/sysctl.conf
echo'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo'net.core.wmem_default = 262144' >> /etc/sysctl.conf
echo'net.core.wmem_max = 134217728' >> /etc/sysctl.conf

# 这个参数90%的运维都忽略了
echo'net.ipv4.tcp_rmem = 8192 65536 134217728' >> /etc/sysctl.conf
echo'net.ipv4.tcp_wmem = 8192 65536 134217728' >> /etc/sysctl.conf

# 秘密武器:TIME_WAIT快速回收
echo'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
echo'net.ipv4.tcp_fin_timeout = 10' >> /etc/sysctl.conf

 

实战效果: 某电商系统应用此配置后,高并发场景下延迟降低了65%!

1.2 内存管理的神级调优

 

# 内存回收策略优化(很少人知道)
echo 'vm.dirty_ratio = 5' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio = 2' >> /etc/sysctl.conf
echo 'vm.dirty_writeback_centisecs = 100' >> /etc/sysctl.conf

# OOM杀手的精准控制
echo 'vm.oom_kill_allocating_task = 1' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 2' >> /etc/sysctl.conf
echo 'vm.overcommit_ratio = 80' >> /etc/sysctl.conf

 

秘技二:文件系统的隐藏加速器

2.1 ext4的隐藏优化选项

 

# 挂载时使用这些参数,性能提升明显
mount -o defaults,noatime,nodiratime,commit=60,barrier=0 /dev/sda1 /data

# fstab永久配置
echo '/dev/sda1 /data ext4 defaults,noatime,nodiratime,commit=60,barrier=0 0 0' >> /etc/fstab

 

2.2 I/O调度器的黑科技

 

# 根据磁盘类型选择最优调度器
# SSD使用noop
echo noop > /sys/block/sda/queue/scheduler

# 机械硬盘使用deadline
echo deadline > /sys/block/sdb/queue/scheduler

# 永久生效的方法(很多人不知道)
echo 'echo noop > /sys/block/sda/queue/scheduler' >> /etc/rc.local

 

秘技三:进程调度的终极优化

3.1 CPU亲和性绑定

 

# 将关键进程绑定到特定CPU核心
taskset -cp 0,1 $(pgrep nginx)
taskset -cp 2,3 $(pgrep mysqld)

# 中断处理优化(高级技巧)
echo 2 > /proc/irq/24/smp_affinity
echo 4 > /proc/irq/25/smp_affinity

 

3.2 进程优先级的精准控制

 

# 提升关键服务优先级
renice -10 $(pgrep nginx)
renice -15 $(pgrep mysqld)

# 使用ionice控制I/O优先级
ionice -c 1 -n 0 $(pgrep mysqld)

 

秘技四:内存优化的独门绝技

4.1 Huge Pages配置

 

# 计算所需huge pages数量
grep HugePages /proc/meminfo

# 配置2MB huge pages
echo 1024 > /proc/sys/vm/nr_hugepages

# 永久配置
echo 'vm.nr_hugepages = 1024' >> /etc/sysctl.conf

 

4.2 NUMA优化策略

 

# 查看NUMA拓扑
numactl --hardware

# 绑定进程到特定NUMA节点
numactl --cpunodebind=0 --membind=0 mysqld

# 自动优化脚本
#!/bin/bash
for pid in $(pgrep nginx); do
    node=$((pid % $(numactl --hardware | grep available | awk '{print $2}')))
    numactl --cpunodebind=$node --membind=$node --pid=$pid
done

 

秘技五:系统监控的黑科技

5.1 自定义性能监控脚本

 

#!/bin/bash
# 性能监控一键脚本
cat > /usr/local/bin/perf_monitor.sh << 'EOF'
#!/bin/bash

whiletrue; do
    timestamp=$(date'+%Y-%m-%d %H:%M:%S')
    
    # CPU使用率
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
    
    # 内存使用率
    mem_usage=$(free | grep Mem | awk '{printf("%.2f"), ($3/$2) * 100}')
    
    # I/O等待
    io_wait=$(iostat -x 1 1 | tail -n +4 | head -1 | awk '{print $5}')
    
    # 网络连接数
    conn_count=$(ss -an | grep ESTABLISHED | wc -l)
    
    echo"$timestamp,CPU:${cpu_usage}%,MEM:${mem_usage}%,IO:${io_wait}%,CONN:${conn_count}"
    
    sleep 10
done
EOF

chmod +x /usr/local/bin/perf_monitor.sh

 

5.2 系统瓶颈自动检测

 

#!/bin/bash
# 瓶颈检测脚本
check_bottleneck() {
    echo"=== 系统瓶颈检测报告 ==="
    
    # CPU负载检测
    load_avg=$(uptime | awk -F'load average:''{print $2}' | awk '{print $1}' | sed 's/,//')
    cpu_cores=$(nproc)
    if (( $(echo "$load_avg > $cpu_cores * 0.8" | bc -l) )); then
        echo"  CPU负载过高: $load_avg (核心数: $cpu_cores)"
    fi
    
    # 内存使用检测
    mem_percent=$(free | grep Mem | awk '{print ($3/$2) * 100.0}')
    if (( $(echo "$mem_percent > 85" | bc -l) )); then
        echo"  内存使用率过高: ${mem_percent}%"
    fi
    
    # 磁盘I/O检测
    io_util=$(iostat -x 1 1 | tail -n +4 | awk '{if($10>80) print $1":"$10"%"}')
    if [ ! -z "$io_util" ]; then
        echo"  磁盘I/O使用率过高: $io_util"
    fi
}

 

秘技六:网络性能调优进阶

6.1 网卡队列优化

 

# 查看网卡队列数
ethtool -l eth0

# 调整接收队列数量
ethtool -L eth0 combined 4

# 调整缓冲区大小
ethtool -G eth0 rx 4096 tx 4096

 

6.2 防火墙性能优化

 

# iptables连接跟踪优化
echo 'net.netfilter.nf_conntrack_max = 1048576' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 300' >> /etc/sysctl.conf

# 提升iptables处理性能
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK

 

实战案例:电商系统优化实录

背景: 某电商平台在双11期间遇到性能瓶颈,QPS从8000突然下降到2000。

排查过程:

1. CPU分析: perf top发现kernel态占用过高

2. 内存分析: 发现大量page cache未及时回写

3. 网络分析: TIME_WAIT连接堆积严重

解决方案:

 

# 1. 调整内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w vm.dirty_ratio=5
sysctl -w net.core.netdev_max_backlog=5000

# 2. 应用层优化
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local

# 3. 磁盘I/O优化
echo deadline > /sys/block/sda/queue/scheduler

 

优化效果:

• QPS从2000提升至12000

• 平均响应时间从200ms降至50ms

• CPU使用率从90%降至60%

一键优化脚本

 

#!/bin/bash
# Linux系统一键优化脚本
# 使用方法: bash optimize.sh

cat > optimize.sh << 'EOF'
#!/bin/bash
echo"开始Linux系统优化..."

# 备份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)

# 网络优化
cat >> /etc/sysctl.conf << 'NETWORK'
# 网络性能优化
net.core.rmem_default = 262144
net.core.rmem_max = 134217728
net.core.wmem_default = 262144
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 8192 65536 134217728
net.ipv4.tcp_wmem = 8192 65536 134217728
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.core.netdev_max_backlog = 5000
net.core.somaxconn = 65535
NETWORK

# 内存优化
cat >> /etc/sysctl.conf << 'MEMORY'
# 内存管理优化
vm.dirty_ratio = 5
vm.dirty_background_ratio = 2
vm.dirty_writeback_centisecs = 100
vm.swappiness = 10
vm.vfs_cache_pressure = 50
MEMORY

# 文件系统优化
cat >> /etc/sysctl.conf << 'FILESYSTEM'
# 文件系统优化
fs.file-max = 1000000
fs.nr_open = 1000000
FILESYSTEM

# 应用优化配置
sysctl -p

echo"优化完成!建议重启系统使所有配置生效。"
EOF

chmod +x optimize.sh

 

高级优化技巧汇总

内核编译优化

 

# 自定义内核编译参数
make menuconfig
# 启用: Processor type -> Generic x86-64
# 禁用: 不必要的驱动和模块

 

应用级别优化

 

# Nginx worker进程绑定CPU
worker_processes auto;
worker_cpu_affinity auto;

# MySQL innodb优化
innodb_buffer_pool_size = 70%内存
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

 

监控告警设置

 

# 使用systemd监控关键服务
systemctl enable mysqld nginx

# 设置资源限制
echo 'mysql soft nofile 65535' >> /etc/security/limits.conf
echo 'mysql hard nofile 65535' >> /etc/security/limits.conf

 

总结

这些优化技巧经过生产环境验证,能显著提升Linux系统性能。记住几个关键点:

1. 渐进式优化:不要一次性应用所有配置

2. 监控先行:建立完善的监控体系

3. 基准测试:优化前后都要做性能测试

4. 文档记录:记录每次优化的效果

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分