使用cgroup限制某個程序對內存的使用
線上的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進程的正常工作。
以限制mongod使用的內存大小為例(packetbeat的啟動有點復雜,沒去折騰),
/etc/init.d/cgconfig start 自動會在/cgroup/下生成一堆文件。
mkdir /cgroup/memory/test/
echo 1024M > /cgroup/memory/test/memory.limit_in_bytes
echo 1024M > /cgroup/memory/test/memory.memsw.limit_in_bytes
cgexec -g memory:test /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongod.conf
這樣通過cgroup限制後,當mongod使用的內存達到限額1024MB後,進程會被自動kill。
使用cgroup限制某個程序對內存的使用