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

2021-09-20 23:17:26 字數 1607 閱讀 4015

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

參考:

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

補充: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 

cgroup使用 memory資源限制

同樣,cgroup也可以對memory資源進行限制。下面以乙個例子來驗證cgroup對記憶體限制的使用。1.編寫程式,迴圈分配600m記憶體。include include include define chunk size 1024 1024 100 intmain memset p,0 chun...

使用CGROUP限制mongd的disk io

使用cgroup做磁碟io的資源隔離,用到blkio子系統 先測試blkio限制dd的情況,很重要的一點是只能限制direct io,dd if dev zero of mongodb dd1 bs 4k count 10240 oflag direct 在測試mongod的時候,直接限制mongo...

使用cgroup限制磁碟io讀寫速率

在mysql innobackupex全備期間,磁碟io基本被打滿,設定過 throttle效果不明顯,throttle this option specifies a number of i o operations pairs of read write per second.it accept...