今日發現論壇卡卡的
於是去看了一下
發現mariadb CPU負載超級高
1. 🔍 第一步:抓出到底是哪一條 SQL 語句在搞鬼
這是最關鍵的一步。資料庫 CPU 高,通常是因為某個查詢沒有寫好、或是缺少「索引(Index)」,導致資料庫必須做全表掃描(Full Table Scan)。
請登入你的 MariaDB 資料庫:
登入後,執行以下指令來查看目前正在執行的所有查詢:
PROCESSLIST 暴露出非常經典且嚴重的 Discuz! 論壇被 CC 攻擊(惡意刷流量)或遭遇大量爬蟲 的現象。
導致你 CPU 飆高的核心原因是:pre_common_session 這張資料表被鎖死(Table Lock)了。
調整 AlmaLinux 9 的 MariaDB 記憶體設定
從你的 top 數據來看,這台伺服器的記憶體(RAM)其實滿充足的(MariaDB 佔用不到 1% MEM),但 CPU 卻爆了。這通常意味著 MariaDB 的快取緩衝區(Buffer Pool)可能設得太小,導致它不斷在做硬碟 I/O 與 CPU 計算,而不是直接從記憶體抓資料。
你可以檢查 MariaDB 的設定檔(通常在 /etc/my.cnf 或 /etc/my.cnf.d/mariadb-server.cnf):
打開設定檔:
- sudo nano /etc/my.cnf.d/mariadb-server.cnf
複製代碼
在 [mysqld] 區段底下,檢查或加入以下設定(假設你的伺服器總記憶體有 16GB 或以上,可以分配給資料庫多一點快取):ini
- [mysqld]
- # 讓 InnoDB 引擎可以使用更多記憶體來快取數據和索引(通常設為總記憶體的 50% - 70%)
- innodb_buffer_pool_size = 2G # 請根據你伺服器的實際記憶體大小調整,例如 2G、4G 或 8G
- # 開啟慢查詢日誌,以後有慢 SQL 會自動記錄下來
- slow_query_log = 1
- slow_query_log_file = /var/log/mariadb/slow.log
- long_query_time = 2 # 超過 2 秒的查詢就會被記錄
複製代碼 修改後存檔,並重啟 MariaDB:bash
- sudo systemctl restart mariadb
複製代碼
將該資料表轉換為 InnoDB 引擎(徹底根治鎖表問題)
為了防止等一下又有流量進來導致重新卡死,建議將這張表改為支援行級鎖(Row-level Lock)的 InnoDB 引擎。這樣多個 IP 同時刪除/寫入時就不會互相排隊卡死。
在 MariaDB 命令列中執行:
- ALTER TABLE pre_common_session ENGINE=InnoDB;
複製代碼
這時CPU負載還是無法降下
啟用 AlmaLinux 9 內建防禦(封鎖可疑 IP)
既然我們在之前的 PROCESSLIST 看到大量來自海外的不明 IP(如 45.70.198.97、86.243.81.109),你可以利用系統內建的 firewalld 或 iptables 進行保護。
如果你發現攻擊大部分來自國外,且你的論壇主要服務特定地區(例如台灣/亞洲),最快的方法是封鎖特定異常網段,或是安裝 fail2ban 來自動封鎖在短時間內瘋狂連線的 IP:
安裝 Fail2ban(自動阻擋 CC 攻擊者):
- sudo dnf install epel-release -y
- sudo dnf install fail2ban -y
複製代碼
重新開機就可以了
如果是CENTOS 8
epel-next旨在針對 RHEL/CentOS Stream「Next」版本測試軟體包,但該特定路徑在 Fedora 的鏡像版本 8 中已被移動或棄用。 您可以透過停用或刪除儲存庫檔案輕鬆解決此問題epel-next,因為您只需要標準的 EPEL 儲存庫fail2ban。 步驟 1:停用或移除epel-next執行以下命令禁用該epel-next存儲庫: - sudo dnf config-manager --set-disabled epel-next
複製代碼
(或者,如果您想徹底刪除負責此問題的倉庫文件,可以運行sudo rm -f /etc/yum.repos.d/epel-next*:) 步驟 2:清理並重建緩存現在清除快取並重新生成: - sudo dnf clean allsudo dnf makecache
複製代碼
步驟 3:安裝 Fail2ban快取更新成功後,您可以繼續安裝fail2ban: - sudo dnf install fail2ban -y
複製代碼 |