Linux性能调优:系统优化与性能提升实战指南

引言

Linux性能调优是系统管理员和运维工程师必备的核心技能。通过系统性的性能分析和优化,可以显著提升系统的响应速度、吞吐量和稳定性。本文将深入探讨Linux性能调优的方法论、工具使用和实战技巧。

CPU性能调优

1. CPU使用率分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

# CPU性能分析脚本

echo "=== CPU性能分析报告 ==="
echo "时间: $(date)"
echo ""

# CPU基本信息
echo "CPU信息:"
lscpu | grep -E "Model name|CPU\(s\)|Thread|Core"
echo ""

# CPU使用率
echo "CPU使用率:"
top -bn1 | grep "Cpu(s)" | awk '{print "用户态: "$2", 系统态: "$4", 空闲: "$8}'
echo ""

# 负载平均值
echo "系统负载:"
uptime | awk -F'load average:' '{print "负载平均值:"$2}'
echo ""

# CPU密集型进程
echo "CPU使用率最高的10个进程:"
ps aux --sort=-%cpu | head -11
echo ""

# 中断统计
echo "中断统计:"
cat /proc/interrupts | head -10

2. CPU调度优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash

# CPU调度优化脚本

# 设置CPU调度器
echo "当前CPU调度器:"
cat /sys/block/sda/queue/scheduler

# 优化CPU亲和性
function optimize_cpu_affinity() {
local process_name=$1
local cpu_cores=$2

echo "优化 $process_name 的CPU亲和性..."

# 查找进程PID
local pids=$(pgrep $process_name)

for pid in $pids; do
if [ -n "$pid" ]; then
taskset -cp $cpu_cores $pid
echo "进程 $pid 绑定到CPU核心 $cpu_cores"
fi
done
}

# 示例:将nginx进程绑定到特定CPU核心
optimize_cpu_affinity "nginx" "0,1"
optimize_cpu_affinity "mysql" "2,3"

# 设置进程优先级
function set_process_priority() {
local process_name=$1
local nice_value=$2

echo "设置 $process_name 进程优先级为 $nice_value"

local pids=$(pgrep $process_name)
for pid in $pids; do
if [ -n "$pid" ]; then
renice $nice_value $pid
fi
done
}

# 降低备份进程优先级
set_process_priority "backup" "10"

内存性能调优

1. 内存使用分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

# 内存性能分析脚本

echo "=== 内存性能分析 ==="

# 内存使用概况
echo "内存使用情况:"
free -h
echo ""

# 内存使用率最高的进程
echo "内存使用率最高的10个进程:"
ps aux --sort=-%mem | head -11
echo ""

# 交换分区使用情况
echo "交换分区使用:"
swapon --show
echo ""

# 内存碎片化分析
echo "内存碎片化信息:"
cat /proc/buddyinfo
echo ""

# 缓存和缓冲区
echo "缓存统计:"
cat /proc/meminfo | grep -E "Cached|Buffers|Dirty"

2. 内存优化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/bash

# 内存优化脚本

# 调整虚拟内存参数
function optimize_vm_parameters() {
echo "优化虚拟内存参数..."

# 调整swappiness
echo "vm.swappiness = 10" >> /etc/sysctl.conf

# 调整脏页回写
echo "vm.dirty_ratio = 15" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf

# 调整内存过量分配
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf

# 应用配置
sysctl -p

echo "虚拟内存参数优化完成"
}

# 清理内存缓存
function clear_memory_cache() {
echo "清理内存缓存..."

# 同步文件系统
sync

# 清理页面缓存
echo 1 > /proc/sys/vm/drop_caches

# 清理目录项和inode缓存
echo 2 > /proc/sys/vm/drop_caches

# 清理所有缓存
echo 3 > /proc/sys/vm/drop_caches

echo "内存缓存清理完成"
}

optimize_vm_parameters

磁盘I/O性能调优

1. 磁盘性能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

# 磁盘性能测试脚本

TEST_DIR="/tmp/disk_test"
TEST_FILE="$TEST_DIR/test_file"
TEST_SIZE="1G"

mkdir -p $TEST_DIR

echo "=== 磁盘性能测试 ==="

# 顺序写测试
echo "顺序写测试:"
dd if=/dev/zero of=$TEST_FILE bs=1M count=1024 oflag=direct 2>&1 | grep -E "copied|MB/s"

# 顺序读测试
echo "顺序读测试:"
dd if=$TEST_FILE of=/dev/null bs=1M iflag=direct 2>&1 | grep -E "copied|MB/s"

# 随机读写测试(需要fio工具)
if command -v fio &> /dev/null; then
echo "随机读写测试:"
fio --name=random-rw --ioengine=libaio --iodepth=4 --rw=randrw --bs=4k --direct=1 --size=100M --numjobs=1 --runtime=60 --group_reporting --filename=$TEST_FILE
fi

# 清理测试文件
rm -rf $TEST_DIR

2. 磁盘I/O优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

# 磁盘I/O优化脚本

