1. 程式人生 > >使用cgroup限制記憶體使用

使用cgroup限制記憶體使用

調研目標: 1、檢查memory cgroup管理的程序都設定為不可oom kill時,當出現oom,是否會造成程序或程序組阻塞。 2、若出現阻塞,是否可自恢復。 一、準備過程 0、執行lssubsys --all,檢查是否安裝了cgroup的元件;沒有安裝則 apt-get install -y cgroup-bin。 1、準備三個程式,其中兩個分別可搶佔記憶體256MB、128MB,最後一個可從0開始逐漸增大記憶體佔用。 2、對debian系統開啟cgroup memmory子系統。(debian預設是關閉該子系統的)。 操作: vim /etc/default/grub 修改GRUB_CMDLINE_LINUX的值為"cgroup_enable=memory"。儲存。 執行update-grub; 執行reboot。 3、建立一個memory限制的cgroup。(執行完步驟2後,memory root cgroup會自動建立並掛載)。 操作: cd /sys/fs/cgroup/memory/ mkdir ts_mem_cg echo 400M > memroy.limit_in_bytes 二、測試過程
1、在ts_mem_cg下啟動程序,並設定為不可oom_kill。 操作: cgexec -g memory:ts_mem_cg /home/test/256MBMem cgexec -g memory:ts_mem_cg /home/test/128MBMem ps aux |grep 256MBMem, 找到pid,echo -1000 > /proc/pid/oom_score_adj ps aux |grep 128MBMem, 找到pid,echo -1000 > /proc/pid/oom_score_adj 對第三個程序,直接啟動/home/test/auto_encrease_mem,該程式會被getchar()阻塞。再開啟一個終端介面執行下面的操作。 ps aux |grep auto_encrease_mem, 找到auto_encrease_mem的pid。echo -1000 > /proc/pid/oom_score_adj。 把程序auto_encrease_mem新增到ts_mem_cg: cgclassify -g memory:ts_mem_cg pid 回到第一個終端響應getchar(),讓程式開始執行,逐漸搶佔記憶體。(這樣操作是為了防止啟動後來不及做oom設定就先oom了)。 2、利用top或free觀察記憶體使用情況。 3、auto_encrease_mem程式不斷申請記憶體並輸出提示,最後提示資訊的輸出中斷。說明發生了oom。 4、對auto_encrease_mem程式增加printf()輸出,多次測試,觀察輸出提示中斷對應的位置。反覆測試確認位置。 5、調整128MB程序的oom_score_adj(,改為預設值0和線上值-900),使其變成可oom kill。多次測試,檢查cgroup程序組的變化,被阻塞的程序auto_encrease_mem是否能脫離阻塞狀態。 三、結果分析
1、多次測試後,發現auto_encrease_mem阻塞在malloc()操作。 此時,三個程式總共佔用記憶體257+129+16=402MB;auto_encrease_mem程序cpu佔用53%(top顯示)。 2、第5步操作後,程序128MBMem隨即被oom kill;程序auto_encrease_mem恢復正常執行(繼續申請記憶體並輸出已用記憶體量提示資訊)。 四、結論 1、依據上述測試,認定在memory cgroup限定的記憶體使用完時(臨近oom),如果該cgroup管理的程序都不可oom kill,那麼cgroup程序組的程序就有機會在申請記憶體時被阻塞。 2、如果memory cgroup程序組內有程序可被oom kill,則這些程序在oom發生時會被kill掉。記憶體空餘後,之前因oom被阻塞的程序可以恢復執行。 說明: 以上測試在沒有開啟swap盤的情況下進行。 2016-05-10 hzzengchao1

相關推薦

使用cgroup限制記憶體使用

調研目標: 1、檢查memory cgroup管理的程序都設定為不可oom kill時,當出現oom,是否會造成程序或程序組阻塞。 2、若出現阻塞,是否可自恢復。 一、準備過程 0、執行lssubsys --all,檢查是否安裝了cgroup的元件;沒有安裝則 apt-

cgroup限制程序記憶體大小

宣告: 本部落格歡迎轉發,但請保留原作者資訊! 內容系本人學習、研究和總結,如有雷同,實屬榮幸! 以限制mongodb的記憶體大小為例。 Cgroup限制方法:   mkdir /cgroup/memory/test/ echo 50M > /cgrou

CGroup 限制CPU/記憶體等資源的使用

CGroup 介紹 CGroup 是 Control Groups 的縮寫,是 Linux 核心提供的一種可以限制、記錄、隔離程序組 (process groups) 所使用的物力資源 (如 cpu memory i/o 等等) 的機制。2007 年進入 Linux

Cgroup限制CPU、IO、記憶體以及linux系統中的排程策略

一、CPU 1、0核利用 思路: 0核是必須要保護的,否則各種系統命令、喂狗都可能出問題;    &

使用cgroup限制某個程序對內存的使用

