2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
浏览量:22 次 发布时间:2026-01-23 19:55 作者:明扬工控商城 下载docx
2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
Linux基础教程 第19课:性能调优和容量规划
好的,我们继续第十九课。今天学习Linux性能调优和容量规划,这是确保系统高效运行的关键技能。
第一部分:性能调优基础概念
1.1 什么是性能调优?
性能调优是通过优化系统配置和资源分配,提高系统整体性能的过程。
1.2 性能调优的原则
bash
# 1. 测量而不是猜测
# 2. 逐步进行,一次只改变一个变量
# 3. 记录所有更改
# 4. 监控优化效果
# 5. 避免过度优化
1.3 性能基准测试
bash
# 安装基准测试工具
sudo apt install -y sysbench phoronix-test-suite
# CPU基准测试
sysbench cpu --threads=4 run
# 内存基准测试
sysbench memory --threads=4 run
# 磁盘IO基准测试
sysbench fileio --file-total-size=2G prepare
sysbench fileio --file-total-size=2G --file-test-mode=rndrw --time=60 run
# 使用phoronix进行综合测试
phoronix-test-suite benchmark pts/cpu pts/memory pts/disk
第二部分:系统级性能监控
2.1 实时性能监控工具
bash
# 1. top命令(基本但强大)
top
# 按1:显示每个CPU核心
# 按M:按内存使用排序
# 按P:按CPU使用排序
# 按c:显示完整命令路径
# 2. htop(增强版)
sudo apt install htop
htop
# 3. glances(综合监控)
sudo apt install glances
glances
# 4. dstat(多功能)
sudo apt install dstat
dstat -tcdngy --top-cpu --top-mem
2.2 性能数据收集
bash
# 安装系统性能收集工具
sudo apt install -y sysstat collectd
# 查看sar数据
sar -u 1 3 # CPU使用率
sar -r 1 3 # 内存使用
sar -b 1 3 # 磁盘IO
sar -n DEV 1 3 # 网络
# 配置collectd
sudo systemctl enable collectd
sudo systemctl start collectd
2.3 性能监控脚本
bash
#!/bin/bash
# perf_monitor.sh
# 性能监控脚本
LOG_FILE="/var/log/perf_monitor.log"
INTERVAL=5 # 监控间隔(秒)
monitor_system() {
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
# 内存使用率
MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')
MEM_USED=$(free -m | awk '/^Mem:/{print $3}')
MEM_USAGE=$((MEM_USED * 100 / MEM_TOTAL))
# 磁盘使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 系统负载
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1)
# 网络流量
NET_RX=$(sar -n DEV 1 1 | grep "Average.*eth0" | awk '{print $5}')
NET_TX=$(sar -n DEV 1 1 | grep "Average.*eth0" | awk '{print $6}')
echo "$TIMESTAMP | CPU: ${CPU_USAGE}% | MEM: ${MEM_USAGE}% | DISK: ${DISK_USAGE}% | LOAD: ${LOAD_AVG} | NET: RX=${NET_RX}KB/s TX=${NET_TX}KB/s" >> "$LOG_FILE"
sleep $INTERVAL
done
}
# 运行监控
monitor_system
第三部分:CPU性能调优
3.1 CPU调度器优化
bash
# 查看当前CPU调度器
cat /sys/block/sda/queue/scheduler
# 修改调度器
# noop: 简单FIFO队列,适合虚拟机
# deadline: 适合数据库服务器
# cfq: 完全公平队列,适合桌面系统
# bfq: 预算公平队列,适合多媒体
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# 查看CPU频率调节器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 修改频率调节器
# performance: 最大性能
# powersave: 节能模式
# ondemand: 按需调节
# conservative: 保守调节
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
3.2 CPU亲和性设置
bash
# 查看CPU核心数
nproc
lscpu | grep "CPU(s):"
# 设置进程CPU亲和性
taskset -cp 0,1 <PID> # 绑定到CPU0和CPU1
taskset -cp 0-3 <PID> # 绑定到CPU0-3
# 启动进程时指定CPU亲和性
taskset -c 0,2,4 /usr/bin/myapp
# 查看进程的CPU亲和性
taskset -p <PID>
3.3 中断平衡
bash
# 安装中断平衡工具
sudo apt install irqbalance
# 查看中断分布
cat /proc/interrupts
# 查看特定设备的中断
grep eth0 /proc/interrupts
# 手动设置中断CPU亲和性
echo 3 > /proc/irq/<irq_number>/smp_affinity
# 3的二进制是11,表示使用CPU0和CPU1
# 启用中断平衡服务
sudo systemctl enable irqbalance
sudo systemctl start irqbalance
第四部分:内存性能调优
4.1 内存参数优化
bash
# 查看当前内存参数
sysctl -a | grep vm
# 优化内存参数
sudo tee /etc/sysctl.d/99-memory.conf << 'EOF'
# 减少交换倾向(0-100,越小越少交换)
vm.swappiness = 10
# 控制脏页写回(单位:百分比)
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
# 控制脏页写回时间(单位:百分之一秒)
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
# 虚拟内存统计
vm.stat_interval = 10
# overcommit策略(0:严格,1:总是,2:基于比例)
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
# 文件系统缓存压力
vm.vfs_cache_pressure = 50
EOF
# 应用配置
sudo sysctl -p /etc/sysctl.d/99-memory.conf
4.2 大页内存配置
bash
# 查看大页内存状态
cat /proc/meminfo | grep -i huge
# 配置透明大页
# 查看当前设置
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时禁用透明大页(某些数据库需要)
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 配置静态大页
# 1. 修改内核参数
sudo vim /etc/default/grub
# 添加:transparent_hugepage=never
# 2. 配置大页数量
sudo tee /etc/sysctl.d/99-hugepages.conf << 'EOF'
# 配置2MB大页(假设需要1GB大页内存)
vm.nr_hugepages = 512
# 配置1GB大页(需要CPU支持)
vm.nr_overcommit_hugepages = 16
EOF
sudo sysctl -p /etc/sysctl.d/99-hugepages.conf
4.3 OOM Killer调优
bash
# 查看OOM Killer配置
cat /proc/sys/vm/panic_on_oom
cat /proc/sys/vm/oom_kill_allocating_task
# 调整OOM Killer行为
sudo tee /etc/sysctl.d/99-oom.conf << 'EOF'
# 不panic,让OOM Killer处理
vm.panic_on_oom = 0
# OOM Killer杀死引起问题的进程
vm.oom_kill_allocating_task = 1
# 内存溢出时的处理方式
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
EOF
# 为重要进程设置OOM调整值
# 值越低越不容易被杀死(-1000到1000)
echo -100 > /proc/<PID>/oom_score_adj
第五部分:磁盘IO性能调优
5.1 文件系统优化
bash
# 查看文件系统类型和挂载选项
mount | grep "^/dev"
# ext4文件系统优化
# 创建文件系统时优化
sudo mkfs.ext4 -O ^has_journal -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb1
# 调整现有文件系统
sudo tune2fs -o journal_data_writeback /dev/sda1
sudo tune2fs -O ^has_journal /dev/sda1 # 关闭日志(谨慎使用)
# xfs文件系统优化
sudo mkfs.xfs -f -l size=128m,lazy-count=1 -d agcount=16 /dev/sdb1
# 挂载选项优化
# 在/etc/fstab中添加:
# noatime,nodiratime,data=writeback,barrier=0,nobh
5.2 I/O调度器调优
bash
# 查看块设备队列信息
ls /sys/block/sda/queue/
# 优化I/O调度器参数
# 设置读取批次大小
echo 256 | sudo tee /sys/block/sda/queue/read_ahead_kb
# 设置调度器队列深度
echo 256 | sudo tee /sys/block/sda/queue/nr_requests
# 设置最大扇区大小
echo 4096 | sudo tee /sys/block/sda/queue/max_sectors_kb
# 设置旋转延迟(针对机械硬盘)
echo 6 | sudo tee /sys/block/sda/queue/iosched/rotational
5.3 RAID优化
bash
# 查看RAID状态
cat /proc/mdstat
# 优化RAID参数
sudo tee /etc/sysctl.d/99-raid.conf << 'EOF'
# RAID条带缓存大小
dev.raid.speed_limit_min = 10000
dev.raid.speed_limit_max = 200000
# 调整读写策略
EOF
# 调整RAID同步速度
echo 100000 > /proc/sys/dev/raid/speed_limit_min
echo 200000 > /proc/sys/dev/raid/speed_limit_max
# 对于SSD RAID
echo 0 > /sys/block/md0/md/stripe_cache_size
第六部分:网络性能调优
6.1 TCP/IP协议栈优化
bash
# 查看当前TCP参数
sysctl -a | grep net.ipv4.tcp
# 优化TCP参数
sudo tee /etc/sysctl.d/99-network.conf << 'EOF'
# TCP缓冲区设置
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP连接设置
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 1
# TCP快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
# 拥塞控制算法
net.ipv4.tcp_congestion_control = bbr
# 其他优化
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
EOF
sudo sysctl -p /etc/sysctl.d/99-network.conf
6.2 网卡调优
bash
# 查看网卡参数
ethtool eth0
# 优化网卡参数
sudo ethtool -G eth0 rx 4096 tx 4096 # 调整环形缓冲区大小
sudo ethtool -K eth0 gro on gso on tso on # 启用硬件加速
sudo ethtool -C eth0 rx-usecs 0 tx-usecs 0 # 调整中断合并
# 设置MTU(Jumbo Frames)
sudo ip link set eth0 mtu 9000
# 多队列RSS(接收端缩放)
sudo ethtool -L eth0 combined 8 # 设置8个队列
6.3 网络中断绑定
bash
# 查看中断分布
cat /proc/interrupts | grep eth
# 安装irqbalance
sudo apt install irqbalance
# 配置irqbalance
sudo tee /etc/default/irqbalance << 'EOF'
ENABLED="1"
ONESHOT="0"
IRQBALANCE_ARGS="--deep --hintpolicy=exact"
EOF
sudo systemctl restart irqbalance
# 手动绑定中断到特定CPU
IRQS=$(cat /proc/interrupts | grep eth0 | awk '{print $1}' | cut -d: -f1)
CPU=0
for IRQ in $IRQS; do
echo $(printf "%x" $((1 << $CPU))) | sudo tee /proc/irq/$IRQ/smp_affinity
CPU=$((CPU + 1))
done
第七部分:应用级性能调优
7.1 Web服务器优化(Nginx)
bash
# Nginx配置文件优化
sudo tee /etc/nginx/nginx.conf << 'EOF'
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# 缓冲区优化
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 压缩设置
gzip on;
gzip_min_length 1024;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 文件缓存
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
EOF
7.2 数据库优化(MySQL/MariaDB)
bash
# MySQL配置文件优化
sudo tee /etc/mysql/mariadb.conf.d/99-optimization.cnf << 'EOF'
[mysqld]
# 连接设置
max_connections = 500
thread_cache_size = 50
back_log = 100
# InnoDB设置
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_thread_concurrency = 0
# 查询缓存
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# 临时表
tmp_table_size = 256M
max_heap_table_size = 256M
# 其他优化
table_open_cache = 2000
table_definition_cache = 1400
EOF
# 重启MySQL
sudo systemctl restart mysql
7.3 Java应用优化
bash
# JVM参数优化
export JAVA_OPTS="-server \
-Xms4g -Xmx4g \
-XX:NewSize=1g -XX:MaxNewSize=1g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:+UseStringDeduplication \
-XX:+OptimizeStringConcat \
-XX:+UseCompressedOops \
-XX:+UseCompressedClassPointers \
-XX:+DisableExplicitGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/java_heapdump.hprof \
-XX:ErrorFile=/var/log/java_error.log \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/var/log/java_gc.log"
第八部分:容量规划
8.1 容量规划步骤
bash
# 1. 需求分析
# 2. 现状评估
# 3. 趋势分析
# 4. 容量预测
# 5. 方案设计
# 6. 实施和验证
8.2 资源需求评估
bash
#!/bin/bash
# capacity_assessment.sh
# 容量评估脚本
echo "=== 系统容量评估 ==="
echo "评估时间: $(date)"
echo
# CPU容量
CPU_CORES=$(nproc)
CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs)
CPU_LOAD_PER_CORE=$(echo "scale=2; $CPU_LOAD / $CPU_CORES" | bc)
echo "CPU信息:"
echo " 核心数: $CPU_CORES"
echo " 系统负载: $CPU_LOAD"
echo " 每核心负载: $CPU_LOAD_PER_CORE"
if (( $(echo "$CPU_LOAD_PER_CORE > 0.7" | bc -l) )); then
echo " 状态: 需要扩容"
elif (( $(echo "$CPU_LOAD_PER_CORE > 0.5" | bc -l) )); then
echo " 状态: 监控观察"
else
echo " 状态: 充足"
fi
echo
# 内存容量
MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')
MEM_USED=$(free -m | awk '/^Mem:/{print $3}')
MEM_USAGE_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))
SWAP_TOTAL=$(free -m | awk '/^Swap:/{print $2}')
SWAP_USED=$(free -m | awk '/^Swap:/{print $3}')
echo "内存信息:"
echo " 总内存: ${MEM_TOTAL}MB"
echo " 已使用: ${MEM_USED}MB (${MEM_USAGE_PERCENT}%)"
echo " 交换空间: ${SWAP_USED}/${SWAP_TOTAL}MB"
if [ $MEM_USAGE_PERCENT -gt 80 ]; then
echo " 状态: 需要扩容"
elif [ $MEM_USAGE_PERCENT -gt 60 ]; then
echo " 状态: 监控观察"
else
echo " 状态: 充足"
fi
echo
# 磁盘容量
DISK_INFO=$(df -h / | awk 'NR==2')
DISK_TOTAL=$(echo $DISK_INFO | awk '{print $2}')
DISK_USED=$(echo $DISK_INFO | awk '{print $3}')
DISK_AVAIL=$(echo $DISK_INFO | awk '{print $4}')
DISK_USAGE=$(echo $DISK_INFO | awk '{print $5}' | sed 's/%//')
echo "磁盘信息:"
echo " 磁盘使用: ${DISK_USED}/${DISK_TOTAL} (${DISK_USAGE}%)"
echo " 可用空间: ${DISK_AVAIL}"
if [ $DISK_USAGE -gt 85 ]; then
echo " 状态: 需要扩容"
elif [ $DISK_USAGE -gt 70 ]; then
echo " 状态: 监控观察"
else
echo " 状态: 充足"
fi
echo
# 网络容量
NET_INTERFACE=$(ip route | grep default | awk '{print $5}')
NET_SPEED=$(ethtool $NET_INTERFACE 2>/dev/null | grep Speed | awk '{print $2}' || echo "未知")
echo "网络信息:"
echo " 网络接口: $NET_INTERFACE"
echo " 连接速度: $NET_SPEED"
echo
8.3 容量预测模型
bash
#!/bin/bash
# capacity_predictor.sh
# 容量预测脚本
# 收集历史数据(这里使用模拟数据)
CPU_HISTORY=(45 48 52 55 58 62 65 68 72 75)
MEM_HISTORY=(55 58 60 63 65 68 70 73 75 78)
DISK_HISTORY=(50 52 54 56 59 62 65 68 71 74)
# 线性回归预测函数
predict_growth() {
local data=("${!1}")
local days=${2:-30}
local n=${#data[@]}
local sum_x=0
local sum_y=0
local sum_xy=0
local sum_xx=0
for ((i=0; i<n; i++)); do
sum_x=$((sum_x + i))
sum_y=$((sum_y + data[i]))
sum_xy=$((sum_xy + i * data[i]))
sum_xx=$((sum_xx + i * i))
done
local slope=$(echo "scale=2; ($n * $sum_xy - $sum_x * $sum_y) / ($n * $sum_xx - $sum_x * $sum_x)" | bc)
local intercept=$(echo "scale=2; ($sum_y - $slope * $sum_x) / $n" | bc)
echo "scale=2; $intercept + $slope * ($n + $days - 1)" | bc
}
# 预测30天后
echo "=== 容量预测报告 ==="
echo "预测周期: 30天"
echo
CPU_PREDICT=$(predict_growth CPU_HISTORY[@] 30)
echo "CPU使用率预测:"
echo " 当前: ${CPU_HISTORY[-1]}%"
echo " 30天后: ${CPU_PREDICT}%"
if (( $(echo "$CPU_PREDICT > 80" | bc -l) )); then
echo " 建议: 需要扩容"
elif (( $(echo "$CPU_PREDICT > 70" | bc -l) )); then
echo " 建议: 计划扩容"
else
echo " 建议: 容量充足"
fi
echo
MEM_PREDICT=$(predict_growth MEM_HISTORY[@] 30)
echo "内存使用率预测:"
echo " 当前: ${MEM_HISTORY[-1]}%"
echo " 30天后: ${MEM_PREDICT}%"
if (( $(echo "$MEM_PREDICT > 85" | bc -l) )); then
echo " 建议: 需要扩容"
elif (( $(echo "$MEM_PREDICT > 75" | bc -l) )); then
echo " 建议: 计划扩容"
else
echo " 建议: 容量充足"
fi
echo
DISK_PREDICT=$(predict_growth DISK_HISTORY[@] 30)
echo "磁盘使用率预测:"
echo " 当前: ${DISK_HISTORY[-1]}%"
echo " 30天后: ${DISK_PREDICT}%"
if (( $(echo "$DISK_PREDICT > 90" | bc -l) )); then
echo " 建议: 需要扩容"
elif (( $(echo "$DISK_PREDICT > 80" | bc -l) )); then
echo " 建议: 计划扩容"
else
echo " 建议: 容量充足"
fi
echo
# 生成扩容建议
echo "=== 扩容建议 ==="
if (( $(echo "$CPU_PREDICT > 80 || $MEM_PREDICT > 85 || $DISK_PREDICT > 90" | bc -l) )); then
echo "1. 立即扩容建议:"
[ $(echo "$CPU_PREDICT > 80" | bc -l) -eq 1 ] && echo " - 增加CPU核心数或升级CPU"
[ $(echo "$MEM_PREDICT > 85" | bc -l) -eq 1 ] && echo " - 增加内存容量"
[ $(echo "$DISK_PREDICT > 90" | bc -l) -eq 1 ] && echo " - 增加磁盘空间"
fi
第九部分:性能测试和基准
9.1 压力测试工具
bash
# 安装压力测试工具
sudo apt install -y stress stress-ng apache2-utils siege
# CPU压力测试
stress --cpu 8 --timeout 60s
stress-ng --cpu 8 --cpu-method matrixprod --timeout 60s
# 内存压力测试
stress --vm 4 --vm-bytes 1G --timeout 60s
# 磁盘IO压力测试
stress --io 4 --timeout 60s
# Web压力测试
ab -n 10000 -c 100 http://localhost/
siege -c 100 -t 60S http://localhost/
9.2 性能基准测试套件
bash
#!/bin/bash
# benchmark_suite.sh
# 综合性能基准测试
echo "开始性能基准测试..."
echo "======================"
# 1. CPU性能测试
echo "1. CPU性能测试 (sysbench)"
sysbench cpu --threads=4 run | grep -E "(total time|events per second)"
# 2. 内存性能测试
echo "2. 内存性能测试 (sysbench)"
sysbench memory --threads=4 --memory-block-size=1K --memory-total-size=10G run | grep -E "(total time|transferred)"
# 3. 磁盘顺序读写测试
echo "3. 磁盘顺序读写测试 (dd)"
echo " 写入测试:"
dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=dsync 2>&1 | tail -1
echo " 读取测试:"
dd if=/tmp/testfile of=/dev/null bs=1G count=1 2>&1 | tail -1
rm -f /tmp/testfile
# 4. 磁盘随机IO测试
echo "4. 磁盘随机IO测试 (fio)"
if command -v fio >/dev/null; then
fio --name=randrw --ioengine=libaio --iodepth=16 \
--rw=randrw --bs=4k --direct=1 --size=1G \
--numjobs=4 --runtime=60 --group_reporting \
| grep -E "READ:|WRITE:" | grep iops
else
echo " fio未安装,跳过测试"
fi
# 5. 网络性能测试
echo "5. 网络性能测试"
echo " (需要另一个节点运行 iperf3 -s)"
echo " 本地回环测试:"
iperf3 -c localhost -t 10 2>/dev/null | grep -E "sender|receiver" | tail -2
echo "测试完成"
第十部分:性能优化案例
10.1 案例一:高并发Web服务器优化
bash
# 问题:Nginx在1000并发下响应时间过长
# 解决方案:
# 1. 调整系统参数
sudo tee /etc/sysctl.d/99-web-optimize.conf << 'EOF'
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 0
EOF
# 2. 调整Nginx配置
sudo tee /etc/nginx/nginx.conf << 'EOF'
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4000;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
keepalive_requests 10000;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
reset_timedout_connection on;
}
EOF
# 3. 应用配置
sudo sysctl -p /etc/sysctl.d/99-web-optimize.conf
sudo systemctl restart nginx
10.2 案例二:数据库服务器优化
bash
# 问题:MySQL查询响应慢,IO等待高
# 解决方案:
# 1. 调整MySQL配置
sudo tee /etc/mysql/mariadb.conf.d/99-optimize.cnf << 'EOF'
[mysqld]
innodb_buffer_pool_size = 8G
innodb_log_file_size = 2G
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = ON
innodb_thread_concurrency = 0
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 4M
tmp_table_size = 512M
max_heap_table_size = 512M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
sort_buffer_size = 4M
join_buffer_size = 4M
EOF
# 2. 调整系统参数
sudo tee /etc/sysctl.d/99-db-optimize.conf << 'EOF'
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 6000
EOF
# 3. 调整IO调度器
echo deadline > /sys/block/sda/queue/scheduler
echo 256 > /sys/block/sda/queue/nr_requests
echo 1024 > /sys/block/sda/queue/read_ahead_kb
# 4. 应用配置
sudo sysctl -p /etc/sysctl.d/99-db-optimize.conf
sudo systemctl restart mysql
10.3 案例三:Java应用服务器优化
bash
# 问题:Java应用内存占用高,GC频繁
# 解决方案:
# 1. JVM参数优化
export JAVA_OPTS="-server \
-Xms8g -Xmx8g \
-XX:NewSize=3g -XX:MaxNewSize=3g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:G1ReservePercent=15 \
-XX:G1HeapRegionSize=32m \
-XX:+UseStringDeduplication \
-XX:+OptimizeStringConcat \
-XX:+UseCompressedOops \
-XX:+UseCompressedClassPointers \
-XX:+AlwaysPreTouch \
-XX:+ParallelRefProcEnabled \
-XX:+ExplicitGCInvokesConcurrent"
# 2. 系统参数优化
sudo tee /etc/sysctl.d/99-java-optimize.conf << 'EOF'
vm.overcommit_memory = 1
vm.swappiness = 10
vm.max_map_count = 262144
EOF
# 3. 应用配置
sudo sysctl -p /etc/sysctl.d/99-java-optimize.conf
练习项目
项目1:性能监控和报警系统
部署Prometheus + Grafana
配置系统性能指标收集
设置性能阈值告警
创建性能仪表板
项目2:容量规划实施
为实际应用制定容量规划
实施监控和数据收集
分析趋势和预测需求
制定扩容方案
项目3:性能优化实战
选择一个实际应用
识别性能瓶颈
实施优化措施
验证优化效果
项目4:自动化性能测试
开发自动化性能测试脚本
集成到CI/CD流程
设置性能基准
自动生成性能报告
今日总结
今天我们学习了Linux性能调优和容量规划:
性能调优基础:概念、原则、方法论
系统监控:工具、数据收集、分析
CPU调优:调度器、亲和性、中断平衡
内存调优:参数优化、大页内存、OOM Killer
磁盘IO调优:文件系统、I/O调度器、RAID优化
网络调优:TCP/IP协议栈、网卡调优
应用调优:Web服务器、数据库、Java应用
容量规划:评估、预测、扩容建议
性能测试:压力测试、基准测试
优化案例:实战经验分享
关键原则:
测量优先:没有测量就没有优化
系统思考:考虑整个系统而不仅仅是组件
逐步进行:一次只改变一个变量
文档记录:记录所有优化步骤和结果
持续监控:优化后持续监控效果
性能调优是一个持续的过程,需要结合监控、分析和实践。容量规划需要基于数据和趋势做出决策。
有问题吗?完成练习项目后,我们可以继续第二十课:Linux安全攻防和渗透测试基础
将本文的Word文档下载到电脑
推荐度: