問題現(xiàn)場
查看系統(tǒng)內(nèi)存的使用狀態(tài)
監(jiān)控報警可用內(nèi)存空間不足由缆,常規(guī)的解決方案如下:
- 增加內(nèi)存(增加成本)
- 增加虛擬內(nèi)存(影響性能)
- 定期清理緩存(echo 1 > /proc/sys/vm/drop_caches)
本文將介紹定期清除頁面緩存顽馋,但是過會兒內(nèi)存又被占滿問題的分析。
問題分析
- 通過監(jiān)控系統(tǒng)負載情況(vmstat 1)财剖,確定是頁面緩存(cache項)占用量大悠夯,并且釋放頁面緩存后從塊設(shè)備讀入數(shù)據(jù)量(bi項)會馬上增加。
- 通過監(jiān)控io情況(iostat -x -k 1)也可以看出
- 基于此可以猜測是有進程在頻繁的讀取文件導致躺坟,監(jiān)視磁盤I/O使用狀況(iotop -oP)沦补,釋放頁面緩存后有幾個sed命令讀取文件進程占用IO很高。
- 至此結(jié)合業(yè)務(wù)分析是因為每分鐘讀取日志統(tǒng)計指標導致
擴展知識
/proc/meminfo
查看更詳細的內(nèi)存信息:
$ cat /proc/meminfo |grep -E "Buffer|Cache|Swap|Mem|Shmem|Slab|SReclaimable|SUnreclaim"
- MemFree:空閑的物理內(nèi)存
- MemAvailable:可用的物理內(nèi)存咪橙,MemFree+Buffers+Cached
- Buffers:(Buffer Cache)對磁盤塊設(shè)備數(shù)據(jù)的緩存
- Cached:(Page Cache)對文件系統(tǒng)上文件數(shù)據(jù)的緩存夕膀,MemFree+SReclaimable
- SwapTotal:虛擬內(nèi)存,利用磁盤空間虛擬出的一塊邏輯內(nèi)存
- Slab:Linux內(nèi)存管理機制
- SReclaimable:Slab可回收部分
- SUnreclaim:Slab不可回收部分
- Shmem:進程間共同使用的共享內(nèi)存
/proc/sys/vm/drop_caches
清除緩存策略:
1:清除page cache
2:清除slab分配器中的對象(包括目錄項和inode)
3:清除page cache和slab分配器中的對象
參考
OOM killer及Overcommit
Linux buffer/cache 內(nèi)存占用過高的原因以及解決辦法
Linux查看Buffer&Cache被哪些進程占用