Debian LAMP性能监控实操指南
一 快速排障的命令行工具
二 组件级监控要点
<Location /server-status>
SetHandler server-status
Require local
# 如需内网访问可改为:Require ip 192.168.1.0/24
</Location>
访问 http://服务器IP/server-status?auto 获取总请求数、空闲/忙碌工作进程、每秒请求、字节吞吐等;结合 ExtendedStatus On 可获取更细指标。tail -f /var/log/apache2/error.log
# 若启用 mod_log_config 的 combined 格式,可用 goaccess 等工具做趋势分析
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Queries';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
-- 计算缓存命中率:1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
三 可视化与长期监控方案
四 关键指标与告警阈值建议
| 维度 | 关键指标 | 建议阈值或关注点 | 排查方向 |
|---|---|---|---|
| CPU | load average、%usr、%sys、%iowait | load ≈ CPU核数为健康;**%iowait 持续>20%**多为I/O瓶颈 | 查 iostat、进程I/O、磁盘与数据库 |
| 内存 | available、swap used、si/so | swap 持续增长或 si/so 非零且持续需警惕 | 查内存泄漏、缓存/缓冲命中、服务配置 |
| 磁盘 | %util、await、r/s、w/s | **%util 持续>80%**易成为瓶颈;await升高表示响应慢 | 查 I/O 密集进程、RAID/磁盘健康、SQL优化 |
| 网络 | 带宽占用、丢包/重传 | 带宽接近上限或重传率高影响响应 | 查连接数、长连接、协议与对端状态 |
| Apache | Busy/Idle workers、Req/s、Bytes/s | Busy 长期接近 MaxRequestWorkers需扩容或优化 | 调优 MPM、启用压缩/缓存、优化代码与SQL |
| MariaDB | Threads_connected、Queries/s、Slow_queries、Innodb_buffer_pool_reads/requests | 慢查询增长、**缓存命中率<95%**需优化 | 慢查询日志、索引与SQL、缓冲池与配置 |
| PHP-FPM | 进程数、请求排队、慢请求 | 排队>0或慢请求增多需优化代码/配置 | 调整 pm 参数、开启 opcache、定位慢脚本 |
| 以上阈值用于快速判断健康度,需结合业务峰值与历史基线动态校准。 |
五 一键巡检脚本示例
#!/usr/bin/env bash
TS=$(date '+%F %T')
LOG=/var/log/lamp_monitor.log
{
echo "[$TS] === System ==="
echo "Load: $(awk '{print $1,$2,$3}' /proc/loadavg)"
free -m | awk 'NR==2{printf "Mem: used %sMB free %sMB cache %sMB\n", $3,$4,$6}'
df -h | awk '$NF=="/"{printf "RootFS: %s used %s avail %s %s\n", $1,$5,$4,$6}'
echo "[$TS] === I/O ==="
iostat -xz 1 2 | awk 'NR>3 && $1!~/^$/ {printf "Disk: %s util=%s await=%s r/s=%s w/s=%s\n", $1,$14,$10,$4,$5; exit}'
echo "[$TS] === Network ==="
ss -s | head -n 5
echo "[$TS] === Apache ==="
if command -v curl >/dev/null 2>&1; then
curl -s "http://127.0.0.1/server-status?auto" 2>/dev/null | head -n 20
fi
echo "[$TS] === MariaDB ==="
if command -v mysql >/dev/null 2>&1; then
mysql -e "SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Slow_queries';" 2>/dev/null
fi
} >> "$LOG" 2>&1
该脚本依赖 iostat(sysstat)、ss、curl、mysql 客户端,请确保已安装;生产环境建议配合 logrotate 做日志轮转与保留策略。