您好,登錄后才能下訂單哦!
本篇內容介紹了“Python3+cgroupspy怎么安裝使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
對于一個腳本,最基礎的限制是要限制單進程實例以保證了不會存在多個進程實例、在運行程序主體邏輯前檢測系統資源剩余量確保自己不是壓夸系統的最后一根稻草、設置程序運行超時時間以保證進程實例不會無休止地運行下去。
進一步,在部署有可用性要求較高的服務的主機中,我們還需要關注腳本運行期間占用的系統資源的問題,我們需要一種途徑限制腳本對cpu、內存、io等系統資源的用量,以防止腳本對這些關鍵服務造成影響。
cgroups是Control groups的簡稱,是Linux內核提供的一種限制進程使用和種系統資源的特性。
最早的cgroups來自于谷歌工程師Paul Menage和Rohit Seth開發的“處理容器”特性,他們的工作在2008年布的Linux2.6.24版本被集成,此亦即所謂的cgroupsV1版本。
在此之后各種不同的特性被添加到cgroups之上,在豐富cgroups功能的同時,也使其出現復雜化和不一致的問題。基于此原因,Tejun Heo對cgroups進行了重寫此即cgroupsV2,在Linux 3.10開始被集成在Linux 4.5正式發布。
在預期上V2是V1的替代,但為了兼容兩者可以同時存在。在后邊的介紹中沒有特別說明指的都是cgroupsV2。
在表現形式上,cgroups是一個文件系統,通常是掛載在/sys/fs/cgroup目錄下,可以使用df -h直接查看
該目錄下的每一個子文件夾就代表一種資源,要限制該項資源就在相應的文件夾下進行配置。
比如限制cpu就在cpu,cpuacct文件夾下進行配置、限制io就在blkio文件夾下進行配置、限制內存就在memory文件夾下進行配置。
在文件夾下的每個文件就是該項資源的一個指標,對各指標進行配置,最后在tasks中寫入想要限制的目標進程的pid,linux內核即會按配置對這個進程進行限制。
但我們可能會想對不同的進程進行不同的限制,這是一個普遍的需求。所以我們一般不直接修改各資源文件夾下的文件,而是在資源文件夾下為我們的目標進程單獨創建一個文件夾,但使用mkdir創建文件夾時系統會自動在該文件夾下生成各資源指標的配置文件。而要刪除時,直接使用rmdir刪除文件夾即可。
示例一,限制pid為1234的進程最多只能使用一個核的90%算力。
pid_num=1234 cgroup_base_dir="/sys/fs/cgroup" resource_dir="cpu,cpuacct" self_define_dir="test_process" target_path="${cgroup_base_dir}/${resource_dir}/${self_define_dir}" # 先在cpu配置文件夾下再單獨創建一個文件夾 mkdir ${target_path} # 設置時段長度,單位微秒。這里設置成1000000微秒,即1秒 echo 1000000 > ${target_path}/cpu.cfs_period_us # 設置在該時間段內最多能使用的時間,單位微秒。這里設置成900000,即0.9秒。 # 當cpu.cfs_quota_us比cpu.cfs_period_us大時表示可以使用多個cpu核 echo 900000 > ${target_path}/cpu.cfs_quota_us # 對進程進行限制 echo ${pid_num} >> ${target_path}/tasks
示例二,限制pid為1234的進程對設備號為252:0的磁盤的讀寫速度最高都只能為5M
pid_num=1234 # 這里設備號是給定的,可使用lsblk查看自己磁盤的設備號 device_num=252:0 limit_read_rate=5242880 limit_write_rate=5242880 cgroup_base_dir="/sys/fs/cgroup" resource_dir="blkio" self_define_dir="test_process" target_path="${cgroup_base_dir}/${resource_dir}/${self_define_dir}" # 先在cpu配置文件夾下再單獨創建一個文件夾 mkdir ${target_path} # 限制讀速度,單位B每秒。 echo "${device_num} ${limit_read_rate}" > ${target_path}/blkio.throttle.read_bps_device # 限制寫速度,單位B每秒。 echo "${device_num} ${limit_write_rate}" > ${target_path}/blkio.throttle.write_bps_device # 對進程進行限制 echo ${pid_num} >> ${target_path}/tasks
示例三,限制pid為1234的進程最多只能使用1G的內存
pid_num=1234 limit_memory_byte=1024000000 cgroup_base_dir="/sys/fs/cgroup" resource_dir="memory" self_define_dir="test_process" target_path="${cgroup_base_dir}/${resource_dir}/${self_define_dir}" # 先在cpu配置文件夾下再單獨創建一個文件夾 mkdir ${target_path} # 限制內存用量大小,單位B。 echo ${limit_memory_byte} > ${target_path}/memory.limit_in_bytes # 對進程進行限制 echo ${pid_num} >> ${target_path}/tasks
所有配置項,如果有多條配置,那么使用換行進行分隔;包括tasks的進程pid也一樣。
cgroups的配置有一定的主動排錯功能,如果配置錯誤會拒絕寫入。比如上邊限制磁盤讀寫速率的配置中,如果你不存在設備號為252:0的設備那么配置寫入會失敗。
cgroups的進程限制有一定的自適應功能。比如你限制了一個進程那么其子進程也會被自動加入到tasks中一起限制,如果一個進程結束那么其pid會被自動移出tasks。
如果考慮不受拘束我們可以按第二大節所說自己實現資源限制,但如果考慮簡單性和健壯性可以直接使用別人寫好的庫;cgroupspy是cgroups配置的python實現。
直接pip安裝即可:
pip install cgroupspy
from cgroupspy import trees pid_num = 1234 resource_item = "memory" group_name = "test_process" limit_memory_byte = 1024000000 # 實例化一個資源樹 t = trees.Tree() # 獲取內存配置對象 memory_limit_obj = t .get_node_by_path("/{0}/".format(resource_item)) # 創建一個test_process組(在實際上,即文件夾) test_process_group = memory_limit_obj.create_cgroup(group_name) # 限制內存用量。相對于實際的文件少了memory前輟 test_process_group.controller.limit_in_bytes = limit_memory_byte # 限制進程 test_process_group.controller.tasks = pid_num
“Python3+cgroupspy怎么安裝使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。