Linux服務(wù)器內(nèi)存占用高排查方法
藍(lán)隊(duì)云小課堂:
當(dāng)Linux服務(wù)器內(nèi)存占用高時(shí),可以按照以下步驟進(jìn)行排查:
查看內(nèi)存使用情況
使用free命令可以查看系統(tǒng)的內(nèi)存使用情況,包括總內(nèi)存、已用內(nèi)存、空閑內(nèi)存等信息。
有時(shí)系統(tǒng)內(nèi)存占用高可能是由緩存和緩沖區(qū)所導(dǎo)致的。Linux系統(tǒng)會(huì)利用未分配的內(nèi)存作為緩存和緩沖區(qū),以提高文件訪問(wèn)速度。
# -h 人類可讀的格式輸出信息
free -h
# 可能返回
total used free shared buff/cache available
內(nèi)存: 15Gi 1.5Gi 12Gi 46Mi 1.4Gi 13Gi
交換: 2.0Gi 0B 2.0Gi
查看進(jìn)程內(nèi)存占用
使用top或htop命令可以查看系統(tǒng)進(jìn)程的內(nèi)存占用情況,按照內(nèi)存使用量排序,找出消耗較大的進(jìn)程。
htop命令可使用 yum install htop 進(jìn)行安裝
# 命令進(jìn)入htop的交互界面通過(guò)按鍵組合進(jìn)行交互
htop
# top命令進(jìn)入界面,按下大寫字母 M 按照內(nèi)存占用從高到低進(jìn)行排序
top
# 可能返回
top - 08:16:26 up 15 min, 1 user, load average: 0.00, 0.04, 0.05
Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 98.8 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2292 root 17 -3 1016716 40844 16904 S 1.3 2.0 0:09.14 YDService
1028 root 20 0 574288 19516 6152 S 0.0 1.0 0:00.23 tuned
1646 root 20 0 987628 19036 5824 S 0.0 0.9 0:00.29 YDLive
1709 root 20 0 622856 14296 3316 S 0.7 0.7 0:05.68 barad_agent
681 polkitd 20 0 614324 11116 4684 S 0.0 0.5 0:00.03 polkitd
1027 root 10 -10 61488 10136 8564 S 0.0 0.5 0:00.00 iscsid
1255 root 20 0 218528 9648 2984 S 0.0 0.5 0:00.07 rsyslogd
1708 root 20 0 164896 9496 2080 S 0.0 0.5 0:00.53 barad_agent
查看系統(tǒng)日志
查看系統(tǒng)日志可以幫助定位內(nèi)存占用高的原因。
# journalctl命令查看系統(tǒng)日志,過(guò)濾關(guān)鍵詞(“memory”或“oom”)查找相關(guān)日志
journalctl | grep -i memory
# 內(nèi)核日志包含有關(guān)內(nèi)存使用情況
grep -i memory /var/log/messages
內(nèi)存泄漏檢測(cè)
如果懷疑有內(nèi)存泄漏,可使用valgrind進(jìn)行內(nèi)存泄漏檢測(cè)。
由于 valgrind 的工作原理,它可能會(huì)使程序的運(yùn)行速度變慢,并且可能會(huì)增加程序的內(nèi)存使用量。因此,通常只在開發(fā)和調(diào)試階段使用 valgrind,而不是在生產(chǎn)環(huán)境中。
# 對(duì)程序 nginx 進(jìn)行 --leak-check=full 啟用完全的內(nèi)存泄漏檢測(cè)
valgrind --leak-check=full nginx
查看共享內(nèi)存
如果共享內(nèi)存占用較多,需要進(jìn)一步檢查是哪個(gè)進(jìn)程在使用共享內(nèi)存。
# 查看命令
cat /proc/meminfo | grep -i shmem
# 返回結(jié)果中Shmem表示系統(tǒng)中當(dāng)前使用的共享內(nèi)存總量
Shmem: 49004 kB
查看不可回收的slab內(nèi)存
查看不可回收的slab內(nèi)存占用情況,如果這部分內(nèi)存占用較高,可以使用slabtop命令查看是哪些slab占用大。
# 查看
cat /proc/meminfo | grep -i SUnreclaim
# slabtop 命令用于實(shí)時(shí)顯示內(nèi)核的“slab”內(nèi)存緩存信息
slabtop
檢查大頁(yè)內(nèi)存
查看是否配置了內(nèi)存大頁(yè)。如果HugePages_Total輸出非0,表示配置了內(nèi)存大頁(yè)。需要確認(rèn)這些大頁(yè)是業(yè)務(wù)自身配置還是其它惡意程序配置。
# 查看
cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize"
# 可能返回
HugePages_Total: 0
Hugepagesize: 2048 kB
檢查Swap分區(qū)
如果Swap分區(qū)使用過(guò)多,說(shuō)明系統(tǒng)已經(jīng)開始使用磁盤作為內(nèi)存擴(kuò)展,這可能會(huì)影響性能。
# 命令一
free
# 命令二
swapon -s
分析內(nèi)存使用情況
可以使用pmap命令分析特定進(jìn)程的內(nèi)存使用情況,或者使用perf命令進(jìn)行更詳細(xì)的性能分析。
更多小知識(shí),可聯(lián)系藍(lán)隊(duì)云一起探討。