Linux Cgroup v1(中文翻譯)(4):Block IO Controller

来源:https://www.cnblogs.com/aosp/archive/2022/06/10/16359379.html
-Advertisement-
Play Games

Block IO Controller 1 概覽 cgroup子系統blkio實現了block io控制器。無論是對存儲結構上的葉子節點和還是中間節點,它對各種IO控制策略(proportional BW, max BW)都是必須的。設計規劃就是使用同樣的cgroup,基於blkio控制器的管理介面 ...


Block IO Controller

1 概覽

cgroup子系統blkio實現了block io控制器。無論是對存儲結構上的葉子節點和還是中間節點,它對各種IO控制策略(proportional BW, max BW)都是必須的。設計規劃就是使用同樣的cgroup,基於blkio控制器的管理介面和後臺的用戶選項來切換IO策略。

IO控制策略就是節流閥門策略,能用來規定設備上的較上層IO速度限制。這個策略在通用塊層實現,能被用在葉子節點和較高層的邏輯設備(像設備映射器device mapper)上。

2 如何控制限制策略

使能Block IO控制器:

CONFIG_BLK_CGROUP=y

在塊層使能節流閥門控制:

CONFIG_BLK_DEV_THROTTLING=y

掛載blkio控制器(參考Control Groups,為什麼需要cgroups):

mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

為根分組(root group)上的特定設備規定帶寬速率,策略格式是“: <bytes_per_second>”:

echo "8:16  1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device

這將限制根分組下主次設備號8:16的設備讀取速率為1MB/秒。

運行dd命令來讀取文件,看看是否速率被控制在1MB/s:

# dd iflag=direct if=/mnt/common/zerofile of=/dev/null bs=4K count=1024
1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s

寫入限制使用blkio.throttle.write_bps_device來控制。

3 分層的cgroups

節流閥門實現了分層支持。然而分層結構的支持是由cgroup的sane_behavior來使能的,而它是一個開發選項而不是公共可用選項。

如果創建這樣一個分層結構:

   root
   /  \
 test1 test2
   |
 test3

有"sane_behavior"的節流閥門能正確地處理結構。應用到整個子樹(統計本地IO的)的所有的閥門限制直接由該cgroup中的任務生成。

沒有“sane_behavior”使能的節流閥門幾乎把所有分組當作同級對待,它看起來是這樣的:

        pivot
     /  /   \  \
root  test1 test2  test3

4 用戶可見的配置項

CONFIG_BLK_CGROUP
Block IO controller.

CONFIG_BFQ_CGROUP_DEBUG
調試幫助。使能該選型,有一些額外的統計文件出現在cgroup。

CONFIG_BLK_DEV_THROTTLING
在塊層使能塊設備節流閥門。

5 cgroup文件詳情

5.1 比重策略文件

blkio.bfq.weight
規定每個cgroup權重。所有設備上的分組權重都是預設值,除非被blkio.bfq.weight_device更改。
當前允許的權重範圍1~1000。更多詳情請參看BFQ(Budget Fair Queueing)。

blkio.bfq.weight_device
規定每個設備上每個cgroup的權重,會覆蓋預設的分組權重。格式如下:

# echo dev_maj:dev_minor weight > blkio.bfq.weight_device

在該cgroup內的設備/dev/sdb(8:16)上配置權重300:

# echo 8:16 300 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev     weight
8:16    300

在該cgroup內的設備/dev/sda(8:0)上配置權重500:

# echo 8:0 500 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev     weight
8:0     500
8:16    300

移除為/dev/sda規定的權重:

# echo 8:0 0 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev     weight
8:16    300

blkio.time
每個設備上分配給cgroup的磁碟時間(毫秒)。頭兩個域定義了主次設備號,第三個域定義了分配給分組的磁碟時間(毫秒)。

blkio.sectors
被分組遷入或者移出磁碟的sector數量。頭兩個域定義了主次設備號,第三個域定義了遷入或者移出磁碟的sector數量。

blkio.io_service_bytes
被分組遷入或者移出磁碟的位元組數量。它按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了位元組數量。

blkio.io_serviced
被分組發給磁碟的IO(bio)數量。它按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了IO數量。

blkio.io_service_time
在cgroup內請求發送和請求完成的IO時間總量,以納秒為時間單位。對隊列深度(queue depth)為1的設備,這個時間表示實際服務時間。如果queue_depth>1, 這個請求可能會出現服務故障。這可能使得給定IO的服務時間包含了多個IO的服務時間,導致總的io_service_time大於實際已用時間。這個時間按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了io_service_time納秒。

blkio.io_wait_time
cgroup里耗費在調度器隊列內等待服務的IO時間總量(納秒)。這個時間可能大於總的已用時間,因為它累加了所有IO的io_wait_time。它不是cgroup等待時間總量的估量,而是單個wait_time的估量。對queue_depth>1的設備,這個度量不包括IO被派發給設備但它實際上還沒被服務到的等待服務的時間(可能由於設備對請求的重新排序而有時滯)。這個時間按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了io_wait_time納秒。

blkio.io_merged
cgroup內的bio請求總量。它按操作類型(讀或寫,同步或非同步)細分。

blkio.io_queued
cgroup內任意給定時刻的排隊請求總量。它按操作類型(讀或寫,同步或非同步)細分。

