Apache 性能调优
Apache Performance Tuning
概述 (Overview)
Apache性能调优是确保Web服务器在高负载下稳定运行的关键。本文将详细介绍Apache性能调优的各种技术,包括MPM配置、内存优化、连接管理、缓存策略和系统级优化等核心技术。
Apache performance tuning is key to ensuring web servers run stably under high load. This article will detail various Apache performance tuning techniques, including MPM configuration, memory optimization, connection management, caching strategies, and system-level optimization core technologies.
1. 多处理模块(MPM)优化 (Multi-Processing Module Optimization)
1.1 Prefork MPM优化 (Prefork MPM Optimization)
# Prefork MPM配置优化
<IfModule mpm_prefork_module>
# 初始启动的子进程数
StartServers 8
# 空闲时保持的最小子进程数
MinSpareServers 5
# 空闲时保持的最大子进程数
MaxSpareServers 20
# 最大并发请求数
MaxRequestWorkers 150
# 子进程处理的最大请求数(0表示无限制)
MaxConnectionsPerChild 1000
</IfModule>
1.2 Worker MPM优化 (Worker MPM Optimization)
# Worker MPM配置优化
<IfModule mpm_worker_module>
# 初始启动的子进程数
StartServers 3
# 空闲时保持的最小线程数
MinSpareThreads 75
# 空闲时保持的最大线程数
MaxSpareThreads 250
# 每个子进程创建的线程数
ThreadsPerChild 25
# 最大并发线程数
MaxRequestWorkers 400
# 子进程处理的最大请求数
MaxConnectionsPerChild 0
</IfModule>
1.3 Event MPM优化 (Event MPM Optimization)
# Event MPM配置优化
<IfModule mpm_event_module>
# 初始启动的子进程数
StartServers 3
# 空闲时保持的最小线程数
MinSpareThreads 75
# 空闲时保持的最大线程数
MaxSpareThreads 250
# 每个子进程创建的线程数
ThreadsPerChild 25
# 最大并发线程数
MaxRequestWorkers 400
# 子进程处理的最大请求数
MaxConnectionsPerChild 0
# 异步连接处理因子
AsyncRequestWorkerFactor 2
# 监听队列长度
ListenBacklog 511
</IfModule>
2. 内存优化 (Memory Optimization)
2.1 内存使用监控 (Memory Usage Monitoring)
# 启用服务器状态模块
LoadModule status_module modules/mod_status.so
# 内存监控配置
<Location "/server-status">
SetHandler server-status
# 访问控制
<RequireAll>
Require ip 192.168.1.0/24
Require ip 127.0.0.1
</RequireAll>
</Location>
2.2 内存限制配置 (Memory Limit Configuration)
# 内存相关配置
# 限制请求行长度
LimitRequestLine 8190
# 限制请求头字段数
LimitRequestFields 100
# 限制请求头字段大小
LimitRequestFieldSize 8190
# 限制请求体大小
LimitRequestBody 52428800 # 50MB
# 启用内存映射
EnableMMAP On
# 启用Sendfile
EnableSendfile On
3. 连接管理优化 (Connection Management Optimization)
3.1 Keep-Alive优化 (Keep-Alive Optimization)
# Keep-Alive配置
# 启用Keep-Alive
KeepAlive On
# 每个连接的最大请求数
MaxKeepAliveRequests 100
# Keep-Alive超时时间(秒)
KeepAliveTimeout 5
# 在Keep-Alive超时后发送关闭信号
KeepAliveTimeoutStrategy grace
3.2 连接超时优化 (Connection Timeout Optimization)
# 连接超时配置
# 请求超时时间
Timeout 60
# 接收请求头超时
RequestReadTimeout header=20-40,minrate=500
# 接收请求体超时
RequestReadTimeout body=20,minrate=500
# 异步连接超时
AsyncRequestTimeout 30
4. 缓存性能优化 (Cache Performance Optimization)
4.1 文件缓存优化 (File Cache Optimization)
# 文件缓存配置
# 启用文件缓存模块
LoadModule file_cache_module modules/mod_file_cache.so
# 预加载常用文件到缓存
CacheFile /var/www/html/index.html
CacheFile /var/www/html/style.css
CacheFile /var/www/html/script.js
# 启用内存映射缓存
MMapFile /var/www/html/images/logo.png
MMapFile /var/www/html/fonts/
4.2 模块缓存优化 (Module Cache Optimization)
# 模块缓存配置
# 启用模块缓存
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache.c>
# 启用磁盘缓存
CacheEnable disk /
# 设置缓存根目录
CacheRoot /var/cache/apache2/mod_cache_disk
# 设置缓存目录结构
CacheDirLevels 2
CacheDirLength 1
# 设置缓存过期时间
CacheDefaultExpire 3600
CacheMaxExpire 86400
</IfModule>
5. 系统级优化 (System Level Optimization)
5.1 文件描述符优化 (File Descriptor Optimization)
# 系统级文件描述符优化
# 编辑 /etc/security/limits.conf
apache soft nofile 65536
apache hard nofile 65536
# 编辑 /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 应用系统配置
sudo sysctl -p
5.2 内核参数优化 (Kernel Parameter Optimization)
# 内核参数优化脚本
# /usr/local/bin/kernel-optimize.sh
#!/bin/bash
# 网络参数优化
echo "Optimizing kernel parameters..."
# 增加TCP缓冲区
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 65536 16777216' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 16777216' >> /etc/sysctl.conf
# 启用TCP窗口缩放
echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
# 减少TCP连接超时
echo 'net.ipv4.tcp_fin_timeout = 15' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_keepalive_time = 300' >> /etc/sysctl.conf
# 启用TCP时间等待重用
echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
# 增加连接队列
echo 'net.core.somaxconn = 32768' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_max_syn_backlog = 32768' >> /etc/sysctl.conf
# 应用配置
sysctl -p
echo "Kernel optimization completed!"
6. 负载测试和性能分析 (Load Testing and Performance Analysis)
6.1 Apache Bench测试 (Apache Bench Testing)
# Apache Bench性能测试
# 基本测试
ab -n 1000 -c 10 http://localhost/
# 高并发测试
ab -n 10000 -c 100 http://localhost/
# 带Cookie的测试
ab -n 1000 -c 10 -C "sessionid=abc123" http://localhost/
# POST请求测试
ab -n 1000 -c 10 -p data.txt -T "application/x-www-form-urlencoded" http://localhost/api/
6.2 性能监控脚本 (Performance Monitoring Script)
#!/bin/bash
# performance-monitor.sh
monitor_performance() {
echo "=== Apache Performance Monitor ==="
# 检查Apache进程
echo "1. Apache Processes:"
ps aux | grep apache2 | grep -v grep | wc -l
echo " Memory usage:"
ps -o pid,vsz,rss,comm -C apache2 | tail -n +2 | awk '{total+=$3} END {print " Total: " total/1024 " MB"}'
# 检查连接状态
echo
echo "2. Connection Status:"
netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c
# 检查服务器状态
echo
echo "3. Server Status:"
curl -s http://localhost/server-status?auto | head -10
# 检查系统负载
echo
echo "4. System Load:"
uptime
# 检查内存使用
echo
echo "5. Memory Usage:"
free -h
# 检查磁盘I/O
echo
echo "6. Disk I/O:"
iostat -x 1 1 | grep -A 1 "Device"
echo
echo "Performance monitoring completed!"
}
monitor_performance
7. 性能调优工具 (Performance Tuning Tools)
7.1 mod_status配置 (mod_status Configuration)
# 详细的服务器状态配置
<Location "/server-status">
SetHandler server-status
# 启用扩展状态信息
ExtendedStatus On
# 访问控制
<RequireAll>
Require ip 192.168.1.0/24
Require ip 127.0.0.1
</RequireAll>
</Location>
# 机器可读的状态信息
<Location "/server-info">
SetHandler server-info
# 访问控制
<RequireAll>
Require ip 192.168.1.0/24
Require ip 127.0.0.1
</RequireAll>
</Location>
7.2 日志分析工具 (Log Analysis Tools)
# 日志分析脚本示例
# /usr/local/bin/log-analyze.sh
#!/bin/bash
analyze_logs() {
local log_file=${1:-"/var/log/apache2/access.log"}
echo "=== Log Analysis ==="
# 最常见的请求
echo "1. Top 10 Most Requested URLs:"
awk '{print $7}' $log_file | sort | uniq -c | sort -nr | head -10
# 最常见的用户代理
echo
echo "2. Top 10 User Agents:"
awk -F'"' '{print $6}' $log_file | sort | uniq -c | sort -nr | head -10
# HTTP状态码统计
echo
echo "3. HTTP Status Code Distribution:"
awk '{print $9}' $log_file | sort | uniq -c | sort -nr
# 响应时间分析
echo
echo "4. Response Time Analysis (if available):"
awk '{print $NF}' $log_file | grep -E "^[0-9]+$" | sort -n | tail -20
echo
echo "Log analysis completed!"
}
analyze_logs $1
8. 性能基准测试 (Performance Benchmarking)
8.1 基准测试脚本 (Benchmark Test Script)
#!/bin/bash
# benchmark.sh
run_benchmark() {
local url=${1:-"http://localhost/"}
local requests=${2:-1000}
local concurrency=${3:-10}
echo "=== Apache Performance Benchmark ==="
echo "URL: $url"
echo "Requests: $requests"
echo "Concurrency: $concurrency"
echo
# 运行基准测试
echo "Running benchmark test..."
ab -n $requests -c $concurrency "$url" > /tmp/benchmark_result.txt 2>&1
# 分析结果
echo "Benchmark Results:"
grep -E "(Requests per second|Time per request|Transfer rate|Failed requests)" /tmp/benchmark_result.txt
# 清理临时文件
rm -f /tmp/benchmark_result.txt
echo
echo "Benchmark completed!"
}
run_benchmark $1 $2 $3
8.2 性能对比测试 (Performance Comparison Test)
#!/bin/bash
# performance-compare.sh
compare_performance() {
local urls=("$@")
echo "=== Performance Comparison ==="
for url in "${urls[@]}"; do
echo "Testing: $url"
# 简单响应时间测试
start_time=$(date +%s%3N)
curl -s -o /dev/null "$url"
end_time=$(date +%s%3N)
duration=$((end_time - start_time))
echo " Response time: ${duration}ms"
# 并发测试
ab -n 100 -c 10 -q "$url" 2>/dev/null | grep "Requests per second" | awk '{print " Throughput: " $4 " req/sec"}'
echo
done
echo "Performance comparison completed!"
}
# 使用示例
# compare_performance "http://localhost/page1" "http://localhost/page2"
小结 (Summary)
通过本文学习,你应该掌握:
- Apache MPM配置优化技术
- 内存使用优化和监控方法
- 连接管理和Keep-Alive优化
- 缓存性能优化策略
- 系统级内核参数调优
- 负载测试和性能分析工具
- 服务器状态监控配置
- 性能基准测试和对比方法
性能调优是一个持续的过程,需要根据实际负载情况不断调整配置参数。在下一篇文章中,我们将详细介绍Apache监控与诊断技术。