1. 創建一個目錄用于指定需要控制的作業進程,創建之后系統在會每一級自動生成所有的配置文件,VPS,可以將該目錄認為是一個資源控制組。
創建內核作業對象:調用::CreateJobObject()創建一個內核對象,剛創建的對象沒有和進程關聯。
內存:物理內存的設置文件為memory子系統下的memory.limit_in_bytes,虛擬內存為memory.memsw.limit_in_bytes。如果同時設置這兩個參數,需要先設置memory.limit_in_bytes,因為虛擬內存的配額只有在物理內存用完后開始生效。在Linux系統上,只有當物理內存消耗完后才開始消耗虛擬內存,超過配額后再申請的話就會觸發OOM kill掉進程。注意:OOM killer也可以關閉,需要向memory.oom_control中寫入1,這樣當進程嘗試申請的內存超過允許,那么它就會被暫停,直到額外的內存被釋放。
在大數據迅速發展的今天,很大一部分支持來自于底層技術的不斷發展,其中非常重要的一點就是系統資源的管理和控制, 大數據平臺 的核心就是對資源的調度管理,在調度和管理之后如何對這些資源進行控制便成了另一個重要的問題。大數據系統中用戶成千上萬的作業進程跑在集群中,如果不能對這些進程的資源進行控制,那么 大數據平臺 將變得舉步維艱,整個集群便會隨時崩潰。同時,大數據作業的調度也是基于資源的配額進行分配,大數據的作業本身就承載了資源配額的屬性,但是這些作業是否按照配額進行運行和計算,是否超過了指定的配額導致overuse,是否達不到指定的配額導致資源浪費,這一直以來都是 大數據平臺 面對和要解決的問題。
本文針對大數據平臺中資源控制這個層面來詳細介紹資源控制在不同操作系統上的具體技術實現,以及大數據平臺和資源控制的集成。
3. 設置該資源控制組的物理內存使用配額
資源控制使用的系統功能
Windows平臺也有對應的內核對象用來控制作業對系統資源的訪問,而且控制的范圍比Linux廣,包括剪切板,關閉Windows的權限,窗口權限等。不同于Linux,Windows通過系統API來實現對作業對象的訪問。
2. 添加需要的進程到該資源控制組,可以添加多個進程ID
一個進程屬于一個作業對象之后,不能再assign給另一個作業對象。
Windows JobObjects支持的列表
cgroup簡介
結束語
下面直接以C++代碼為例來說明如果創建和管理作業對象,同時包含如何與ACE進程對象如何集成。
YARN支持對現有容器大小的調整(cgroup和jobobjects都支持修改資源配額),當用戶從YARN申請了一些固定大小的容器,想改變容器資源配額的大小的時候不需要釋放掉這些容器重新申請,YARN支持動態改變已經分配的容器的大小。
關閉作業對象:調用:: CloseHandle()關閉作業對象的句柄。
如果不進行設置,默認情況下,繼承根目錄的內存配置,即系統內存。