Linux基础教程 第19课:性能调优和容量规划

浏览量:22 次 发布时间:2026-01-23 19:55 作者:明扬工控商城 下载docx

最近更新:Linux基础教程 第15课:Linux内核和驱动管理

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安全攻防和渗透测试基础


明扬工控商城

推荐阅读:

Linux基础教程 第20课:Linux安全攻防和渗透测试基础

Linux基础教程 第19课:性能调优和容量规划

Linux基础教程 第18课:Linux云计算基础

Linux基础教程 第17课:自动化运维工具

Linux基础教程 第16课:集群和高可用性

Linux基础教程 第15课:Linux内核和驱动管理

热门标签:
Linux基础教程 第19课:性能调优和容量规划.docx

将本文的Word文档下载到电脑

推荐度:

下载

全部评论

请登录
产业新闻-明扬资讯网
科技资讯-明扬资讯网