blkio.avg_queue_size
調試目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能。整個cgroup生存期內的平均隊列大小。這個cgroup內其中一個隊列每次獲取到時間片(timeslice),隊列大小採樣就進行一次。

blkio.group_wait_time
調試目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能。cgroup從它變忙(請求隊列從0變為1)到其中一個隊列獲取到時間片而必須等待的時間數量。它不同於io_wait_time,這個是納秒單位的。cgroup在等待(waiting)狀態時讀取,這個統計僅報告累計到它最後一次獲取到時間片的group_wait_time,不包括當前delta增量。

blkio.empty_time
調試目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能。cgroup沒有被服務也沒有等待請求的時間數量(納秒)。它不包含cgroup內任何一個隊的空閑何時間。cgroup在空(empty)狀態時讀取。這個統計將只報告累計到它最後一次有等待請求的empty_time,不包括當前delta增量。

blkio.idle_time
調試目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能。IO調度器花在期待更好的請求而不是現存的請求上的空閑時間數量(納秒)。cgroup在空閑(idling)狀態時讀取,這個統計將只報告累加到最後一個空閑周期的idle_time,,不包括當前delta增量。

blkio.dequeue
調試目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能。這個統計cgroup從設備服務樹出隊(dequeue)多少次。頭兩個域定義了主次設備號,第三個域定義了從特定設備出隊的次數,第四個域定義了io_wait_time納秒。

blkio.*_recursive
各種統計的遞歸版本。這個文件跟他們的非遞歸版本對應部分顯示的信息相同,但是多包含了所有派生cgroup的統計數據。

5.2 限制策略文件

blkio.throttle.read_bps_device
規定了設備讀取速率的上層限制(位元組/秒)。這個規則是針對設備的,格式如下:

echo "<major>:<minor>  <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device

blkio.throttle.write_bps_device
規定了設備寫入速率的上層限制(位元組/秒)。這個規則是針對設備的,格式如下:

echo "<major>:<minor>  <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device

blkio.throttle.read_iops_device
規定了設備讀取速率的上層限制(IO/秒)。這個規則是針對設備的,格式如下:

echo "<major>:<minor>  <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device

blkio.throttle.write_iops_device
規定了設備寫入速率的上層限制(IO/秒)。這個規則是針對設備的,格式如下:

echo "<major>:<minor>  <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device

註意:如果設備上BW和IOPS規則都被定義了,那麼IO受兩種規則的限制。

blkio.throttle.io_serviced
派發給分組內磁碟的IO(bio)數量。它又按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了IO數量。

blkio.throttle.io_service_bytes
被分組遷入或者移出磁碟的位元組數量。它又按操作類型(讀或寫,同步或非同步)細分。頭兩個域定義了主次設備號,第三個域定義了操作類型,第四個域定義了位元組數量。

5.3 多種策略間的公共文件

blkio.reset_stats
寫入整型數會重置cgroup所有統計數據。


英文原文:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/blkio-controller.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個工作了3年的粉絲,去一個互聯網公司面試,結果被面試官懟了。 面試官說:”這麼簡單的問題你都不知道? 沒法聊了,回去等通知吧“。 這個問題是: ”什麼是可重入鎖,以及它的作用是什麼?“ 對於這個問題,來看看普通人和高手的回答吧 普通人: 嗯。。。。。。。。。。。。。。。。。。 高手: 好的。 可重 ...
  • JDBC概述 JDBC(Java Data Base Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。是Java訪問資料庫的標準規範。 JDBC提供了一種基準,據此可以構建更高級的工 ...
  • 手把手教你使用 Spring Boot 3 開發上線一個前後端分離的生產級系統(一) - 介紹 手把手教你使用 Spring Boot 3 開發上線一個前後端分離的生產級系統(二) - 資料庫設計 手把手教你使用 Spring Boot 3 開發上線一個前後端分離的生產級系統(三) - 項目初始化 ...
  • 來源:cnblogs.com/lwtyyds/p/15678152.html 常用類概述 內部類 Object類 包裝類 數學類 時間類 字元串 String Builder和StringBuffer DecimalFormat 內部類 「概念」 :在一個類內部再定義一個完整的類。 一般情況下類與類 ...
  • 0. 文章目的 面向有一定基礎的C#初學者,介紹C#中介面的意義、使用以及特點。 1. 閱讀基礎 瞭解C#基本語法(如定義一個類、繼承一個類) 理解OOP中的基本概念(如繼承,多態) 2. 什麼是介面 2.1 現實中的協定與介面 貓貓頭在整理電腦文件,需要一個小工具來分類文件,於是貓貓頭向群里求助: ...
  • 好久沒到園子裡面逛了,回來看了看,.NET有點式微呀?Java/Spring/Linux……比以前多了很多,為什麼?博客園可是.NET的大本營了呀! 好吧,我承認,飛哥也動搖了,去年在ASP.NET的基礎上,開了一期Java Web班。給大家彙報一下心得體會吧: 錄課程前 其實我最開始學(2008年 ...
  • 【SignalR全套系列】之在.Net Core 中實現SignalR實時通信 ...
  • Cgroup Freezer cgroup freezer對於批量啟動和停止任務集合的任務管理系統來說是很有用的,這個程式經常被用在HPC族上來調度訪問。cgroup freezer使用cgroups來描述被批處理任務管理系統啟動和停止的任務集合。他也提供了方法來啟動和停止任務。 cgroup fr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...