cgroup的使用線上的mongodb是復制集模式的。為了便於監控mongodb的慢查詢等狀態,在3臺機器上都部署了packetbeat,通過抓取27017端口的流量發送到ES集群。但是第二天發現zabbix告警,顯示某一臺機器A(從節點)上的mongod進程宕了。日誌顯示是OOM導致的。再一想到,我們每天的

利用cgroup限制instance磁盤io資源使用

loaded load 安裝 product 開啟 .com read net nag 1、安裝libcgroup軟件包;[root@pre-pool1-r6-06-08-18-01 ~]# yum install libcgroup Loaded plugins: pro

Elasticsearch聚合限制記憶體使用

限制記憶體使用 通常為了讓聚合(或者任何需要訪問欄位值的請求)能夠快點,訪問fielddata一定會快點, 這就是為什麼載入到記憶體的原因。但是載入太多的資料到記憶體會導致垃圾回收(gc)緩慢, 因為JVM試著發現堆裡面的額外空間,甚至導致OutOfMemory異常。 最讓你吃

PHP 限制記憶體使用與檢視

在執行PHP程式,通常會遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的錯誤, 這個意味著PHP指令碼使用了過多的記憶體,並超出了系統對其設定的允許最大記憶體 <?php phpinfo(

使用cgroup限制普通使用者資源

#安裝cgroup yum install -y libcgroup-tools.x86_64 libcgroup #配置cgconfig vim /etc/cgconfig.conf #增加 group JstormGroup { memory { memory.limit_in_bytes = "8

使用cgroup限制java使用的記憶體量-思路

1.       對一個正在執行著的程序來說,在不到達其記憶體使用量邊界的情況下,擴大/縮小其cgroup分配的記憶體不會對它產生任何影響。 2.       在程序已經使用了一定量的記憶體的情況下,縮小其cgroup記憶體至小於已使用的記憶體量,有兩種結果(可通過cgro

GoldenGate通過CACHEMGR限制記憶體利用

今天客戶一個即將上線的資料庫報告無法連線了,馬上登入上去看,系統大量分頁,77G記憶體的機器,交換分割槽利用率達到70%,還一直在增加馬上svmon -U看了下,發現ggs使用者用了32GB記憶體,馬上意識到ogg有問題,立馬停掉。記憶體使用一下就降下來了檢查extra

(Django)對object.all()等大量資料的QuerySet限制記憶體使用

問題 在django的使用中,經常會出現大量資料的遍歷操作,或者是對大量資料進行遍歷遷移跟新,比如 for user in User.objects.all(): user.A = user.B User.B = None 等種種情況。

jdk1.8限制記憶體引數

centos7上java應用使用 java -jar -Xms512m -Xmx512m 引數啟動,限制不了記憶體,很快就會超過512m這個數,而且 還在不停的增長,大概在1.7G就會停止 增加各種引數-Xms512m -Xmx512m -XX:Metaspa

cgroup 限制虛擬機器頻寬後,虛擬機器裡top統計問題分析

今天遇到了一個問題。用cgroup限制虛擬機器(qemu-kvm)的CPU佔比為宿主機的50%時。發現虛擬裡centos7系統,用top顯示一個死迴圈的程序,這個程序的佔比是50%。而我所認知時虛擬機器對限制應該不感知。應該顯示100%才對。我又用qemu-kvm啟動了一個u

cgroup實現cpu綁定和資源使用比例限制

cgroup cpu.share cpuset 背景原理:部分物理服務器上部署了多個應用,為了避免由於部分應用異常造成機器負載過高,影響其他應用,對每個應用所屬進程進行cpu使用限制。 限制內容:A,綁定應用使用除0號cpu以外的其他cpu;B,設定cpu資源使用比例,當資源充足時候,可以使

GeoServer WMS地圖請求記憶體限制問題

應用需求:GeoServer釋出WMS地圖服務後,需要請求獲取一張較大的地圖圖片,請求地址如下: http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=

WIN7 開啟PAE突破4G記憶體使用限制

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【轉】Docker run 記憶體限制報錯

#docker run --memory 2G 報錯:WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without sw

JIRA應用的記憶體引數設定不當+容器沒有對資源進行限制導致服務掛掉的例子

背景: 應用的部署結構是這樣的:使用rancher管理的Docker叢集,有三臺物理主機,二十多個Docker容器, 提供的功能是問題跟蹤(JIRA),文件管理(Confluence),程式碼託管(svn,gitlab),持續整合(jenkins,gitlab-ci + Docker),程式碼質量管理(Son

字串的查詢刪除 時間限制:1 Seconds 記憶體限制:32 Mbyte

題目描述 給定一個短字串(不含空格),再給定若干字串,在這些字串中刪除所含有的短字串。 輸入描述 輸入只有1組資料。 輸入一個短字串(不含空格),再輸入若干字串直到檔案結束為止。 輸出描述 刪除輸入的短字串(不區分大小寫)並去掉空格,輸出。 輸入樣例 in #incl