線上的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