首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux MySQL 記憶體佔用過高解決方案:切換 my-small.cnf 配置實戰

     編輯:MySQL 資料庫相關知識

現象

VPS 512MB 記憶體跑論壇 (Discuz/VBB),MySQL 假死、大量 Sleep 進程、系統緩慢。top 顯示 MySQL 佔用 400MB+ 記憶體。

根因

Linux 預設啟動腳本載入 my-large.cnf (適用 2GB+ 記憶體),關鍵參數過大:

  • key_buffer=256M
  • table_cache=256
  • sort_buffer=1M × 連線數
  • read_buffer=1M × 連線數

這些「線程獨享」記憶體參數乘以併發連線數,瞬間耗盡記憶體觸發 Swap/OOM Killer。

解決方案:套用 my-small.cnf

# 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

my-small.cnf 關鍵參數 (≤64MB 系統)

[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。若流量增大,優先升級記憶體或讀寫分離,切勿盲目調大參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved