1. 程式人生 > >cgroups管理程序磁碟io

cgroups管理程序磁碟io

linux 的 cgroups 還可以限制和監控程序的磁碟 io。這個功能通過 blkio 子系統實現。

blkio 子系統裡東西很多。不過大部分都是隻讀的狀態報告,可寫的引數就只有下面這幾個:

複製程式碼程式碼如下:
blkio.throttle.read_bps_device
blkio.throttle.read_iops_device
blkio.throttle.write_bps_device
blkio.throttle.write_iops_device
blkio.weight
blkio.weight_device

這些都是用來控制程序的磁碟 io 的。很明顯地分成兩類,其中帶“throttle”的,顧名思義就是節流閥,將流量限制在某個值下。而“weight”就是分配 io 的權重。

“throttle”的那四個引數看名字就知道是做什麼用的。拿 blkio.throttle.read_bps_device 來限制每秒能讀取的位元組數。先跑點 io 出來

複製程式碼程式碼如下:
dd if=/dev/sda of=/dev/null &
[1] 2750 
用 iotop 看看目前的 io

複製程式碼程式碼如下:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
2750 be/4 root 66.76 M/s 0.00 B/s 0.00 % 68.53 % dd if=/dev/sda of=/dev/null
...

然後修改一下資源限制,把

程序加入控制組

複製程式碼程式碼如下:
echo '8:0 1048576' >/sys/fs/cgroup/blkio/foo/blkio.throttle.read_bps_device
echo 2750 >/sys/fs/cgroup/blkio/foo/tasks
這裡的 8:0 就是對應塊裝置的主裝置號和副裝置號。可以通過 ls -l 裝置檔名檢視。如

複製程式碼程式碼如下:
# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 Oct 24 11:27 /dev/sda
這裡的 8, 0 就是對應的裝置號。所以,cgroups 可以對不同的裝置做不同的限制。然後來看看效果

複製程式碼
程式碼如下:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
2750 be/4 root 989.17 K/s 0.00 B/s 0.00 % 96.22 % dd if=/dev/sda of=/dev/null
...


可見,程序的每秒讀取立馬就降到了 1MB 左右。要解除限制,寫入如 “8:0 0” 到檔案中即可

不過需要注意的是,這種方式對小於取樣間隔裡產生的大量 io 是沒用的。比如,就算在 1s 內產生一個每秒寫入 100M 的峰值,也不會因此被限制掉。

再看看 blkio.weight 。blkio 的 throttle 和 weight 方式和 cpu 子系統的 quota 和 shares 有點像,都是一種是絕對限制,另一種是相對限制,並且在不繁忙的時候可以充分利用資源,權重值的範圍在 10 – 1000 之間。

測試權重方式要麻煩一點。因為不是絕對限制,所以會受到檔案系統快取的影響。如在虛擬機器中測試,要關閉虛機如我用的 VirtualBox 在宿主機上的快取。如要測試讀 io 的效果,先生成兩個幾個 G 的大檔案 /tmp/file_1,/tmp/file_2 ,可以用 dd 搞。然後設定兩個權重

複製程式碼程式碼如下:
# echo 500 >/sys/fs/cgroup/blkio/foo/blkio.weight
# echo 100 >/sys/fs/cgroup/blkio/bar/blkio.weight
測試前清空檔案系統快取,以免干擾測試結果

複製程式碼程式碼如下:
sync
echo 3 >/proc/sys/vm/drop_caches
在這兩個控制組中用 dd 產生 io 測試效果。

複製程式碼程式碼如下:
# cgexec -g "blkio:foo" dd if=/tmp/file_1 of=/dev/null &
[1] 1838
# cgexec -g "blkio:bar" dd if=/tmp/file_2 of=/dev/null &
[2] 1839

還是用 iotop 看看效果

複製程式碼程式碼如下:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1839 be/4 root 48.14 M/s 0.00 B/s 0.00 % 99.21 % dd if=/tmp/file_2 of=/dev/null
1838 be/4 root 223.59 M/s 0.00 B/s 0.00 % 16.44 % dd if=/tmp/file_1 of=/dev/null

引數說明

可設定的引數:

  • blkio.weight
    說明:指定 cgroup 預設可用 IO 的比例(加權),值的範圍為 100 至 1000。該值可由具體裝置的 blkio.weight_device 引數覆蓋。
    示例:設定 cgroup lv0 的預設加權為 500: cgset -r blkio.weight=100 lv0
  • blkio.weight_device
    說明:指定 cgroup 中指定裝置的可用 IO 比例(加權),範圍是 100 至 1000。該值的的格式為 major:minor weight ,其中 major 和 minor 參考文件 Linux 分配的裝置
    示例:設定 cgroup lv0 對 /dev/sda 的加權為 500: cgset -r blkio.weight_device="8:0 500" lv0
  • blkio.throttle.read_bps_device / blkio.throttle.write_bps_device
    說明:指定 cgroup 中某裝置每秒鐘讀/寫資料的位元組上限。其格式為 major:minor bytes_per_second
    示例:設定 cgroup lv0 在 /dev/sdc 上每秒最多讀 10KiB 資料: cgset -r blkio.throttle.read_bps_device="8:32 10240" lv0
  • blkio.throttle.read_iops_device / blkio.throttle.write_iops_device
    說明:指定 cgroup 中某裝置每秒鐘可以執行的讀/寫請求數上限。其格式為major:minor operations_per_second
    示例:設定 cgroup lv0 在 /dev/sdc 上每秒最多執行 1000 次讀請求: cgset -r blkio.throttle.read_iops_device="8:32 1000" lv0

報告引數:

  • blkio.time
    報告 cgroup 對具體裝置的 I/O 訪問時間。條目有三個欄位:majorminor 和timetime 的單位為毫秒(ms)
  • blkio.sectors
    報告 cgroup 對具體裝置的扇區讀寫數。條目有三個欄位:majorminor 和sectors
  • blkio.io_service_bytes
    報告 cgroup 對具體裝置的讀寫位元組數。條目有四個欄位:majorminoroperation和 bytes。其中 operation 表示操作型別,包括 read, write, sync 和 async
  • blkio.io_serviced
    報告 cgroup 對具體裝置的 I/O 運算元。條目有四個欄位:majorminoroperation和 number
  • blkio.io_service_time
    報告 cgroup 對具體裝置的 I/O 操作請求傳送和請求完成之間的時間。條目有四個欄位:majorminoroperation 和 time,其中 time 的單位為納秒(ns)
  • blkio.io_wait_time
    報告 cgroup 對具體裝置的 I/O 操作在佇列中等待的時間。條目有四個欄位:major,minoroperation 和 time,其中 time 的單位為納秒(ns)
  • blkio.io_merged
    報告 cgroup 將 BIOS 請求合併到 I/O 操作請求的次數。條目有兩個欄位:number和 operation
  • blkio.io_queued
    報告 cgroup 為 I/O 操作排隊的請求次數。條目有兩個欄位:number 和 operation
  • blkio.throttle.io_service_bytes
    報告 cgroup 限流對具體裝置的讀寫位元組數。blkio.io_service_bytes 與blkio.throttle.io_service_bytes 的不同之處在於,CFQ 排程請求佇列時,前者不會更新。條目有四個欄位:majorminoroperation 和 bytes
  • blkio.throttle.io_serviced
    報告 cgroup 限流對具體裝置的讀寫運算元。條目有四個欄位:majorminor,operation 和 number
  • blkio.reset_stats
    向該檔案中寫入一個整數,可以重置該 cgroup 中的報告計數。

blkio子系統使用心得

  1. 檢視一個裝置的 major 和 minor 可以使用:ls -l /dev/DEV
    例如,要檢視 /dev/dm-0 的 major 和 minor: ~]# ls -l /dev/dm-0
    brw-rw---- 1 root disk 253, 0 Dec 3 01:02 /dev/dm-0

    其中 253, 0 即為 /dev/dm-0 的 major, minor

  2. blkio.throttle.* 的限制是針對整個 cgroup 組的,而不是針對組中單個程序的。
    例如,當設定 lv0 blkio.throttle.write_bps_device="253:0 1048576" 時,整個 lv0 組內所有程序向 /dev/dm-0 的寫入速率之不能超過 1 MiB/秒。
  3. 經測試,對某個程序的 blkio 限制有可能影響 Cgroup 之外的程序。復現方法:
    /dev/sdb + /dev/sdc 做 flashcache,設定 lv0blkio.throttle.write_bps_device="8:32 1048576" ,即限制 lv0 內的程序對 /dev/sdc 的寫入速率為 1MiB/秒,然後使用 cgexec -g blkio:lv0 dd if=/dev/zero of=/data0/testfile1 bs=10240 count=100000 啟動一個在 lv0 限制下的 dd 向 flashcache 寫檔案。dd 很快便完成,但使用 iostat 觀察,發現 /dev/sdc 的寫入受 cgroup 限制,只有 1MiB/秒。這時我們再直接執行一個 dd: dd if=/dev/zero of=/data0/testfile1 bs=10240 count=100000,再使用 iostat 檢視磁碟 IO 狀態,/dev/sdc 寫入速率仍然是 1MiB/秒,也就是說後面一個 dd 雖不在 cgroup lv0 限制之內,卻也受到了 lv0 限流的影響。
  4. 程序對 pagecache 的讀寫操作不受 blkio.throttle.* 限制。

相關推薦

cgroups管理程序磁碟io

linux 的 cgroups 還可以限制和監控程序的磁碟 io。這個功能通過 blkio 子系統實現。 blkio 子系統裡東西很多。不過大部分都是隻讀的狀態報告,可寫的引數就只有下面這幾個:複製程式碼程式碼如下: blkio.throttle.read_bps_d

Linux檢視某個程序磁碟IO讀寫情況 pidstat

一、現象 1)釘釘告警不斷,告警如下CPU使用達到100% 普羅米修斯監控 2)檢視資料庫,沒有發現比平時同一時段,業務量的增加。但是,資料庫顯示latch free等告警,驗證了CPU使用過高導致。 3)Linux系統  vmstat 1檢視系統負載,發現us、sy很高,加起來達

第五章 裝置管理 使用者層IO軟體 緩衝 磁碟

使用者層的I/O軟體 小部分I/O系統軟體放在了使用者應用層上。 庫函式(與應用程式連結) 假離線技術(虛擬裝置) 1)系統呼叫與庫函式 不允許執行在使用者態的應用程序,去直接呼叫執行在核心態(系統態)的OS過程。 應用程序在執行時,又必須取得OS所提供的服務。 於是: OS在使用者層中

日常運維管理技巧六(檢視磁碟IO效能 iostat)

六、監控io效能(這個是關於磁碟的,磁碟的狀態的兩個命令  iostat    iotop) 在日常運維過程中,除了CPU、記憶體外,磁碟的io也是非常重要的指標。有時候CPU、記憶體明明有剩餘,但系統就是負載很高,我們用vmstat命令檢視會發現b列或wa列比較大

作業系統(6)--IO管理磁碟排程學習筆記

IO緩衝:在輸入請求發出之前就開始執行輸入傳送,並且在輸出請求發出一段時間之後才開始執行輸出傳送,這項技術成為緩衝; 執行IO的裝置物件是: 1、塊裝置,可以隨機訪問,例如硬碟、快閃記憶體等; 2、流裝置,必須順序訪問,例如串列埠和鍵盤; 塊裝置中最小的可定址單位是扇區,一

CentOS針對磁碟IO[jdb2程序]的優化

CentOS的jdb2程序總是沾滿io,查了一些資料後才知道,這個問題源自系統bug,在此記錄一下解決辦法: 將高IO的磁碟,用以下引數remount即可 mount -t ext4 -o rem

使用Makefile去管理程序

管理 編譯 生成 ble 單獨 是什麽 幫助 命令行 file 前言:在gcc中如何使用分屏操作 : 在命令行中使用 : sp + filename vim Makefile 編輯make工程 第一行使用 # 進行

Java程序設計---io流讀取文件內容並將其逆值輸出到控制臺

java 格式 ext buffered import write [] back style import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import ja

【C++ 第六章 個人銀行賬戶管理程序案例】

第六章 實現 || get bool pac inter 一次 days 【第六章】 個人銀行賬戶管理程序 案例實現 1 //第六章完整代碼 2 #include<iostream> 3 #include<cstdlib>

【C++ 第四章 個人銀行賬戶管理程序案例】

with count acc cpp name c++ money 建立 esc 【第四章】 個人銀行賬戶管理程序 案例實現 #include<iostream> #include<cmath> using namespace std; clas

【C++ 第五章 個人銀行賬戶管理程序案例】

family public esp font avi col 程序設計 ++ pan 【第五章】 個人銀行賬戶管理程序 案例實現 //5_11.cpp #include"account.h" #include<iostream> #include"acc

基於rpc的主機管理程序分析

pythonRPC server:import pika import time connection = pika.BlockingConnection(pika.ConnectionParameters( host=‘localhost‘)) channel = connection.

Linux基礎管理—— " 標準IO及重定向及管道 "

輸入輸出重定向 管道 標準輸入 標準錯誤輸入 1、標準輸入和輸出 一般來說程序是由指令+數據組成;那麽就不可避免的要讀入和輸出數據,即input和output。 打開的文件都有一個fd: file descriptor (文件描述符),可以在/proc/$$/fd中查看當前終端打開的文件

類 Fabric 主機管理程序開發

序列 tar true close input div conn add body 類 Fabric 主機管理程序開發:1. 運行程序列出主機組或者主機列表2. 選擇指定主機或主機組3. 選擇讓主機或者主機組執行命令或者向其傳輸文件(上傳/下載4. 充分使用多線程或多進程5

Linux CentOS7系統上 RPM命令管理程序包 基礎知識

RPM的基礎知識安裝 -i升級 -U/-F卸載 -e查詢 -q校驗- V數據庫維護 --buliddb --initdb-v 查看詳細過程-vv 查看更詳細過程安裝時的選項-h 顯示進度條--test 僅測試安裝過程 實際上不安裝--nodeps 忽略依賴關系安裝,不推薦--replacepkgs 重新安裝

rpm管理程序包雜記

rpm linux 命令 基礎 雜記9.3天程序包管理 0.1查看文件格式 [root@CentOS7 ~]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses

Lync Server 命令行管理程序無法打開

Lync PowerShell 管理命令 Lync Server 2013 PowerShell在第一次打開時,有的時候等待很長時間都不能加載Lync模塊。我們可以使用Windows PowerShell 記載Lync Server模塊的方式。 使用管理員身份打開Windows PowerShe

linux調優:按照CPU、記憶體、磁碟IO、網路效能監測

系統優化是一項複雜、繁瑣、長期的工作,優化前需要監測、採集、測試、評估,優化後也需要測試、採集、評估、監測,而且是一個長期和持續的過程,不 是說現在優化了,測試了,以後就可以一勞永逸了,也不是說書本上的優化就適合眼下正在執行的系統,不同的系統、不同的硬體、不同的應用優化的重點也不同、 優化的

KVM總結-KVM效能優化之磁碟IO優化

前面講了KVM CPU(http://blog.csdn.net/dylloveyou/article/details/71169463)、記憶體(http://blog.csdn.net/dylloveyou/article/details/71338378)的優化,下面接著第三塊的內容,KVM磁

linux管理程序的連結串列

  linux2.6.11的核心中,為了方便管理linux的程序,主要建了5種linux連結串列。每個連結串列節點之間的互聯有兩種方式,一種是hash節點之間的互聯,通過hlist_node的資料結構來實現;另一種就是list_head型別的資料結構來互聯。看linux核心的人對這兩種型別的資料結構