Python3+cgroupspy安裝使用簡介
一、系統(tǒng)資源使用限制的必要性探討
對(duì)于一個(gè)腳本,最基礎(chǔ)的限制是要限制單進(jìn)程實(shí)例以保證了不會(huì)存在多個(gè)進(jìn)程實(shí)例、在運(yùn)行程序主體邏輯前檢測系統(tǒng)資源剩余量確保自己不是壓夸系統(tǒng)的最后一根稻草、設(shè)置程序運(yùn)行超時(shí)時(shí)間以保證進(jìn)程實(shí)例不會(huì)無休止地運(yùn)行下去。
進(jìn)一步,在部署有可用性要求較高的服務(wù)的主機(jī)中,我們還需要關(guān)注腳本運(yùn)行期間占用的系統(tǒng)資源的問題,我們需要一種途徑限制腳本對(duì)cpu、內(nèi)存、io等系統(tǒng)資源的用量,以防止腳本對(duì)這些關(guān)鍵服務(wù)造成影響。
二、cgroups簡介
2.1背影簡介
cgroups是Control groups的簡稱,是Linux內(nèi)核提供的一種限制進(jìn)程使用和種系統(tǒng)資源的特性。
最早的cgroups來自于谷歌工程師Paul Menage和Rohit Seth開發(fā)的“處理容器”特性,他們的工作在2008年布的Linux2.6.24版本被集成,此亦即所謂的cgroupsV1版本。
在此之后各種不同的特性被添加到cgroups之上,在豐富cgroups功能的同時(shí),也使其出現(xiàn)復(fù)雜化和不一致的問題?;诖嗽?,Tejun Heo對(duì)cgroups進(jìn)行了重寫此即cgroupsV2,在Linux 3.10開始被集成在Linux 4.5正式發(fā)布。
在預(yù)期上V2是V1的替代,但為了兼容兩者可以同時(shí)存在。在后邊的介紹中沒有特別說明指的都是cgroupsV2。
2.2使用簡介
在表現(xiàn)形式上,cgroups是一個(gè)文件系統(tǒng),通常是掛載在/sys/fs/cgroup目錄下,可以使用df -h直接查看

該目錄下的每一個(gè)子文件夾就代表一種資源,要限制該項(xiàng)資源就在相應(yīng)的文件夾下進(jìn)行配置。
比如限制cpu就在cpu,cpuacct文件夾下進(jìn)行配置、限制io就在blkio文件夾下進(jìn)行配置、限制內(nèi)存就在memory文件夾下進(jìn)行配置。

在文件夾下的每個(gè)文件就是該項(xiàng)資源的一個(gè)指標(biāo),對(duì)各指標(biāo)進(jìn)行配置,最后在tasks中寫入想要限制的目標(biāo)進(jìn)程的pid,linux內(nèi)核即會(huì)按配置對(duì)這個(gè)進(jìn)程進(jìn)行限制。

但我們可能會(huì)想對(duì)不同的進(jìn)程進(jìn)行不同的限制,這是一個(gè)普遍的需求。所以我們一般不直接修改各資源文件夾下的文件,而是在資源文件夾下為我們的目標(biāo)進(jìn)程單獨(dú)創(chuàng)建一個(gè)文件夾,但使用mkdir創(chuàng)建文件夾時(shí)系統(tǒng)會(huì)自動(dòng)在該文件夾下生成各資源指標(biāo)的配置文件。而要?jiǎng)h除時(shí),直接使用rmdir刪除文件夾即可。

