找回密码
 注册
关于网站域名变更的通知
查看: 325|回复: 1
打印 上一主题 下一主题

Linux资源管理-IO优先级

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-9-15 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

$ }: @! s& }+ I0 a: Z; ?前一篇介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.
4 ?- J( I& P* m! s! _* o4 ~
9 B7 d- u' S# M6 x前提条件
* ?1 i: x$ J4 Z; I! B+ O+ m' d" R1 G3 B如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.
% T3 F. w2 S. |
9 l' t! q+ t4 C* UCONFIG_BLK_CGROUP=y4 ?  V( z5 O  c3 {
CONFIG_CFQ_GROUP_IOSCHED=y3 m7 _: V  z$ v8 G4 d
查看是否开启这2个内核编译选项的方法很简单:8 N( ]8 o1 u5 ]
, ]1 I# T& M$ R' j+ I
root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`4 K  ^  ^, N5 B. d4 H8 A
root@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`
! n% C3 f+ k4 i7 a" G+ T2 Y& V$ O如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.- g3 g2 r2 w0 h  v% e  v5 {  V

8 k0 T, f! @9 g) G1 e( Q2 L
6 [+ L1 M  k4 a4 [2 Y0 S1 u1 M- P* @' \" p' y- k
再次通过 /proc/cgroups 来查看 blkio 是否已经启用.( q0 V! E, f( K6 w8 n

1 H" `- N9 J* N. \! e6 \4 n* ]复制代码, H' m/ T" ~# ]0 g$ `
root@debian-113:~# cat /proc/cgroups
5 A- r% k% Q; T3 U9 B' u#subsys_name    hierarchy    num_cgroups    enabled* T3 m1 ~) W# L) n
cpuset    0    1    10 a) ]1 `* q. w7 v
cpu    0    1    1
6 y; {0 V1 Y( V9 Dcpuacct    0    1    1
4 h; x) d' p" ~' q2 Gmemory    0    1    1
) n* ^# l/ x- o% Tdevices    0    1    1
8 h- T1 _$ J. [0 z% kfreezer    0    1    1
0 y2 W8 X7 x' D* Vnet_cls    0    1    14 W9 C( m3 {, O1 `3 d
blkio    0    1    1    <-- enabled = 1, 说明已经启用( n! }% T' R7 u+ P1 K" h
peRF_event    0    1    18 A- p- Y, a: K+ b4 W
复制代码
& x- \$ J3 c# T8 E6 g8 m- G4 F如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.* z) M* d0 j; Y3 x' k- _" w% V
4 o' W3 y( y7 d% A( E2 E
类似的可以参考: Linux资源控制-CPU和内存  中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。
' t  b' z1 b! p! j, D+ x) W; Z! x1 w9 U; f6 U: @
& b, @+ E& Y  j4 ]) H

