玩轉 Cgroup 系列之二:使用 CPUShares 管理 Cgroup
在本系列的第一篇中,我們看到了 Linux 系統管理員視角下的 Cgroup,並瞭解了它如何幫助資源管理和效能調優。
在第二篇中,作者將繼續介紹 CPUShares 以及它如何幫助管理 Cgroup,那麼我們現在開始。
一、Linux I/O 排程
首先,我想用紅帽企業版 Linux(RHEL)來簡單介紹一下 Linux 的 I/O 排程程式。我簡單看了一下實驗室裡的幾臺 Ubuntu 機器,發現它們的 I/O 排程程式有一些相似之處,所以我下面的一些觀點可能也適用於其他發行版本。紅帽系列產品(Fedora、CentOS 和 RHEL)大多數都預設使用
cfq
或
deadline
作為排程程式。
-
CFQ(完全公平佇列演算法):強調 I/O 實時程式,並使用歷史資料來決定應用程式是否會在近期發出更多的 I/O 請求。
-
Deadline(最後期限演算法):嘗試為 I/O 請求提供有保障的延遲,特別適合於讀取操作比寫入操作更頻繁的情況。在 deadline 排程程式中,讀和寫分別有一個佇列,機器根據請求在佇列中等待的時間來決定處理順序。同時,核心會盡力在請求的最大等待時間耗盡之前處理它們。預設情況下,讀操作優先於寫操作處理。
在預設情況下,RHEL 對 SATA 驅動器使用
cfq
排程程式,對其他驅動器使用
deadline
排程程式,以便更好地調優系統。
當然,這些排程程式也是可以更改的,我們可以根據工作負載選擇最適合的排程程式。另外,還可以針對每個塊裝置選擇排程程式。也就是說,在單個系統上可以有多個排程程式,具體取決於磁碟的配置方式。
二、CPUShares 及其用途
CPUShares 為 Cgroup 中的任務分配了相對的 CPU 時間。只要系統掛載了 Cpu Cgroup 控制器,您就可以使用
cpu.shares
檔案來定義分配給 Cgroup 的 CPU 份額。
CPU 時間可以透過 Cgroup 的 CPUShares 值除以系統上定義的總 CPUShares 值來確定。這個 CPU 時間的計算有些複雜,下面我們來看一些例項以便更好地理解。
上圖展示了 RHEL 7 OpenShift 容器平臺控制平面上的一些常見元素。這個系統上的每個程式都從根目錄的
/
Cgroup 開始。
在 RHEL 中,從根目錄的
/
Cgroup 開始,共有 1024 個份額和 100% 的 CPU 資源。剩下的資源被平均分配給
/system.slice
、
/user.slice
和
/kubepod.slice
這些組,每個組預設的權重都是 1024,如下圖所示:
在這種情況下,計算的邏輯很簡單:如果所有 Cgroup 同時要求資源,每個 slice 只能擁有 33% 的 CPUShares。數學計算就是:
代入數字:
然而,如果我們想要巢狀組或更改同一級別組的權重,會發生什麼呢?下面就是一個巢狀組的示例:
可以看到我為不同的使用者建立了一個 Cgroup,然後計算就不一樣了。你可能會這麼計算:
那就錯了。其實該使用者佔到的份額是
user.slice
分配到的 33% 的 23%。也就是說,在資源爭用的情況下,
user1 大約可以佔總 CPU 時間的 7.6%。
因此,CPUShares 的計算其實沒那麼簡單。不過,好訊息是,絕大多數控制器比這裡展示的要更加直觀簡單,所以大可不必擔心。
三、總結
CPUShares 可能會讓 Cgroup 變得非常複雜,這也是我認為有必要在這裡介紹它的一個原因。而如果掌握了 CPUShares 的內在邏輯,且可以正確地使用它的話,能夠極大地幫助您有效、準確地管理系統。
在之後的系列文章中,我還將繼續討論 Cgroup 的管理,以及 systemd 的使用問題。敬請期待哦。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70035809/viewspace-3001829/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 玩轉 Cgroup 系列之三:挑戰手動管理 Cgroup
- 玩轉 Cgroup 系列之一: Cgroup 的起源、重要性和基本工作原理
- linux namespace and cgroupLinuxnamespace
- 使用cgroup 限制程式的磁碟io
- containerd中的cgroupAI
- Docker進階與實踐之一:CgroupDocker
- 探索雲端計算容器底層之Cgroup
- 一篇搞懂容器技術的基石: cgroup
- CGroup 介紹、應用例項及原理描述
- Linux-Cgroup V2 初體驗Linux
- docker容器技術基礎之linux cgroup、namespaceDockerLinuxnamespace
- 【原創】探索雲端計算容器底層之Cgroup
- 多名稱空間結合cgroup保障儲存QoS
- 採用linux cgroup控制redis主從多例項資源LinuxRedis
- 從零開始寫 Docker(十九)---增加 cgroup v2 支援Docker
- Docker技術三大要點:cgroup,namespace和unionFS的理解DockernamespaceNFS
- Docker技術三大要點:cgroup, namespace和unionFS的理解DockernamespaceNFS
- 玩轉大資料系列之二:資料分析與處理大資料
- cgroup、資源池、使用者的關係..涉及到GaussDB(DWS)的資源設定
- 玩轉cordova之二--增強的webviewWebView
- 用 PHP 玩轉程式之二 — 多程式 PHPServerPHPServer
- DirectShow系列講座之二——Filter原理 (轉)Filter
- 教你玩轉Linux—使用者組的管理Linux
- 水木--給Linux新手 [系列之二] (轉)Linux
- 動態質量管理之二(轉載)
- 玩轉供應商管理(轉載)
- 玩轉Android Jetpack系列之ViewModeAndroidJetpackView
- objc系列譯文(9.2):玩轉字串OBJ字串
- Binder面試系列之二面試
- webpack系列之二TapableWeb
- Oracle SQL效能最佳化系列講座之二(轉)OracleSQL
- 玩轉webpack系列之webpack核心概念(一)Web
- [玩轉MySQL之二]MySQL連線機制淺析及運維MySql運維
- 管理觀點系列:團隊管理(轉)
- SQL Server索引優化系列之二:索引效能考慮 (轉)SQLServer索引優化
- 初識vue系列之二Vue
- 你玩轉win8上手指南系列
- 使用Shell.Application技術之二 (轉)APP