使用cgroup限制某個程序對內存的使用

線上的mongodb是複製集模式的。爲了便於監控mongodb的慢查詢等狀態,在3臺機器上都部署了packetbeat,通過抓取27017端口的流量發送到ES集羣。


但是第二天發現zabbix告警,顯示某一臺機器A(從節點)上的mongod進程宕了。日誌顯示是OOM導致的。

wKioL1moDJPhuzi-AAAgtHGJvxY891.png


再一想到,我們每天的mongodb的備份腳本是通過遠程主機連接到機器A的27017端口進行dump數據的,通過對比zabbix的網卡流量趨勢圖、備份腳本的執行時間、message日誌中OOM的時間點,可以分析出就是因爲mongodump時候產生的大量的數據包被packetbeat抓取到並緩存住,造成服務器的內存被吃光了。


解決方法:

關閉這個機器A(從節點)上面的packetbeat進程,或者配置計劃任務以確保備份數據的時候,packetbeat進程不要開啓。




當然,這裏我們還可以用cgroup限制住packetbeat使用的內存大小,這樣的話,最多導致packetbeat宕掉,不會影響到mongod進程的正常工作。



############################################

具體配置步驟如下:


/etc/init.d/cgconfig start 

自動會在/cgroup/下生成一堆文件。


mkdir /cgroup/memory/packetbeat/    

echo 1024M > /cgroup/memory/packetbeat/memory.limit_in_bytes     ## 限制物理內存總量不超過1024M

echo 1050M > /cgroup/memory/packetbeat/memory.memsw.limit_in_bytes    ## 限制虛擬內存總量不超過1024M

## 帶 memsw 的表示虛擬內存,即物理內存加交換區。不帶 memsw 的那組僅包括物理內存。其中, limit_in_bytes 是用來限制內存使用的,其他的則是統計報告。



cgexec -g memory:packetbeat /etc/init.d/packetbeat start  即可啓動packetbeat


通過cgroup限制後,當packetbeat使用的內存達到限額,進程會被kill。


參考:

http://www.topjishu.com/5898.html




###############

補充:CentOS7上使用cgroup的方法:

yum install libcgroup-tools -y

systemctl start cgconfig 

cgcreate -g  memory:/packetbeat

echo 2048M > /sys/fs/cgroup/memory/packetbeat/memory.limit_in_bytes  

echo 2048M > /sys/fs/cgroup/memory/packetbeat/memory.memsw.limit_in_bytes  

cgexec -g memory:packetbeat /etc/init.d/packetbeat start 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章