
IT系统运维工程师应聘指南:性能优化专项
2024/6/21大约 17 分钟
IT系统运维工程师应聘指南05 - 性能优化
岗位职责概述
负责IT系统性能的监控、评估、分析和优化,提高系统运行效率,降低资源消耗,确保系统在高负载情况下稳定运行,为用户提供良好的体验。
核心技能要求
1. 性能监控与分析
- 系统性能指标监控
- 资源使用率分析
- 性能瓶颈诊断
- 性能基准测试
2. 服务器性能优化
- CPU/内存优化
- 磁盘I/O优化
- 网络性能优化
- 操作系统内核调优
3. 数据库性能优化
- SQL查询优化
- 索引设计与优化
- 数据库参数调优
- 数据库架构设计
4. 应用系统性能优化
- 代码层面优化
- 应用架构优化
- 缓存策略实施
- 负载均衡配置
实操技能详解
一、系统性能监控与分析
1.1 Linux系统性能监控脚本
#!/bin/bash
# 系统性能监控脚本
LOGDIR="/var/log/perf_monitor"
mkdir -p $LOGDIR
DATE=$(date +"%Y%m%d-%H%M%S")
LOGFILE="$LOGDIR/system_perf_$DATE.log"
echo "===== 系统性能监控报告 - $(date) =====" > $LOGFILE
# CPU使用率
echo -e "\n>> CPU使用情况:" >> $LOGFILE
mpstat -P ALL 1 5 >> $LOGFILE
# 内存使用率
echo -e "\n>> 内存使用情况:" >> $LOGFILE
free -m >> $LOGFILE
# 磁盘I/O
echo -e "\n>> 磁盘I/O情况:" >> $LOGFILE
iostat -xz 1 5 >> $LOGFILE
# 网络I/O
echo -e "\n>> 网络I/O情况:" >> $LOGFILE
sar -n DEV 1 5 >> $LOGFILE
# 负载情况
echo -e "\n>> 系统负载情况:" >> $LOGFILE
uptime >> $LOGFILE
# 进程资源使用TOP 10
echo -e "\n>> CPU占用TOP 10进程:" >> $LOGFILE
ps aux --sort=-%cpu | head -11 >> $LOGFILE
echo -e "\n>> 内存占用TOP 10进程:" >> $LOGFILE
ps aux --sort=-%mem | head -11 >> $LOGFILE
# 网络连接状态
echo -e "\n>> 网络连接状态:" >> $LOGFILE
netstat -ant | awk '{print $6}' | sort | uniq -c >> $LOGFILE
echo "性能监控报告已生成: $LOGFILE"1.2 Windows性能监控PowerShell脚本
# Windows性能监控脚本
$logDir = "C:\PerfLogs\$(Get-Date -Format 'yyyyMMdd')"
if (-not (Test-Path $logDir)) {
New-Item -ItemType Directory -Path $logDir -Force
}
$logFile = "$logDir\perfmon_$(Get-Date -Format 'HHmmss').csv"
$duration = 60 # 采集60秒
# 创建性能计数器集合
$counters = @(
"\Processor(_Total)\% Processor Time",
"\Memory\Available MBytes",
"\Memory\Pages/sec",
"\PhysicalDisk(_Total)\Disk Reads/sec",
"\PhysicalDisk(_Total)\Disk Writes/sec",
"\Network Interface(*)\Bytes Total/sec",
"\System\Processor Queue Length"
)
Write-Host "开始收集性能数据,持续$duration秒..."
Get-Counter -Counter $counters -SampleInterval 1 -MaxSamples $duration |
Export-Counter -Path $logFile -FileFormat CSV -Force
# 分析CPU使用情况
Write-Host "`n== CPU使用情况分析 =="
$cpuData = Import-Csv $logFile |
Where-Object { $_."Path" -like "*Processor(_Total)*" } |
Select-Object -ExpandProperty "Processor(_Total)\% Processor Time"
$cpuAvg = ($cpuData | Measure-Object -Average).Average
$cpuMax = ($cpuData | Measure-Object -Maximum).Maximum
Write-Host "CPU平均使用率: $([math]::Round($cpuAvg, 2))%"
Write-Host "CPU最大使用率: $([math]::Round($cpuMax, 2))%"
# 分析内存使用情况
Write-Host "`n== 内存使用情况分析 =="
$memData = Import-Csv $logFile |
Where-Object { $_."Path" -like "*Memory\Available MBytes*" } |
Select-Object -ExpandProperty "Memory\Available MBytes"
$memAvg = ($memData | Measure-Object -Average).Average
$memMin = ($memData | Measure-Object -Minimum).Minimum
Write-Host "平均可用内存: $([math]::Round($memAvg, 2))MB"
Write-Host "最小可用内存: $([math]::Round($memMin, 2))MB"
# 获取当前系统TOP 5进程(CPU)
Write-Host "`n== CPU占用TOP 5进程 =="
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5 |
Format-Table -Property ProcessName, CPU, WorkingSet, ID
Write-Host "性能数据已保存至: $logFile"1.3 性能基准测试脚本
#!/bin/bash
# 系统性能基准测试
LOGDIR="/var/log/benchmark"
mkdir -p $LOGDIR
DATE=$(date +"%Y%m%d-%H%M%S")
LOGFILE="$LOGDIR/benchmark_$DATE.log"
echo "===== 系统性能基准测试 - $(date) =====" > $LOGFILE
# 检查必要工具
for tool in sysbench dd hdparm iperf; do
which $tool >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "缺少必要工具: $tool, 请先安装" | tee -a $LOGFILE
apt-get update && apt-get install -y $tool
fi
done
# 系统信息
echo -e "\n>> 系统信息:" >> $LOGFILE
uname -a >> $LOGFILE
cat /proc/cpuinfo | grep "model name" | head -1 >> $LOGFILE
cat /proc/meminfo | grep MemTotal >> $LOGFILE
# CPU基准测试
echo -e "\n>> CPU性能测试:" >> $LOGFILE
echo "1. 单线程CPU性能:" >> $LOGFILE
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=1 run >> $LOGFILE
echo "2. 多线程CPU性能:" >> $LOGFILE
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=$(nproc) run >> $LOGFILE
# 内存基准测试
echo -e "\n>> 内存性能测试:" >> $LOGFILE
sysbench --test=memory --memory-block-size=1K --memory-total-size=10G run >> $LOGFILE
# 磁盘基准测试
echo -e "\n>> 磁盘性能测试:" >> $LOGFILE
echo "1. 读取速度:" >> $LOGFILE
hdparm -t /dev/sda >> $LOGFILE
echo "2. 写入速度(顺序):" >> $LOGFILE
dd if=/dev/zero of=/tmp/test_file bs=1G count=1 oflag=direct 2>> $LOGFILE
rm -f /tmp/test_file
echo "3. 磁盘I/O性能:" >> $LOGFILE
sysbench --test=fileio --file-total-size=2G prepare >> /dev/null
sysbench --test=fileio --file-total-size=2G --file-test-mode=rndrw --max-time=30 --max-requests=0 run >> $LOGFILE
sysbench --test=fileio --file-total-size=2G cleanup >> /dev/null
# 网络基准测试 (需要另一台服务器运行iperf -s)
echo -e "\n>> 网络性能测试:" >> $LOGFILE
echo "请确保另一台服务器已运行'iperf -s'命令" >> $LOGFILE
echo "请输入iperf服务器IP:"
read SERVER_IP
if [ ! -z "$SERVER_IP" ]; then
echo "测试到 $SERVER_IP 的带宽:" >> $LOGFILE
iperf -c $SERVER_IP -t 10 >> $LOGFILE
fi
echo "性能基准测试完成,结果已保存到: $LOGFILE"二、服务器性能优化
2.1 Linux系统性能优化脚本
#!/bin/bash
# Linux系统性能优化脚本
echo "===== 开始系统性能优化 ====="
# 备份原始配置
BACKUP_DIR="/root/config_backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
cp /etc/sysctl.conf $BACKUP_DIR/
cp /etc/security/limits.conf $BACKUP_DIR/
# 1. 内核参数优化
echo ">> 优化内核参数..."
cat >> /etc/sysctl.conf << EOF
# 性能优化参数
# 文件系统和I/O优化
fs.file-max = 2097152
fs.nr_open = 2097152
fs.aio-max-nr = 1048576
# 网络性能优化
net.core.netdev_max_backlog = 50000
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 8096
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65000
# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.max_map_count = 262144
EOF
# 应用内核参数
sysctl -p
# 2. 文件描述符限制
echo ">> 优化文件描述符限制..."
cat >> /etc/security/limits.conf << EOF
# 性能优化 - 文件描述符限制
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
EOF
# 3. I/O调度器优化
echo ">> 优化I/O调度器..."
for disk in $(lsblk -d -o name | grep -v NAME); do
if [ -f "/sys/block/$disk/queue/scheduler" ]; then
echo "deadline" > /sys/block/$disk/queue/scheduler
echo "设置磁盘 $disk 的I/O调度器为deadline"
fi
done
# 4. 网络调优
echo ">> 优化网络参数..."
for nic in $(ls /sys/class/net/ | grep -v lo); do
if [ -f "/sys/class/net/$nic/mtu" ]; then
echo "9000" > /sys/class/net/$nic/mtu
echo "设置网卡 $nic 的MTU为9000"
fi
# 禁用网卡的TSO和GSO功能以减少CPU使用率
ethtool -K $nic tso off gso off 2>/dev/null
ethtool -K $nic lro off 2>/dev/null
echo "网卡 $nic 优化完成"
done
# 5. NUMA平衡优化
echo ">> 优化NUMA平衡..."
if [ -f /proc/sys/kernel/numa_balancing ]; then
echo 0 > /proc/sys/kernel/numa_balancing
echo "已禁用NUMA自动平衡"
fi
# 6. 透明大页优化
echo ">> 优化透明大页..."
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo "已禁用透明大页"
fi
# 7. 系统服务优化
echo ">> 优化系统服务..."
for svc in avahi-daemon cups nfs-server rpcbind bluetooth; do
systemctl stop $svc 2>/dev/null
systemctl disable $svc 2>/dev/null
echo "已禁用服务: $svc"
done
echo "===== 系统性能优化完成 ====="
echo "请重启系统以使所有更改生效"2.2 Windows服务器性能优化脚本
# Windows服务器性能优化脚本
Write-Host "===== 开始Windows服务器性能优化 =====" -ForegroundColor Green
# 1. 优化视觉效果
Write-Host ">> 优化视觉效果设置..." -ForegroundColor Yellow
$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects"
if (-not (Test-Path $path)) {
New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name VisualFXSetting -Value 2
# 2. 禁用不必要的服务
Write-Host ">> 禁用不必要的服务..." -ForegroundColor Yellow
$servicesToDisable = @(
"DiagTrack", # Connected User Experiences and Telemetry
"dmwappushservice", # WAP Push Message Routing Service
"lfsvc", # Geolocation Service
"MapsBroker", # Downloaded Maps Manager
"SharedAccess", # Internet Connection Sharing
"wisvc", # Windows Insider Service
"WSearch" # Windows Search (仅当不需要搜索功能时)
)
foreach ($service in $servicesToDisable) {
$svc = Get-Service -Name $service -ErrorAction SilentlyContinue
if ($svc -ne $null) {
Stop-Service -Name $service -Force -ErrorAction SilentlyContinue
Set-Service -Name $service -StartupType Disabled
Write-Host "已禁用服务: $service" -ForegroundColor Gray
}
}
# 3. 网络优化
Write-Host ">> 优化网络设置..." -ForegroundColor Yellow
# 禁用IPv6 (可选,如不需要IPv6)
$adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }
foreach ($adapter in $adapters) {
Disable-NetAdapterBinding -InterfaceAlias $adapter.Name -ComponentID ms_tcpip6
Write-Host "已禁用网卡 $($adapter.Name) 的IPv6" -ForegroundColor Gray
}
# 优化TCP参数
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "TcpTimedWaitDelay" -Value 30 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "MaxUserPort" -Value 65534 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "DefaultTTL" -Value 64 -PropertyType DWORD -Force
# 4. 磁盘优化
Write-Host ">> 优化磁盘设置..." -ForegroundColor Yellow
# 禁用磁盘碎片整理计划任务
Disable-ScheduledTask -TaskName "\Microsoft\Windows\Defrag\ScheduledDefrag"
# 禁用系统还原点
Disable-ComputerRestore -Drive "C:\"
# 关闭磁盘索引
$drives = Get-WmiObject -Class Win32_Volume -Filter "DriveType=3" | Select-Object -ExpandProperty DriveLetter
foreach ($drive in $drives) {
if ($drive) {
$folder = $drive + "\"
$drive = Get-WmiObject -Class Win32_Volume -Filter "DriveLetter='$drive'"
$indexing = $drive.IndexingEnabled
if ($indexing) {
$drive.IndexingEnabled = $false
$drive.Put()
Write-Host "已禁用 $folder 的索引服务" -ForegroundColor Gray
}
}
}
# 5. 内存优化
Write-Host ">> 优化内存设置..." -ForegroundColor Yellow
# 禁用SuperFetch服务
Stop-Service -Name "SysMain" -Force -ErrorAction SilentlyContinue
Set-Service -Name "SysMain" -StartupType Disabled
# 配置虚拟内存
$computersys = Get-WmiObject -Class Win32_ComputerSystem
$physicalMemory = [Math]::Round($computersys.TotalPhysicalMemory / 1GB)
$pagefileSize = $physicalMemory * 1.5
$pagefile = Get-WmiObject -Class Win32_PageFileSetting
$pagefile.InitialSize = $pagefileSize * 1024
$pagefile.MaximumSize = $pagefileSize * 1024
$pagefile.Put()
Write-Host "已将页面文件大小设为 $pagefileSize GB" -ForegroundColor Gray
# 6. CPU优化
Write-Host ">> 优化电源计划..." -ForegroundColor Yellow
powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c # 高性能电源计划
Write-Host "===== Windows服务器性能优化完成 =====" -ForegroundColor Green
Write-Host "请重启服务器以使所有更改生效" -ForegroundColor Cyan三、数据库性能优化
3.1 MySQL数据库优化
#!/bin/bash
# MySQL性能优化脚本
echo "===== MySQL性能优化 ====="
# 备份原始配置
BACKUP_DIR="/root/mysql_backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
cp /etc/mysql/my.cnf $BACKUP_DIR/ 2>/dev/null
cp /etc/mysql/mysql.conf.d/mysqld.cnf $BACKUP_DIR/ 2>/dev/null
# 获取系统内存大小
MEM_TOTAL=$(free -g | grep "Mem:" | awk '{print $2}')
echo "系统总内存: $MEM_TOTAL GB"
# 创建新的配置
CONFIG_FILE="/etc/mysql/mysql.conf.d/mysqld.cnf"
# 根据内存大小计算配置参数
if [ $MEM_TOTAL -le 2 ]; then
# 2GB及以下内存的配置
INNODB_BUFFER_POOL_SIZE="512M"
KEY_BUFFER_SIZE="128M"
QUERY_CACHE_SIZE="64M"
MAX_CONNECTIONS=200
elif [ $MEM_TOTAL -le 4 ]; then
# 4GB内存的配置
INNODB_BUFFER_POOL_SIZE="1G"
KEY_BUFFER_SIZE="256M"
QUERY_CACHE_SIZE="128M"
MAX_CONNECTIONS=300
elif [ $MEM_TOTAL -le 8 ]; then
# 8GB内存的配置
INNODB_BUFFER_POOL_SIZE="4G"
KEY_BUFFER_SIZE="512M"
QUERY_CACHE_SIZE="256M"
MAX_CONNECTIONS=500
elif [ $MEM_TOTAL -le 16 ]; then
# 16GB内存的配置
INNODB_BUFFER_POOL_SIZE="8G"
KEY_BUFFER_SIZE="1G"
QUERY_CACHE_SIZE="512M"
MAX_CONNECTIONS=800
else
# 16GB以上内存的配置
INNODB_BUFFER_POOL_SIZE="$(($MEM_TOTAL/2))G"
KEY_BUFFER_SIZE="2G"
QUERY_CACHE_SIZE="1G"
MAX_CONNECTIONS=1000
fi
# 写入配置文件
cat > $CONFIG_FILE << EOF
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log_error = /var/log/mysql/error.log
bind-address = 0.0.0.0
# 基本设置
max_connections = $MAX_CONNECTIONS
max_connect_errors = 10000
open_files_limit = 65535
table_open_cache = 2000
max_allowed_packet = 64M
binlog_cache_size = 1M
max_heap_table_size = 64M
tmp_table_size = 64M
read_rnd_buffer_size = 8M
join_buffer_size = 8M
sort_buffer_size = 8M
read_buffer_size = 4M
thread_cache_size = 64
# MyISAM设置
key_buffer_size = $KEY_BUFFER_SIZE
myisam_sort_buffer_size = 64M
concurrent_insert = 2
low_priority_updates = 1
# InnoDB设置
default_storage_engine = InnoDB
innodb_buffer_pool_size = $INNODB_BUFFER_POOL_SIZE
innodb_buffer_pool_instances = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_log_file_size = 256M
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
# 查询缓存
query_cache_size = $QUERY_CACHE_SIZE
query_cache_limit = 2M
query_cache_type = 1
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
EOF
echo "MySQL配置已优化,配置文件为: $CONFIG_FILE"
echo "请重启MySQL服务: systemctl restart mysql"3.2 MySQL性能分析与优化
-- MySQL性能优化SQL脚本
-- 1. 查看数据库状态
SHOW GLOBAL STATUS;
-- 2. 查看MySQL变量配置
SHOW VARIABLES;
-- 3. 分析慢查询日志
-- 首先需要启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
-- 4. 查找未使用索引的查询
SHOW GLOBAL STATUS LIKE 'Handler_read%';
-- 5. 查看正在执行的查询
SHOW PROCESSLIST;
-- 6. 查看表状态
SHOW TABLE STATUS;
-- 7. 优化表结构
-- 对所有数据库表执行优化操作
SELECT CONCAT('OPTIMIZE TABLE ', table_schema, '.', table_name, ';')
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
AND engine='InnoDB';
-- 8. 查找缺少索引的表和列
SELECT
t.table_schema,
t.table_name,
s.column_name
FROM
information_schema.tables t
JOIN
information_schema.statistics s ON t.table_schema = s.table_schema AND t.table_name = s.table_name
WHERE
t.table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY
t.table_schema, t.table_name, s.column_name
HAVING
COUNT(*) < 1;
-- 9. 获取表的访问频率信息
SELECT * FROM information_schema.table_statistics;
-- 10. 索引使用分析
SELECT * FROM information_schema.index_statistics;
-- 11. 分析可能需要建立的索引
SELECT
db.table_schema,
db.table_name,
db.column_name,
db.cardinality,
idx.non_unique,
idx.indexed_columns
FROM (
SELECT
table_schema,
table_name,
column_name,
COUNT(DISTINCT column_value) as cardinality
FROM
information_schema.columns
WHERE
table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY
table_schema, table_name, column_name
) as db
LEFT JOIN (
SELECT
s.table_schema,
s.table_name,
s.index_name,
s.non_unique,
GROUP_CONCAT(s.column_name ORDER BY s.seq_in_index) as indexed_columns
FROM
information_schema.statistics s
GROUP BY
s.table_schema, s.table_name, s.index_name
) as idx ON db.table_schema = idx.table_schema AND db.table_name = idx.table_name
WHERE
db.cardinality > 10
ORDER BY
db.cardinality DESC;四、Web服务器性能优化
4.1 Nginx性能优化配置
# Nginx性能优化配置
user www-data;
# 设置为CPU核心数
worker_processes auto;
# 每个worker能打开的最大连接数
worker_rlimit_nofile 65535;
events {
# 使用epoll网络模型
use epoll;
# 每个worker能同时接受的连接数
worker_connections 10240;
# 一次性接受所有新连接
multi_accept on;
}
http {
# 基本设置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
types_hash_max_size 2048;
server_tokens off;
# 文件缓存设置
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# MIME类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式化
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
access_log /var/log/nginx/access.log main buffer=16k;
error_log /var/log/nginx/error.log warn;
# Gzip压缩
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/js
text/xml
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;
# 连接数限制
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
# 客户端请求缓冲区
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 10m;
large_client_header_buffers 4 4k;
# 超时设置
client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;
# 服务器配置
server {
listen 80;
server_name example.com;
# 资源文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, no-transform";
}
# 静态文件服务
location /static/ {
root /var/www/html;
access_log off;
expires 30d;
}
# 动态内容
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 限制每个IP的连接数
limit_conn conn_limit_per_ip 10;
# 限制每个IP的请求频率
limit_req zone=req_limit_per_ip burst=20 nodelay;
}
}
# 上游服务器配置
upstream backend {
# 使用IP hash保证会话一致性
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
# 最大失败尝试次数和超时时间
keepalive 100;
}
}4.2 Apache性能优化配置
# Apache性能优化配置
# 加载必要的模块
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
# MPM事件驱动模型设置
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>
# 基本设置
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
ServerSignature Off
ServerTokens Prod
# 启用压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml
DeflateCompressionLevel 6
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
# 缓存控制
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType text/html "access plus 1 day"
</IfModule>
# 文件缓存
<IfModule mod_headers.c>
Header unset ETag
FileETag None
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>
</IfModule>
# 性能设置
EnableMMAP On
EnableSendfile On
DirectoryIndex index.html index.php
# SSL优化
<IfModule mod_ssl.c>
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
</IfModule>
# 虚拟主机示例
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot "/var/www/html"
ServerName example.com
# 日志配置
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# 目录权限
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 静态文件缓存
<Directory "/var/www/html/static">
Options -Indexes
ExpiresActive On
ExpiresDefault "access plus 1 month"
</Directory>
</VirtualHost>常见面试问题与答案
1. 服务器性能相关问题
Q: 如何诊断Linux服务器CPU使用率过高的问题?
A: CPU使用率过高的诊断与处理:
使用监控工具定位问题:
# 查看整体CPU使用情况 top -c # 查看具体进程CPU使用情况 pidstat -u 1 # 定位占用CPU最高的线程 ps -mp <PID> -o THREAD,tid,time | sort -rn # 转换线程ID为十六进制并使用perf分析 printf "%x" <TID> perf top -p <PID>原因分析:
- 程序逻辑问题(死循环)
- 频繁的垃圾回收
- 资源竞争(锁)
- 系统中断处理
解决方案:
- 代码优化
- 增加硬件资源
- 调整系统参数
- 负载均衡
Q: MySQL数据库查询变慢,如何定位和解决?
A: MySQL性能问题定位与优化:
问题定位:
-- 查看正在执行的查询 SHOW PROCESSLIST; -- 分析慢查询日志 SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10; -- 查看某个查询的执行计划 EXPLAIN SELECT * FROM users WHERE email='test@example.com';常见问题:
- 缺少索引或索引失效
- 表数据量过大
- 连接数过多
- 查询语句不优化
- 服务器资源不足
解决方案:
-- 为常用查询字段添加索引 ALTER TABLE users ADD INDEX idx_email (email); -- 优化JOIN语句 EXPLAIN SELECT u.*, p.* FROM users u LEFT JOIN profiles p ON u.id = p.user_id WHERE u.status = 'active'; -- 分表分库 -- 优化查询语句 SELECT user_id, COUNT(*) FROM orders GROUP BY user_id LIMIT 10;
2. 系统优化问题
Q: 如何优化Linux服务器的I/O性能?
A: I/O性能优化策略:
I/O调度器选择:
# 查看当前I/O调度器 cat /sys/block/sda/queue/scheduler # 修改I/O调度器 echo deadline > /sys/block/sda/queue/scheduler使用异步I/O和直接I/O:
# 使用direct I/O写入 dd if=/dev/zero of=test_file bs=1M count=1000 oflag=direct # 使用异步I/O工具 aio-stress -s 1G -b 64k -t 16文件系统优化:
# 使用noatime挂载选项 mount -o remount,noatime /dev/sda1 / # 优化文件系统 tune2fs -O dir_index /dev/sda1 e2fsck -D /dev/sda1RAID和LVM配置:
# 创建RAID 0阵列提高性能 mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
Q: 如何优化应用程序的内存使用?
A: 内存使用优化策略:
内存使用分析:
# 查看进程内存使用 pmap -x <PID> # 查看内存使用情况 free -m vmstat 1 10常见问题:
- 内存泄漏
- 内存碎片
- 缓存策略不当
- 堆内存设置不当
解决方案:
# 设置合理的内存限制 ulimit -v 4000000 # 限制虚拟内存为4GB # Java应用调整堆内存 java -Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar # 使用cgroups限制内存 cgcreate -g memory:limit_group echo 500000000 > /sys/fs/cgroup/memory/limit_group/memory.limit_in_bytes
3. 性能测试问题
Q: 如何进行压力测试和性能测试?
A: 压力测试与性能测试方法:
Web应用压力测试:
# 使用ab工具进行HTTP压测 ab -n 10000 -c 100 http://example.com/ # 使用JMeter进行复杂场景测试 jmeter -n -t test_plan.jmx -l results.jtl # 使用wrk进行高并发测试 wrk -t12 -c400 -d30s http://example.com/数据库压力测试:
# 使用sysbench测试MySQL sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password=password prepare sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password=password --max-time=60 --oltp-read-only=off --max-requests=0 --num-threads=8 run结果分析:
- 响应时间(RT)
- 吞吐量(TPS/QPS)
- 错误率
- 资源使用率
Q: 如何解读性能测试结果?
A: 性能测试结果分析:
关键指标解读:
- 响应时间:平均值<1秒,95%<2秒为良好
- 吞吐量:根据业务需求确定基准线
- 错误率:应低于1%
- 系统资源:CPU<70%,内存<80%为宜
性能瓶颈判断:
# CPU瓶颈判断 if [ $(mpstat 1 1 | grep Average | awk '{print 100-$NF}') -gt 80 ]; then echo "CPU可能成为瓶颈" fi # 内存瓶颈判断 if [ $(free | grep Mem | awk '{print $3/$2 * 100.0}') -gt 90 ]; then echo "内存可能成为瓶颈" fi # I/O瓶颈判断 if [ $(iostat -xz 1 2 | tail -n 10 | grep -v Device | awk '{sum+=$14} END {print sum/NR}') -gt 80 ]; then echo "磁盘I/O可能成为瓶颈" fi性能优化方向:
- 应用代码优化
- 系统配置调整
- 架构扩展与重构
- 硬件升级
实操演练项目
项目1:Web系统全链路性能优化
- 目标:优化企业CRM系统,提升访问速度50%以上
- 内容:
- 前端性能优化
- Web服务器优化
- 应用服务优化
- 数据库优化
- 网络和CDN加速
项目2:大型数据库性能调优
- 目标:优化处理亿级数据量的企业数据库系统
- 内容:
- 数据库架构设计
- 分库分表策略
- 索引优化
- SQL语句调优
- 配置参数优化
项目3:微服务性能瓶颈定位与解决
- 目标:提高微服务架构下的系统整体性能
- 内容:
- 链路追踪系统搭建
- 性能瓶颈识别
- 服务间通信优化
- 缓存策略实施
- 容器资源配置调优
学习资源推荐
书籍推荐
- 《性能之巅:洞悉系统、企业与云计算》- Brendan Gregg
- 《高性能MySQL》- Baron Schwartz等
- 《Linux性能优化大师》- 陶辉
在线课程
- Linux性能调优实战
- 数据库性能优化与实践
- Web全栈性能优化技术
实验环境
- Linux性能实验室
- MySQL性能测试环境
- 分布式系统性能测试平台
认证考试建议
推荐认证路径
- Linux性能:LPIC认证
- 数据库性能:Oracle性能调优认证、MySQL性能优化认证
- Web性能:AWS性能效率专业认证
考试准备策略
- 性能测试实践积累
- 系统性能理论学习
- 案例分析与问题排查