( H, R1 f- G0 X! s' x$ j1 d& c2 t除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.8 e2 }6 F3 y: q& ?9 b/ `. Z
3 H+ |) E3 @7 m  m( }) o) R
root@debian-113:~# cat /sys/class/block/sda/queue/scheduler
) l" n7 |6 y& z% xnoop deadline [cfq]. _. V- ], Y* E5 Z' U6 t
上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.; W4 M+ h; D. g
. ^- G( d4 w; {' ?, j
如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.* u8 ?5 M$ c/ Z! q' s5 h3 g8 R
9 Q! E* E+ |7 y9 j0 N$ b
如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么, G7 z' Y- [- T$ e$ V6 d8 A+ Y
: }; P. A! F) U& |9 }8 }1 ]) U
cat cfq /sys/class/block/sda/queue/scheduler     <-- 将当前的IO调度程序设置成 cfq; b+ B1 j$ z; U: e
注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.
6 Z9 J0 T) S# Z! Z5 @( A; j% @$ e8 [; T3 D, Z9 U2 T3 g0 g& F
- D! y' S7 e& L& j1 Y, d  @
* _2 E, a( I8 g  {, d
实例 - 控制IO优先级
3 R+ [2 ~- z' y, ^! I8 m挂载 cgroup文件系统, 挂载参数 -o blkio
' E: Y# ]) S5 T7 I" f% e( p建立2个group, 分别为 A 和 B3 Q1 c7 \6 x) ^3 J2 M7 Z
默认情况, 2个 group中的dd进程同时进行文件操作
! J$ P, D; N% F  e7 x查看默认情况下, 2个dd进程完成的时间
5 n4 t+ Z4 V, ~0 A& S设置 A 的优先级为 100, B 的优先级为 10005 Y6 D& v4 v8 t- Q
同时在2个group A 和 B 中运行 dd进程. s+ N& Q* C; m  i) \
查看group A 和 B 中的 dd进程完成的时间
6 g! Y( ?7 i2 u5 ~, T3 c+ X
, j( p5 \) M+ {- l% h8 c. I) f% H' \" w, j0 j/ Q$ s
实验之前, 先制作测试脚本. (简单写了一个如下)2 s7 X- O7 w" a6 ]6 t/ s2 H
( f! W2 I; N+ `5 E6 |  Q
复制代码% X5 C  X/ t% ~4 {5 P! y! x
#!/bin/bash
5 C0 ?8 Z2 Q# Z
+ h$ T' b+ C% |4 x####################################################################
  ?& e! Z6 G3 p3 x5 q- F7 D# 1. 创造2个测试文件, 大小都是1G* c. W4 b  A6 ]: |
# 2. 将当前进程加入到指定 cgroup
% U8 w( K! ?4 ]! h1 h# 3. 执行 dd 操作8 R1 g  C7 r% U4 {: G
# 4. 删除 测试文件
" Q/ ^: w" e% W2 J/ l# 5. 显示log
( q5 _" d9 t& J9 }, a+ W####################################################################
! m2 d0 x7 b% Y0 f1 h% E. ^  @1 J( s' n  B6 \* ]- `+ H& Z4 y. c
function usage()% [% u' i) q6 U1 u
{. B+ [9 ^' p4 B; p, W: E, i
    echo "./blkio-test.sh <group1> <group2>"( R) f: n' Z9 _' L' W$ \
    exit 1# N8 N  @% r3 g9 O; s$ S
}% r1 T( v8 I, K9 `+ v, f- `

. H* I/ I& Z! U6 |2 Iif [ $# != 2 ]; then
1 W7 |2 L- B+ w6 _7 s    usage0 |$ Q7 {+ e, r0 m
fi
; C  j  t4 v. k8 x
9 r% ?) {+ \. y- Sgroup1_src=~/group1.src8 M! V% {+ i( p- ?' L* T
group2_src=~/group2.src/ m! g4 ]! I% A9 }8 D

( t* {: r1 m- M% V& S* }8 @group1_log=/tmp/group1.log
: H+ n- q$ r2 }  ?0 m) fgroup2_log=/tmp/group2.log( k3 _& A8 C, i) x4 z% J. f! k% D
, C. c( k% @1 I# N7 ]. l- E3 s
group1=$1
; o6 Q( b1 ^: {group2=$2
# e. a$ ?) V7 n/ k; h4 D, F7 H
- O: W* {9 C, K/ D2 t/ xecho "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
5 ?; j! H6 b% Z  T. I* ndd if=/dev/zero of=$group1_src count=1024 bs=1M1 Q  U  d4 e1 Z
dd if=/dev/zero of=$group2_src count=1024 bs=1M
  @+ z/ ~: E. H2 {. B! D9 S: k  U4 h- v3 V; v. N% W: A
echo "同时在 $group1 和 $group2 中开始 dd 测试"
( o3 T7 s7 C7 m% U2 Pecho 3 > /proc/sys/vm/drop_caches* }# e! R: K5 O- ?' V
echo $$ >> $group1/tasks
; H3 i& s+ q9 V* J- O" l(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &! t. [' _$ ^( |
0 ~: X0 E. E4 W% [3 @
echo $$ >> $group2/tasks6 e' w3 g: n; _2 Z5 ~
(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &, d' P4 l) Z, C5 \

: y+ R1 l$ Y; ?. {* B6 m- C- Rwait
; _6 [! V* [0 h9 s6 r7 secho "测试完成!"3 l. c  u1 B# `& W. }

* G4 ~: q) G3 B* \( Vecho "开始清除测试文件"
% v% [8 ^" d* E8 t! J* c& k' Xrm -rf $group1_src $group2_src4 \* W# R. r5 A& w
echo "测试文件清除完成"
  B5 y# K; ^1 q: y" R4 v3 _; M: U
9 w1 n2 Z2 M: m4 a; o' Becho "------------------------------------------"
& T9 A# H. R- B3 W! g( R' ~0 Uecho "显示group1 的log"4 Q+ F1 b, v' p
cat $group1_log( R' y: Z! S& z) x( P4 l
5 B" T) F% I1 u8 l
echo "------------------------------------------"4 C% Q& X& @" H( i  s
echo "显示group2 的log"0 u/ `+ I, u  @
cat $group2_log
; }! x; J0 p+ k7 L
1 O; T6 N3 _7 Q! Jecho "------------------------------------------"
8 v9 O+ c3 T- k9 G复制代码; m  C/ I& H+ G
0 d' _' d5 T8 ^% q  @

1 L, W) P/ v  e# @5 Y% O, ]3 s开始实验:
$ ]* ~, G" D* I) t2 d7 L: l/ t( X% t. {$ l6 e+ u+ ?1 X* P( u
复制代码
5 J' H1 A2 l% c' d9 [4 G5 [# 挂载 cgroup 文件系统
2 U: Z$ Z) S5 X: O8 B( L" broot@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup// v! y8 m0 K0 |( M( r
7 y3 a4 d# V: |" ~1 {
root@debian-113:~# mkdir /mnt/cgroup/{A,B}
8 N) f4 ~2 k& s- s9 ]) n2 jroot@debian-113:~# ll /mnt/cgroup/( Y( G; c8 C! f) r1 u
total 0' m- {% Q' x  h% I% ]0 t- Y* E3 ^4 T
drwxr-xr-x 2 root root 0 Sep  5 13:23 A
! Z1 C3 z8 _' e* ]( S7 [drwxr-xr-x 2 root root 0 Sep  5 13:23 B# l2 C) H: d# [0 w# g4 I
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_merged8 c0 h( i& C" s. D$ c" R( X+ |
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_queued+ W7 f7 @; C, r
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_bytes
0 B2 ?5 e, L6 @1 S+ T-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_serviced' |$ a+ P1 ^3 P
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_time8 ?$ W: a! C; C9 u" _
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_wait_time
; p% b8 V. U5 B% y% y--w------- 1 root root 0 Sep  5 13:23 blkio.reset_stats2 @# m( V) q9 r( j
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.sectors
' W# x0 c' ]4 I) G-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.time3 V( O1 [* F5 K* Z2 C; F2 m
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight   <-- 这个就是设置IO优先级的文件9 `* N+ f; y" E* q0 n+ K1 W2 M
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight_device, {7 V6 |1 S: {1 {
-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.clone_children
$ Y$ W0 C2 Z( e" j; O0 e: ^7 T--w--w--w- 1 root root 0 Sep  5 13:23 cgroup.event_control6 R4 P) x9 ?: k5 p  f- P
-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.procs  r- u: Q' S/ B! ^( b
-rw-r--r-- 1 root root 0 Sep  5 13:23 notify_on_release  _& L8 [- e- J# a% l/ f  f# i
-rw-r--r-- 1 root root 0 Sep  5 13:23 release_agent$ i2 x' @5 E. e
-rw-r--r-- 1 root root 0 Sep  5 13:23 tasks+ b( g' e/ H4 N) A# E
- E2 Z2 `; V/ U! J2 x2 z# }
# 默认2个组内的IO优先级都是500
4 k. s( t- i( N  o* Broot@debian-113:~# cat /mnt/cgroup/A/blkio.weight
% P" M2 ?0 n* ~5 Q* o500  <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高) l5 z6 W. m% L) E& ?4 m
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight4 [% ?/ }, `$ \; V4 k. i2 T0 s
500$ i9 c7 `& x7 ]: T7 e/ f
# s* G4 ?# U8 z
# 默认情况下的测试结果如下: A和B耗时都是 20秒! d" U2 e( `8 f# G5 Q6 |9 S
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B' I4 a4 E+ j: x. w* ]" @
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
. D7 y: j' z6 P7 e1024+0 records in) _# {0 J. E- M# u# d0 O
1024+0 records out+ d% ^& }2 T' ^: m' J' b3 ]
1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s
- d( E- R) K# W5 Y' h5 A0 p; f1024+0 records in! T% i! P0 {- t0 [8 g7 ^
1024+0 records out. k! f! L1 V2 M* ^9 ?2 ?# P
1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s1 i" I6 L  b; a: m) [0 ?0 [' X
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
0 G" g0 S$ e9 E  b; x测试完成!5 }2 T# O8 m; e' C
开始清除测试文件
% ~% G1 j0 \4 ?) E测试文件清除完成4 r3 W- h8 D$ X4 F9 w
------------------------------------------% v5 t! h: V4 T& d" D0 m! {
显示group1 的log; _' J7 u- U$ d4 L3 n1 J
Fri Sep  5 13:26:31 CST 2014
% |6 I' C4 K& o3 I+ s+ F4 `% V2097152+0 records in+ v& E* V' m6 P
2097152+0 records out7 G2 s% E+ x; F; R1 P! D
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
. y8 H$ f& ]2 g8 P7 cFri Sep  5 13:26:51 CST 2014
+ \9 x/ M! K% O, }; U, W------------------------------------------7 }& V- U, N( @% e% F
显示group2 的log
2 W0 _$ p8 ~8 K6 H6 E( v, G, t( j8 VFri Sep  5 13:26:31 CST 2014
1 {# S. R8 @; `# l) @; X2097152+0 records in7 H- f2 T7 ^' e6 P: ~6 J& K
2097152+0 records out
2 R$ b  @+ {6 |# o, |  O5 `, y1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s; b, ]/ x& b' H! q- n1 q( f
Fri Sep  5 13:26:51 CST 2014
  f: C( M* K! h* B, P2 Q) g------------------------------------------1 J" a, n! t0 |- q, k$ I

9 [6 y$ M  R8 T# 修改A的优先级为100, B的优先级为1000) d# i; u  S& Z4 [8 U" a! L* m
root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight
" V5 G& n4 U/ S( i3 n+ t) B! `2 jroot@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight/ p) `3 v' X' A: s
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
$ n) }& G. C2 s; G6 w$ K# @8 g# Z6 t100
1 o* S0 j" \, W% `root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
7 a. A5 U2 s. p! m" h3 ^1000
) F4 d* `4 g( z0 f
  q% k' z8 K! `+ H# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒( m; _" S$ [( A! e6 A
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
* d' i. i; m( H6 o9 Z生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
- o& C  e3 e$ [) Y% k# ~6 ?' ]! H1024+0 records in% |6 _% l  U+ W7 W
1024+0 records out, w& e" e% P/ P9 a6 O: h9 C
1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s0 U/ r/ L0 i! A  F' z: R# F
1024+0 records in
  @. h1 t0 r* {0 M' E6 Z1024+0 records out
0 A( N$ _1 r( [9 x1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s
- p1 S4 J7 C  ?& ^  m同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
  ?# ]: t0 M1 Y测试完成!
% R3 v" Q( M9 k, V; v; Z5 M9 _开始清除测试文件9 ^+ ^- Y: }% J& N8 Q
测试文件清除完成% i2 H9 f/ F( \1 c  J& @
------------------------------------------
. f2 T3 n6 \$ Y8 K4 |显示group1 的log, @8 S6 X. a/ J/ u4 x
Fri Sep  5 13:30:06 CST 20144 p9 x' R0 G* O- G
2097152+0 records in' Z7 s+ t" d+ O0 R: D- I
2097152+0 records out
+ \+ D. J6 R2 r/ J: ^2 B' k1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s; c  L  f) N' }
Fri Sep  5 13:30:25 CST 2014- N% X& [# p1 j9 _, r# s- U$ J4 b
------------------------------------------
7 M/ l# [: U0 g显示group2 的log
) p* _* ?# a/ X, Q5 O9 E! SFri Sep  5 13:30:06 CST 2014
6 P  x9 e' L/ Q2097152+0 records in; [8 F4 O) I5 C4 y
2097152+0 records out5 n  w* d8 }. `& @1 b" `* I9 ]
1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s0 O- i+ @" S; n8 c
Fri Sep  5 13:30:17 CST 2014/ q4 r1 `4 u6 N+ l" ^; u
------------------------------------------
' k: I3 |8 v% a$ d复制代码+ F8 a( {9 s3 C

9 C) J9 f# p; V# a2 g
  b$ g  f  ~* W: w可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.! U% o# n+ e# L0 ^: P) I2 G# Z
9 H1 ]! P* c4 `3 Q' x

: T$ G5 o2 s$ }5 z2 {- m% o& y7 C; l0 R( S' X9 W
总结
) j7 B8 p- s! s其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件., h& x9 A  Y, C5 P; n$ g2 r2 l7 r

" ~, z- _1 _! e/ _! Q( z4 [各个文件的具体含义, 请参考更详细的 cgroup 相关文档.

该用户从未签到

2#
发表于 2020-9-15 15:59 | 只看该作者
Linux资源管理-IO优先级
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:12 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表