作者:晏澤愛可生售后團隊成員,主要負責公司數據庫運維產品問題診斷;努力在數據庫和 IT 領域里摸爬滾打中。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
本文關鍵字:linux、systemd、資源隔離
一,修改systemd unit file
為了給程序配置資源隔離,通常我們會到cgroup層級樹下的控制器里,創建或者修改控制組文件。在Linux7中,如果為程序配置了systemd服務,除了直接修改控制組文件之外,還可以通過systemd相關命令對程序的資源隔離配置進行修改。
1.1 修改方法
有兩種方法可以對配置了systemd的程序進行資源隔離:
- 命令行修改:通過執行systemctl set-property命令實現,形式為systemctl set-property name parameter=value;修改默認即時生效
- 手工修改文件:直接編輯程序的systemd unit file文件,完成之后需手工執行systemctl daemon-reload更新配置,并重啟服務systemctl restart name.service
systemd unit file里支持的資源隔離配置項,如常見的:
- CPUQuota=value該參數表示服務可以獲取的最大CPU時間,value為百分數形式,高于100%表示可使用1核以上的CPU。與cgroup cpu控制器cpu.cfs_quota_us配置項對應。
- MemoryLimit=value該參數表示服務可以使用的最大內存量,value可以使用K, M, G, T等后綴表示值的大小。與cgroup memory控制器memory.limit_in_bytes配置項對應。完整的配置項列表,請參考官方文檔:2.3.2. Modifying Unit Files
1.2 試驗說明
以MySQL CPU資源管理為例。
環境信息:
- 系統版本:centos Linux release 7.5.1804 (Core)
- CPU配置:4核CPU
當資源限制為1核CPU時(CPUQuota=100%):
修改CPU資源配置為:2核(CPUQuota=200%)
再次測試,可以看到數據庫在寫入數據的過程中,%CPU的值固定在200%左右。
二,簡要原理說明
系統資源在cgroup里體現為資源控制器(resource controller/cgroup subsystem);每個controller以層級目錄結構的方式對系統資源進行管理。systemd在系統開機時,默認自動將cpu、blkio、memory等控制器掛載到/sys/fs/cgroup路徑下。
systemd使用以下三種類型的unit來進行資源管理:
- service:A system service
- slice:A group of hierarchically organized units that manage system process
- scope:An externally created process
其中scope類型只能由程序自動創建;其他兩種可程序自動創建,也可手動創建。系統在啟動的時候將默認創建一系列運行時必要的service,同時也會創建四種必要的slice:
- -.slice — the root slice;
- system.slice — the default place for all system services;
- user.slice — the default place for all user sessions;
- machine.slice — the default place for all virtual machines and Linux containers.
基于此,在Linux 7中,系統通過綁定程序的systemd層級樹路徑和cgroup資源控制器路徑實現資源隔離(可使用命令systemd-cgls直觀查看,見下文圖片),具體表現為:
- 將service unit、scope unit或者slice unit在systemd層級樹里的路徑,與對應的cgroup資源控制器路徑進行匹配
- unit file里有對應資源管理配置參數,直接作用于cgroup對應的資源控制器
因此,通過修改程序的systemd unit file里與資源管理相關的參數,即可達到資源隔離配置的目的。