Linux系統(tǒng)內(nèi)存不足導(dǎo)致服務(wù)崩潰的排查方法
1. 內(nèi)存不足的常見癥狀
服務(wù)崩潰:
- 應(yīng)用程序(如 Web 服務(wù)、數(shù)據(jù)庫)無法正常運(yùn)行,出現(xiàn)崩潰或拒絕服務(wù)。
- 日志中可能提示
Out of Memory或Killed。
系統(tǒng)性能下降:
- 系統(tǒng)響應(yīng)緩慢,SSH 登錄延遲高。
- 執(zhí)行命令時卡頓,例如
ls或top。
高 Swap 使用:
- 系統(tǒng)頻繁使用交換分區(qū)(Swap),導(dǎo)致磁盤 IO 增加,性能大幅下降。
內(nèi)存不足的系統(tǒng)日志:
- 在
/var/log/messages或/var/log/syslog中,可能發(fā)現(xiàn)與內(nèi)存不足相關(guān)的日志,例如:
Out of memory: Kill process 12345 (my_service) score 1234 or sacrifice child Killed process 12345 (my_service) total-vm:123456kB, anon-rss:12345kB
2. 排查內(nèi)存不足的原因
2.1 檢查系統(tǒng)內(nèi)存使用情況
查看內(nèi)存和 Swap 使用情況:
運(yùn)行以下命令:
free -h
輸出示例:
total used free shared buff/cache available Mem: 8.0G 7.5G 100M 300M 400M 150M Swap: 2.0G 1.8G 200M
used:已使用內(nèi)存。free:剩余內(nèi)存。Swap:交換分區(qū)使用情況。
分析內(nèi)存分配:
- 查看內(nèi)存是否被緩存占用(
buff/cache)。 - 如果
available值非常低,說明內(nèi)存不足。
2.2 找出內(nèi)存占用高的進(jìn)程
使用 top 命令:
運(yùn)行以下命令:
top
按 M 鍵,按照內(nèi)存占用排序:
- 找出內(nèi)存占用最高的進(jìn)程。
使用 ps 命令:
按內(nèi)存排序列出進(jìn)程:
ps aux --sort=-%mem | head -n 10
輸出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 12345 5.0 75.6 123456 654321 ? S 10:00 5:00 java -Xmx4G myapp.jar
使用 smem 工具(更詳細(xì)的內(nèi)存分析):
如果未安裝,可以通過以下命令安裝:
sudo apt install smem # Ubuntu/Debian sudo yum install smem # CentOS/RHEL
查看實(shí)際內(nèi)存占用:
smem -tk
2.3 檢查系統(tǒng)日志
查看 OOM(Out of Memory)日志:
檢查 /var/log/messages 或 /var/log/syslog 中是否有 OOM 相關(guān)記錄:
grep -i "Out of memory" /var/log/messages grep -i "Out of memory" /var/log/syslog
查看被殺死的進(jìn)程:
- 如果某些服務(wù)被系統(tǒng)內(nèi)存管理器(OOM Killer)強(qiáng)制終止,日志中會提示被殺進(jìn)程的名稱和 PID。
2.4 檢查系統(tǒng)內(nèi)存泄漏
查找內(nèi)存泄漏的進(jìn)程:
- 如果某個進(jìn)程的內(nèi)存使用量不斷增加,可能存在內(nèi)存泄漏。
- 使用
top或ps命令定期查看內(nèi)存增長趨勢。
檢查內(nèi)核內(nèi)存泄漏:
- 查看
slab緩存是否異常增長:
slabtop
- 如果某些對象(如
dentry或inode)占用大量內(nèi)存,可能是內(nèi)核內(nèi)存泄漏。
2.5 檢查緩存和緩沖
查看緩存占用情況:
- 緩存和緩沖區(qū)可能占用大部分內(nèi)存,但這些內(nèi)存是可釋放的。
- 使用
free -h查看buff/cache。
清理緩存:
- 如果緩存占用過高,可以手動釋放(謹(jǐn)慎操作):
sudo sync sudo echo 3 > /proc/sys/vm/drop_caches
2.6 檢查 Swap 使用
查看 Swap 使用情況:
- 如果內(nèi)存不足,系統(tǒng)會使用 Swap 作為虛擬內(nèi)存。
- Swap 使用過高時,會導(dǎo)致性能下降(磁盤 IO 增加)。
- 運(yùn)行以下命令查看:
swapon --show
增加 Swap 空間:
- 如果 Swap 空間不足,可以擴(kuò)展 Swap 分區(qū):
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
3. 解決內(nèi)存不足問題的方法
3.1 優(yōu)化服務(wù)配置
調(diào)整服務(wù)的內(nèi)存限制:
- 檢查服務(wù)的配置文件,調(diào)整內(nèi)存占用的限制。
- 例如,優(yōu)化 Java 應(yīng)用的最大堆內(nèi)存:
java -Xmx2G -Xms1G -jar myapp.jar
限制進(jìn)程的內(nèi)存使用:
- 使用
ulimit命令限制單個進(jìn)程的內(nèi)存占用:
ulimit -v [memory_limit_in_kb]
3.2 增加系統(tǒng)內(nèi)存
- 如果系統(tǒng)物理內(nèi)存不足,可以通過以下方式增加:
- 升級服務(wù)器:增加物理內(nèi)存(RAM)。
- 增加 Swap:擴(kuò)展虛擬內(nèi)存緩解壓力。
3.3 優(yōu)化系統(tǒng)配置
調(diào)整 OOM Killer 優(yōu)先級:
- 配置某些關(guān)鍵服務(wù)不被 OOM Killer 優(yōu)先殺死:
echo -17 > /proc/<PID>/oom_score_adj
優(yōu)化內(nèi)存管理參數(shù):
- 調(diào)整虛擬內(nèi)存的觸發(fā)閾值:
sysctl vm.swappiness=10
3.4 清理系統(tǒng)資源
清理無用的進(jìn)程:
- 使用
kill或pkill終止占用內(nèi)存過高的非必要進(jìn)程:
kill -9 <PID>
卸載無用服務(wù):
- 停止和卸載占用內(nèi)存的無用服務(wù):
systemctl stop [service_name] systemctl disable [service_name]
3.5 使用監(jiān)控工具
實(shí)時監(jiān)控內(nèi)存使用:
- 部署監(jiān)控工具(如 Zabbix、Prometheus、Grafana)跟蹤內(nèi)存使用情況。
設(shè)置報(bào)警機(jī)制:
- 配置內(nèi)存使用超過閾值時觸發(fā)報(bào)警,提前發(fā)現(xiàn)問題。
4. 總結(jié)
排查 Linux 系統(tǒng)內(nèi)存不足的流程如下:
- 檢查內(nèi)存和 Swap 使用情況:使用
free和top查找問題根源。 - 定位占用內(nèi)存的進(jìn)程:使用
ps或smem找出高內(nèi)存占用進(jìn)程。 - 分析日志信息:檢查 OOM Killer 是否終止了關(guān)鍵服務(wù)。
- 優(yōu)化系統(tǒng)和服務(wù):調(diào)整服務(wù)配置、增加內(nèi)存或清理無用進(jìn)程。
- 部署監(jiān)控工具:持續(xù)監(jiān)控和優(yōu)化系統(tǒng)資源使用。
通過合理的排查和優(yōu)化,可以有效解決內(nèi)存不足導(dǎo)致的服務(wù)崩潰問題,并提升系統(tǒng)穩(wěn)定性和性能。
以上就是Linux系統(tǒng)內(nèi)存不足導(dǎo)致服務(wù)崩潰的排查方法的詳細(xì)內(nèi)容,更多關(guān)于Linux內(nèi)存不足服務(wù)崩潰的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何在 CentOS 7 中添加新磁盤而不用重啟系統(tǒng)
本篇文章主要介紹了詳解如何在 CentOS 7 中添加新磁盤而不用重啟系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
linux查看系統(tǒng)編碼和修改系統(tǒng)編碼的方法
本文為大家介紹了linux查看系統(tǒng)編碼和修改系統(tǒng)編碼的方法,這里使用的是redhat系統(tǒng),大家參考使用吧2014-01-01
win7中VMware安裝CentOs7搭建Linux環(huán)境教程
這篇文章主要為大家詳細(xì)介紹了win7中VMware虛擬機(jī)安裝CentOs7搭建Linux環(huán)境教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Linux安裝Redis以及Redis三種啟動實(shí)現(xiàn)過程
這篇文章詳細(xì)介紹了如何在Linux系統(tǒng)上安裝和配置Redis,并提供了三種不同的啟動方式,還解釋了如何在Windows上使用桌面管理工具連接到Linux上的Redis服務(wù)器2025-12-12