# 优化磁盘调度器
function optimize_disk_scheduler() {
echo "优化磁盘调度器..."

for disk in $(lsblk -d -o NAME | grep -v NAME); do
# SSD使用noop或deadline
if [[ $(cat /sys/block/$disk/queue/rotational) == "0" ]]; then
echo "deadline" > /sys/block/$disk/queue/scheduler
echo "SSD $disk 设置为 deadline 调度器"
else
# HDD使用cfq
echo "cfq" > /sys/block/$disk/queue/scheduler
echo "HDD $disk 设置为 cfq 调度器"
fi
done
}

# 调整文件系统参数
function optimize_filesystem() {
echo "优化文件系统参数..."

# 调整文件系统挂载选项
cat >> /etc/fstab << 'EOF'
# 性能优化挂载选项
# /dev/sdb1 /data ext4 defaults,noatime,nodiratime 0 2
EOF

# 调整内核参数
cat >> /etc/sysctl.conf << 'EOF'
# 磁盘I/O优化
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
EOF

sysctl -p
}

optimize_disk_scheduler
optimize_filesystem

网络性能调优

1. 网络性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

# 网络性能分析脚本

echo "=== 网络性能分析 ==="

# 网络接口统计
echo "网络接口统计:"
cat /proc/net/dev
echo ""

# 网络连接统计
echo "网络连接统计:"
netstat -s | grep -E "connections|packets|errors"
echo ""

# TCP连接状态
echo "TCP连接状态分布:"
netstat -an | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key"\t"state[key]}'
echo ""

# 网络带宽使用
echo "网络带宽使用:"
if command -v iftop &> /dev/null; then
timeout 10 iftop -t -s 10
fi

2. 网络参数优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash

# 网络性能优化脚本

function optimize_network_parameters() {
echo "优化网络参数..."

cat >> /etc/sysctl.conf << 'EOF'
# 网络性能优化
# TCP缓冲区大小
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216

# TCP窗口缩放
net.ipv4.tcp_window_scaling = 1

# TCP时间戳
net.ipv4.tcp_timestamps = 1

# TCP SACK
net.ipv4.tcp_sack = 1

# TCP快速回收
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

# TCP keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# 连接队列大小
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000

# TCP SYN队列
net.ipv4.tcp_max_syn_backlog = 8192
EOF

sysctl -p
echo "网络参数优化完成"
}

optimize_network_parameters

系统整体优化

1. 系统资源限制优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

# 系统资源限制优化

function optimize_system_limits() {
echo "优化系统资源限制..."

# 备份原配置
cp /etc/security/limits.conf /etc/security/limits.conf.backup

# 添加优化配置
cat >> /etc/security/limits.conf << 'EOF'
# 系统性能优化
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
EOF

# 优化systemd服务限制
mkdir -p /etc/systemd/system.conf.d
cat > /etc/systemd/system.conf.d/limits.conf << 'EOF'
[Manager]
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535
EOF

systemctl daemon-reload
echo "系统资源限制优化完成"
}

optimize_system_limits

2. 性能监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

# 系统性能监控脚本

LOG_FILE="/var/log/performance-monitor.log"
ALERT_THRESHOLD_CPU=80
ALERT_THRESHOLD_MEM=90
ALERT_THRESHOLD_DISK=85

function monitor_system_performance() {
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")

# CPU使用率
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')

# 内存使用率
local mem_usage=$(free | awk 'NR==2{printf "%.2f", $3*100/$2}')

# 磁盘使用率
local disk_usage=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')

# 系统负载
local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')

# 记录性能数据
echo "[$timestamp] CPU: ${cpu_usage}%, MEM: ${mem_usage}%, DISK: ${disk_usage}%, LOAD: $load_avg" >> $LOG_FILE

# 检查告警阈值
if (( $(echo "$cpu_usage > $ALERT_THRESHOLD_CPU" | bc -l) )); then
echo "[$timestamp] ALERT: CPU使用率过高 ($cpu_usage%)" >> $LOG_FILE
fi

if (( $(echo "$mem_usage > $ALERT_THRESHOLD_MEM" | bc -l) )); then
echo "[$timestamp] ALERT: 内存使用率过高 ($mem_usage%)" >> $LOG_FILE
fi

if [ "$disk_usage" -gt "$ALERT_THRESHOLD_DISK" ]; then
echo "[$timestamp] ALERT: 磁盘使用率过高 ($disk_usage%)" >> $LOG_FILE
fi
}

# 执行监控
monitor_system_performance

最佳实践与总结

性能调优原则

  1. 测量先行:在优化前建立基准测试
  2. 逐步优化:一次只调整一个参数
  3. 持续监控:优化后持续观察系统表现
  4. 文档记录:记录所有配置变更

常见性能瓶颈

  1. CPU瓶颈:进程调度、中断处理
  2. 内存瓶颈:内存不足、频繁交换
  3. 磁盘I/O瓶颈:随机读写、磁盘队列
  4. 网络瓶颈:带宽限制、连接数限制

优化建议

  1. 硬件层面:选择合适的CPU、内存、存储
  2. 系统层面:优化内核参数、文件系统
  3. 应用层面:优化应用配置、代码逻辑
  4. 监控层面:建立完善的性能监控体系

结语

Linux性能调优是一个系统性工程,需要从硬件、操作系统、应用等多个层面进行综合优化。通过科学的方法论和实用的工具,可以显著提升系统性能,为业务发展提供强有力的技术支撑。

版权所有,如有侵权请联系我