2.3配置實(shí)現(xiàn)示例
示例一,限制pid為1234的進(jìn)程最多只能使用一個(gè)核的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配置文件夾下再單獨(dú)創(chuàng)建一個(gè)文件夾
mkdir ${target_path}
# 設(shè)置時(shí)段長度,單位微秒。這里設(shè)置成1000000微秒,即1秒
echo 1000000 > ${target_path}/cpu.cfs_period_us
# 設(shè)置在該時(shí)間段內(nèi)最多能使用的時(shí)間,單位微秒。這里設(shè)置成900000,即0.9秒。
# 當(dāng)cpu.cfs_quota_us比cpu.cfs_period_us大時(shí)表示可以使用多個(gè)cpu核
echo 900000 > ${target_path}/cpu.cfs_quota_us
# 對(duì)進(jìn)程進(jìn)行限制
echo ${pid_num} >> ${target_path}/tasks示例二,限制pid為1234的進(jìn)程對(duì)設(shè)備號(hào)為252:0的磁盤的讀寫速度最高都只能為5M
pid_num=1234
# 這里設(shè)備號(hào)是給定的,可使用lsblk查看自己磁盤的設(shè)備號(hào)
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配置文件夾下再單獨(dú)創(chuàng)建一個(gè)文件夾
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
# 對(duì)進(jìn)程進(jìn)行限制
echo ${pid_num} >> ${target_path}/tasks示例三,限制pid為1234的進(jìn)程最多只能使用1G的內(nèi)存
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配置文件夾下再單獨(dú)創(chuàng)建一個(gè)文件夾
mkdir ${target_path}
# 限制內(nèi)存用量大小,單位B。
echo ${limit_memory_byte} > ${target_path}/memory.limit_in_bytes
# 對(duì)進(jìn)程進(jìn)行限制
echo ${pid_num} >> ${target_path}/tasks2.4關(guān)于配置的一些說明
所有配置項(xiàng),如果有多條配置,那么使用換行進(jìn)行分隔;包括tasks的進(jìn)程pid也一樣。
cgroups的配置有一定的主動(dòng)排錯(cuò)功能,如果配置錯(cuò)誤會(huì)拒絕寫入。比如上邊限制磁盤讀寫速率的配置中,如果你不存在設(shè)備號(hào)為252:0的設(shè)備那么配置寫入會(huì)失敗。
cgroups的進(jìn)程限制有一定的自適應(yīng)功能。比如你限制了一個(gè)進(jìn)程那么其子進(jìn)程也會(huì)被自動(dòng)加入到tasks中一起限制,如果一個(gè)進(jìn)程結(jié)束那么其pid會(huì)被自動(dòng)移出tasks。
三、cgroupspy安裝使用
如果考慮不受拘束我們可以按第二大節(jié)所說自己實(shí)現(xiàn)資源限制,但如果考慮簡單性和健壯性可以直接使用別人寫好的庫;cgroupspy是cgroups配置的python實(shí)現(xiàn)。
項(xiàng)目主頁:https://github.com/cloudsigma/cgroupspy
3.1安裝
直接pip安裝即可:
pip install cgroupspy
3.2使用示例(以限制內(nèi)存為例)
from cgroupspy import trees
pid_num = 1234
resource_item = "memory"
group_name = "test_process"
limit_memory_byte = 1024000000
# 實(shí)例化一個(gè)資源樹
t = trees.Tree()
# 獲取內(nèi)存配置對(duì)象
memory_limit_obj = t .get_node_by_path("/{0}/".format(resource_item))
# 創(chuàng)建一個(gè)test_process組(在實(shí)際上,即文件夾)
test_process_group = memory_limit_obj.create_cgroup(group_name)
# 限制內(nèi)存用量。相對(duì)于實(shí)際的文件少了memory前輟
test_process_group.controller.limit_in_bytes = limit_memory_byte
# 限制進(jìn)程
test_process_group.controller.tasks = pid_num參考:
https://en.wikipedia.org/wiki/Cgroups
https://man7.org/linux/man-pages/man7/cgroups.7.html
到此這篇關(guān)于Python3+cgroupspy安裝使用教程的文章就介紹到這了,更多相關(guān)Python3 cgroupspy安裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼及驗(yàn)證碼的動(dòng)態(tài)刷新實(shí)例
在本篇文章里小編給大家整理的是關(guān)于python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼的相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-10-10
Python實(shí)現(xiàn)遍歷目錄的兩張方法總結(jié)
我們有時(shí)想直接查看文件夾里的所有文件,但使用正常的方法太麻煩了,于是本文開發(fā)出了兩個(gè)python程序,可以遍歷目錄,有需要的小伙伴可以參考下2024-02-02
python GUI庫圖形界面開發(fā)之PyQt5 Qt Designer工具(Qt設(shè)計(jì)師)詳細(xì)使用方法及Designer
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5 Qt Designer工具(Qt設(shè)計(jì)師)詳細(xì)使用方法及Designer ui文件轉(zhuǎn)py文件方法,需要的朋友可以參考下2020-02-02
如何基于python實(shí)現(xiàn)畫不同品種的櫻花樹
這篇文章主要介紹了如何基于python實(shí)現(xiàn)畫不同品種的櫻花樹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python PyWebIO提升團(tuán)隊(duì)效率使用介紹
這篇文章主要為大家介紹了Python PyWebIO提升團(tuán)隊(duì)效率使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
python中tkinter實(shí)現(xiàn)GUI程序三個(gè)實(shí)例教程
Python提供了多個(gè)GUI庫,使開發(fā)人員能夠輕松創(chuàng)建各種交互式界面,這篇文章主要給大家介紹了關(guān)于python中tkinter實(shí)現(xiàn)GUI程序的三個(gè)實(shí)例教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
Python流行ORM框架sqlalchemy安裝與使用教程
這篇文章主要介紹了Python流行ORM框架sqlalchemy安裝與使用,結(jié)合具體實(shí)例形式分析了sqlalchemy的安裝及ORM映射、查詢等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06

