使用cgroup限制某個程式對記憶體的使用

  • 2019 年 10 月 4 日
  • 筆記

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

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

再一想到,我們每天的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 

Tags: