使用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