VPS 512MB 記憶體跑論壇 (Discuz/VBB),MySQL 假死、大量 Sleep 進程、系統緩慢。top 顯示 MySQL 佔用 400MB+ 記憶體。
Linux 預設啟動腳本載入 my-large.cnf (適用 2GB+ 記憶體),關鍵參數過大:
key_buffer=256Mtable_cache=256sort_buffer=1M × 連線數read_buffer=1M × 連線數這些「線程獨享」記憶體參數乘以併發連線數,瞬間耗盡記憶體觸發 Swap/OOM Killer。
# 1. 備份原配置
cp /etc/my.cnf /etc/my.cnf.bak
# 2. 覆蓋為小記憶體配置
cp /usr/share/mysql/my-small.cnf /etc/my.cnf
# 或手動編輯 /etc/my.cnf 參考下方關鍵值
# 3. 重啟生效
systemctl restart mysqld
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
thread_stack = 64K
table_cache = 4
sort_buffer_size = 64K
net_buffer_length = 2K
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer = 8M
sort_buffer = 8M
| 參數 | 屬性 | 調整建議 |
|---|---|---|
| key_buffer_size | 全域共享 | MyISAM 專用,設為實體記憶體 10-20%,InnoDB 主力可設極小 (16M) |
| innodb_buffer_pool_size | 全域共享 | 最關鍵,InnoDB 專用,設實體記憶體 50-70% (如 512MB 機建議 128-256M) |
| sort_buffer_size | 線程獨享 | 預設 256K 足夠,避免設 > 2M 導致併發爆記憶體 |
| read_buffer_size | 線程獨享 | 同 sort_buffer |
| join_buffer_size | 線程獨享 | 預設 256K,大表 JOIN 可適度調大但需試算最大併發 |
| max_connections | 限制 | 根據記憶體上限反推:(總記憶體 - 全域) / 單線程記憶體 |
# 觀察 Sleep 進程快速回收
mysql> SHOW PROCESSLIST;
# 記憶體佔用穩定在 100MB 內
free -h
小記憶體 VPS 必須 切換 my-small.cnf 或手動縮減參數。核心邏輯:全域共享記憶體盡量大 (InnoDB Buffer Pool),線程獨享記憶體盡量小,嚴格限制 max_connections。若流量增大,優先升級記憶體或讀寫分離,切勿盲目調大參數。