從這兩張監控圖可以看出,服務器在大約上午 10:30 前后經歷了一次明顯的負載變化:
1. 圖表解讀
-
CPU 使用率
- 從凌晨到上午約 10:00 前,CPU 基本處于 0–2% 的閑置狀態。
- 10:00–14:00 之間,CPU 利用率逐步攀升,多次沖擊 30%–50% 的區間,最高達到約 52.6%。
-
內存使用率
- 同期內存一直保持在 ~39–40% 左右。
- 上午約 10:30 開始,內存使用率突然躍升至 60%、70%,隨后逐漸爬升至 99.2% 的峰值。
2. 可能原因
-
新進程/服務啟動
- 某個定時任務、容器或后臺服務在 10:30 左右啟動,短時間內占用了大量內存。
-
內存泄露或緩存
- 應用(如 Java、Python 后臺進程)未正確釋放對象,導致內存逐漸耗盡。
- 數據庫或緩存(如 Redis、MySQL)緩存設置過大。
-
缺少 Swap
- 如果未配置 swap,當物理內存耗盡時,系統會直接 OOM(Out-Of-Memory),表現為內存占滿并伴隨進程被殺。
-
日志/文件寫入暴增
- 大量日志寫入或文件緩存也會暫時占滿內存。
3. 排查步驟
-
實時進程監控
# 查看內存占用前十的進程 ps aux --sort=-%mem | head -n 15# 交互式查看(安裝 htop 更直觀) top # 或 sudo apt-get install -y htop && htop
-
內存與 swap 情況
free -h
- 確認物理內存、swap 是否被用滿。
- 如果沒有 swap,可考慮添加。
-
查看系統日志
# OOM 殺進程記錄 dmesg | grep -i oom journalctl -p err -n 50
-
回溯定時任務
- 檢查
/etc/crontab
、/var/spool/cron
下是否有新任務在此時段執行。
- 檢查
-
應用自身日志
- 對應服務(如你的 Web 應用、數據庫)日志目錄,查找異常報錯或 GC 信息。
4. 解決方案
-
短期應急
-
殺掉占用過高的進程:
kill -9 <pid>
-
重啟內存泄漏進程或容器服務:
systemctl restart your-service
-
-
配置 Swap 分區/文件
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 添加到 /etc/fstab 使重啟后自動啟用 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
-
優化應用配置
- 減小 JVM/Xmx、Python 緩存等內存上限;
- 調整數據庫緩存(MySQL 的
innodb_buffer_pool_size
、Redis 的maxmemory
);
-
橫向或縱向擴容
- 增大實例規格(更大內存);
- 部署多實例,做負載均衡,分擔內存壓力。
-
監控與報警
- 在華為云監控中為內存使用率 ≥ 80% 設定告警,及時干預;
- 定期審查定時任務與日志大小,避免突增。
5. 與 SSH 連接問題的關聯
-
內存被打滿時,系統可能觸發 OOM,殺掉包括 sshd 在內的關鍵進程,導致 VS Code 無法通過 SSH 連接,但 Navicat(連接數據庫)看似正常,因為數據庫進程仍在運行。
-
先解決內存占滿,再嘗試重啟 sshd:
sudo systemctl restart sshd
下一步建議:先通過 ps aux
/top
找出“吃”內存最厲害的進程,并進行殺進程或重啟;然后按需配置 swap 并優化服務內存參數;最后視業務情況決定是否擴容。