面對高併發訪問、數據庫瓶頸、系統負載飆升,運維需要一套**有的放矢**的優化方法論。本文結合生產實戰,從 **Apache MPM 參數調優、MySQL 關鍵狀態變量分析、系統級性能工具 (vmstat/top) 解讀** 三個維度,給出具體配置建議、分析邏輯、觀測指標與避坑經驗,構建從 Web 服務層到存儲層再到作業系統層的完整優化閉環。
StartServers 個空閒子進程。MinSpareServers → 指數級分叉新進程(預熱)。MaxSpareServers → 殺掉多餘進程(釋放內存)。MaxClients (2.4 為 MaxRequestWorkers):同時服務的最大連接數,**核心吞吐上限**。ServerLimit:MaxClients 的硬上限,修改需重啟主進程。MaxRequestsPerChild:子進程處理請求數上限,防內存洩漏,0 為不限制。
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 1024
MaxClients 768
MaxRequestsPerChild 2048
Timeout 30
KeepAlive Off
Timeout:30 秒(高併發下防慢速攻擊)。KeepAlive Off:論壇/動態站點關閉持久連接,釋放進程槽位。MaxClients 768:預留內存給 OS/MySQL,每進程 ~10MB 估算。MaxRequestsPerChild 2048:周期性回收進程,緩解 PHP/模塊內存洩漏。innodb_buffer_pool_size (內存 60-70%)、innodb_log_file_size、max_connections、query_cache_type=OFF (5.7+)。mysqlreport / SHOW GLOBAL STATUS 關鍵指標:| 指標 | 健康閾值 | 調優方向 | |
|---|---|---|---|
Open_tables / Opened_tables | Opened 緩慢增長 | 增大 table_open_cache | |
Key_reads / Key_read_requests | 命中率 > 99% | 增大 key_buffer_size (MyISAM) | |
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests | 命中率 > 99% | 增大 innodb_buffer_pool_size | |
Threads_created / Connections | 緩存命中率 > 90% | 增大 thread_cache_size | |
Created_tmp_disk_tables / Created_tmp_tables | 磁盤臨時表比例 < 10% | 增大 tmp_table_size/max_heap_table_size | |
Slow_queries | 持續增長 | 開啟慢查詢日志,分析 EXPLAIN |
| 現象 | vmstat 特徵 | top 特徵 | 優先排查 |
|---|---|---|---|
| CPU 瓶頸 | r 持續 > 核心數, us+sy > 80% | 單進程佔用 100%+ CPU | 應用代碼/算法/鎖爭用 |
| IO 瓶頸 | wa > 20%, bi/bo 高, b > 0 | 進程狀態 D, IOPS 達磁盤上限 | 慢查詢/索引/磁盤型別/RAID 卡 |
| 內存不足 | si/so 持續非 0, free 極低 | RES 總和接近物理內存, Swap 活躍 | 內存洩漏/緩存佔用/擴容 |
| 鎖/上下文切換 | cs 極高 (萬級), sy 高 | 大量線程 RUNNABLE/WAITING | 鎖粒度/線程池大小/無鎖數據結構 |
ab/wrk/sysbench 模擬生產流量,對比調優前後 QPS/RT/錯誤率。httpd.conf/my.cnf/sysctl.conf) 並納入版本控制。性能優化無銀彈,**Apache 定吞吐上限、MySQL 定存儲效率、OS 定資源邊界**。掌握 MPM 參數、MySQL 狀態變量、vmstat/top 解讀 三板斧,建立「觀測→假設→驗證→固化」閉環,才能在流量洪峰來臨時從容應對,保障業務平穩運行。