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

Linux资源管理-IO优先级

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

* J6 v- T- i& j7 G+ }前一篇介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法./ U' [( ~# v: F) {6 y& ?8 K
9 M# e8 k6 ^8 }) N0 B5 z
前提条件4 ^0 |0 g4 H' l9 @4 f3 \
如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.# F+ B5 l9 P7 k$ `
! S: C8 Q0 l# G
CONFIG_BLK_CGROUP=y$ V4 F8 I6 U3 L* w
CONFIG_CFQ_GROUP_IOSCHED=y
+ M/ d& g8 `1 m% x0 I- z7 }+ _查看是否开启这2个内核编译选项的方法很简单:
3 q* ]: Z# S# k" `3 Y+ h2 J/ |# Z0 u% ~9 y3 G* Q+ L
root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`
9 ?, T6 \0 l; L# I5 qroot@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`
( W2 j7 V% V6 B3 F" c如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.( L, _( w( a8 w1 c; Z+ ~# D6 |

0 |4 ^% J' J' g, R  D
  e! q" M$ W) E; V( c8 W+ Q: Y, _; d& l  P7 d" k  J
再次通过 /proc/cgroups 来查看 blkio 是否已经启用.
& |3 }8 Z; T, L, b* ~6 U- L
# ?) u8 M) F8 O) O7 a8 v7 |7 q+ |% B% n复制代码
2 Z' K0 @* x, ~' B9 froot@debian-113:~# cat /proc/cgroups
0 R: |% m3 A3 Z- q) e% {#subsys_name    hierarchy    num_cgroups    enabled
" A* r% K# }6 D! p! v) o( q+ P8 {cpuset    0    1    1
& `( f+ y. Z) b+ vcpu    0    1    1
. N/ h7 d. Q9 D" i+ y& r7 dcpuacct    0    1    15 n6 F2 a: [! W, |6 t& Q
memory    0    1    1( x0 ?9 G$ z7 T. F/ \  J3 W4 X: u
devices    0    1    1
# x/ c" ]/ h4 }% Ffreezer    0    1    1
  ]8 j- K3 `2 ynet_cls    0    1    1
3 g( m4 C6 I$ cblkio    0    1    1    <-- enabled = 1, 说明已经启用
- z9 ?4 E2 k3 Z5 mpeRF_event    0    1    1/ i& f  E1 v- Z; Q  I
复制代码
5 B( `( H! e! y" k如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.6 s, q1 d4 ~3 R  A4 `) L: e, r/ D

- i# f# e# p4 h% ?" E- e类似的可以参考: Linux资源控制-CPU和内存  中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。
" ~4 N& k" w- [+ \
: k% n7 d1 N5 ^1 g$ H4 |, _ . \9 ]' E( Y* R+ @2 f/ m" |! G

* J: l' G% X- G8 \; x% h除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.; b! \: H& h" h5 Z/ k$ o3 \& A

: C! h5 a) ?) Vroot@debian-113:~# cat /sys/class/block/sda/queue/scheduler
& H+ W# _1 v9 J5 w' L% ]' I4 H& c) dnoop deadline [cfq]
! A0 ?1 F3 g8 v' Z% K上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.
( C9 G; h- i8 l, `8 `* e; S: K7 E, ?. f
如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.
6 p+ ~4 _( o3 C! C% k4 w
& z& S3 X  Z- Z& R. d$ N如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么
6 }  _1 r0 b  o% h4 M& v$ {6 e" c" W# j
cat cfq /sys/class/block/sda/queue/scheduler     <-- 将当前的IO调度程序设置成 cfq
# f2 x7 b7 O2 |  n4 u注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.
  m) k  |. H& g5 U; y7 E6 x. n& ~3 z' J0 @
7 j" G: ]) E2 R. W
8 m6 A# O: [, V: w, }( ?
实例 - 控制IO优先级: M4 K2 S; v. T3 \3 c
挂载 cgroup文件系统, 挂载参数 -o blkio  f& Y4 T3 n7 ~* L, K
建立2个group, 分别为 A 和 B; t5 c3 v1 t& v7 L# W. M8 p6 c
默认情况, 2个 group中的dd进程同时进行文件操作9 Q' P. z. F+ V
查看默认情况下, 2个dd进程完成的时间& K0 G% {2 ]+ w% D
设置 A 的优先级为 100, B 的优先级为 1000
, C8 z% O; @+ Z( W: @同时在2个group A 和 B 中运行 dd进程/ B5 \  W! s- ]% d% h
查看group A 和 B 中的 dd进程完成的时间
) }4 e& N: M: t
" c$ X5 ^" [, |# |% i2 o
* W. |4 p" J6 P) g4 K2 A实验之前, 先制作测试脚本. (简单写了一个如下)
* J- k  t! L7 b4 Z6 X1 }( x9 V5 F; S4 w/ y
复制代码) M1 ?- S$ y( o: n5 c( {8 Q: b
#!/bin/bash" B4 [# {8 u( U4 p2 _; ?* w! @
7 _) b4 g/ Y9 q
####################################################################
) `. k0 ^: H$ G) g. s# 1. 创造2个测试文件, 大小都是1G
6 I! K2 P2 q5 q9 X, t8 w) H# 2. 将当前进程加入到指定 cgroup8 S5 d( V: j0 s! s) ^, l- l3 u
# 3. 执行 dd 操作( P; z" A! Z. D% b, t7 W6 t
# 4. 删除 测试文件
$ a; }: Q6 P; N3 o+ `* Z# 5. 显示log
" t6 L8 }+ Y: e6 Q  Z####################################################################" `4 j8 N# _+ u8 _9 Z* ?3 U

& B$ h& }* V+ T% Y) U/ g. ^# |function usage()
, a( r: r9 f: Z9 `% i2 I{
  y9 \+ ]1 U3 ~  Y3 c    echo "./blkio-test.sh <group1> <group2>"! H+ Y+ U! q) A
    exit 17 ~" \, D1 G+ }% Y8 I) C% V
}; G( N6 j! u- f

3 e5 y( q' [" F. |8 p1 Aif [ $# != 2 ]; then
. [& J! E' b4 Q; w# X    usage) Z* W+ ^' x8 Q3 x% C4 X
fi
5 c, X% W2 }5 Z+ @5 L% L
5 f7 V. w  @& M, `group1_src=~/group1.src
' d( c. [3 ?$ Y) G# Cgroup2_src=~/group2.src
. H! v6 W0 `6 C! Y: @: y1 p1 B0 n5 U
  `. b" O, w3 ]" v1 j4 M# P  ggroup1_log=/tmp/group1.log
* y& E" g# g; N9 Ugroup2_log=/tmp/group2.log
5 {- \6 X! g1 A; Y5 T/ n7 _# C
, I: o4 i, z" ~2 `$ L( vgroup1=$1
2 G7 B, Z# q8 Agroup2=$24 {; X* f  e: e: @& ]# s3 Z. M' E

( Z' V: C$ F9 d( O! G( secho "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
0 X, U. `' ~; z8 E. E/ o) ldd if=/dev/zero of=$group1_src count=1024 bs=1M
* @; k- l: b* Edd if=/dev/zero of=$group2_src count=1024 bs=1M0 y$ o/ S+ Q3 I0 d

% ~  s  ]- n* [1 [# E. {% l2 Becho "同时在 $group1 和 $group2 中开始 dd 测试". x4 w/ ~7 N0 ?8 v: z* G) W5 o
echo 3 > /proc/sys/vm/drop_caches
9 J- @5 f* C' o( G# w7 secho $$ >> $group1/tasks- d/ c" B9 |; U2 p* R% V
(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &( L& Q  w% U7 c7 [) Z% j3 K

" [7 \  w3 A9 w0 fecho $$ >> $group2/tasks% i# S. q+ T: a2 t
(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &# ]8 l7 M, e$ t  \. j. d
: \8 M2 _, @' R+ O
wait
! h" D& m8 \3 lecho "测试完成!"( e1 J8 z* \( `1 w. Y9 H$ J
7 h8 R  g2 `* ^5 Z+ C$ T7 L
echo "开始清除测试文件"
! M' H& F5 v% S- }: Crm -rf $group1_src $group2_src& o5 C* A/ v8 F5 a/ T
echo "测试文件清除完成"/ G9 M) M4 u0 o; b

% V) l, F$ }1 w% Wecho "------------------------------------------"
5 ]% g/ C, u' v' _echo "显示group1 的log"
" E- D+ N! i6 D3 lcat $group1_log
0 I2 _( P, V( R1 |+ q; q$ I: u% K, n* j: O0 w5 A
echo "------------------------------------------"
5 e, Z$ _1 s" E9 Secho "显示group2 的log"
7 P. ?% z# T- K0 J' _& d. Kcat $group2_log0 P0 {% U# n" q' j% @6 Z

" N5 ^: s* c' u: {echo "------------------------------------------"$ N" v# b, k. @
复制代码" w% l  V8 t' a2 P8 ~$ D

9 E8 x" S& B0 r: z  Y! @. W* Y2 V8 Y
" B4 E" i: y% E0 |9 y开始实验:
& [# \: V2 U2 _3 k+ K1 C& B) u2 M: F- v# x  y4 A
复制代码
. K0 m3 {6 c% ~9 l# 挂载 cgroup 文件系统
; [: S, O; S& H& A8 d2 R, rroot@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/* D; R& c5 a. l

$ z# d+ `0 U7 Y# g6 z7 H- U8 r! }) Eroot@debian-113:~# mkdir /mnt/cgroup/{A,B}
0 f4 v: o8 c: r: }4 Yroot@debian-113:~# ll /mnt/cgroup/
0 C- ]4 X. T! R1 T& j6 Utotal 0
. r( ]$ {% _' E) E- cdrwxr-xr-x 2 root root 0 Sep  5 13:23 A
1 x" c! E6 h( `+ N; E0 ddrwxr-xr-x 2 root root 0 Sep  5 13:23 B) e3 Z' E: f( J4 r) [) J
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_merged6 l5 c- K0 w+ m) h$ V9 L" k
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_queued5 N  }$ e, x3 d4 a$ J3 g  J
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_bytes
2 i# `3 Q: k) Y/ v7 O7 Z) e! L-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_serviced
/ [+ {1 b- ?! f" ~" T# p  w-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_time
: D" {6 G, M/ ~, R8 [3 o-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_wait_time
( n& u, i+ v" l% C1 Z--w------- 1 root root 0 Sep  5 13:23 blkio.reset_stats
0 b" Q4 {" F* X  h% v2 I0 |3 P-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.sectors( X! N( e1 m6 Q. i" A
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.time( l! B! B, M* y% G  d5 H" x
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight   <-- 这个就是设置IO优先级的文件$ y4 M) s7 r; n1 ~/ r" W
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight_device
( T! \# \8 J' F# C: d/ b1 W' V-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.clone_children: e- z4 i$ |- q% _+ B
--w--w--w- 1 root root 0 Sep  5 13:23 cgroup.event_control
- j- S+ Z% `. Q0 M; O9 I3 _-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.procs
. g" k: z: V- k- _-rw-r--r-- 1 root root 0 Sep  5 13:23 notify_on_release8 o$ K# e6 n6 j* Q$ N) o! R
-rw-r--r-- 1 root root 0 Sep  5 13:23 release_agent
4 `, ]! J3 z4 ?& U; C: P-rw-r--r-- 1 root root 0 Sep  5 13:23 tasks
0 A: R" u$ m- k* n: d( q
1 i( e( Z8 H% f6 E# 默认2个组内的IO优先级都是5009 ?& l/ j+ A0 r% L6 a
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
0 ?* L4 e" t9 f) B* f500  <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高0 n$ I/ b. a* I/ w4 C3 w% v
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight  G" g% u+ a1 G* E
5001 i! V/ c3 z& C1 Y+ _( y

: T& T6 m; k& S1 `! C# 默认情况下的测试结果如下: A和B耗时都是 20秒
3 b, X1 `6 H9 c  g$ groot@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B7 W5 z  S) h0 [3 T7 z: |* H
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G): c5 g1 B  w6 Y8 r4 `/ \  j
1024+0 records in5 I. P& v: x+ x
1024+0 records out' r( C) p* h0 k, d
1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s! p$ E; W* Z& n' I
1024+0 records in" M7 f; F( l  R! T6 F
1024+0 records out# c- l( \! M0 V) q& G
1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s9 M" Q' t" W' d: T
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
* N! o9 H4 t- f$ h2 h6 N测试完成!3 s: X# p* C" j% l) V# |* l) z% k
开始清除测试文件9 M% z2 z; s* B2 }9 e
测试文件清除完成
# @' Z2 C% ^% l& A0 p) S6 _/ ~7 v------------------------------------------
5 \" |% k/ n& ]4 q显示group1 的log
: H# x# L# `) q! w( @Fri Sep  5 13:26:31 CST 2014
' E* X) ^+ {; N$ X2 ?2097152+0 records in
/ @$ D: j2 E; c: t# K/ f) V: S1 J  P2 g6 |2097152+0 records out" ^9 U1 i, _7 ^' w
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
' @  l  C, W5 h, yFri Sep  5 13:26:51 CST 2014: a& l% X0 n! D. v: U6 p
------------------------------------------
7 h' |2 m$ |; B% e显示group2 的log
8 ?- U& ^) [( [1 `- Y1 {6 pFri Sep  5 13:26:31 CST 20148 l# d- L; |4 @) t% W/ O
2097152+0 records in% J# {8 c, O  y; b( T3 G
2097152+0 records out5 y/ q& L8 T$ i) c
1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
) Z; C- x2 f% M3 Y3 sFri Sep  5 13:26:51 CST 2014) h5 w/ D, L8 q6 U' f
------------------------------------------' c' ]0 o9 ]/ m' Z" I/ _
6 ^; s5 x2 G# T+ |
# 修改A的优先级为100, B的优先级为1000! C3 z. ~- Q" ?& D
root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight+ E" s0 |- p6 F7 u( c5 @
root@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight0 q  E+ D$ W+ m6 ]0 Q
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight4 Q! a/ ?9 u. Q
100
- v  D- e' B+ Rroot@debian-113:~# cat /mnt/cgroup/B/blkio.weight) Z6 l, w5 ]  _0 l9 y# f
10008 m( b3 {- D. C+ P* v( O' X

2 F2 [  i( k3 j8 t) K. v# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒3 t" M5 x: K& m; z. R
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B3 d' }6 d% p0 P7 \
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
0 W2 U+ l) _0 H9 n+ M& j1024+0 records in3 G. v! |9 H' F
1024+0 records out4 Y$ I7 M8 Y2 j, U* r
1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s: C4 B# X- z  V* b
1024+0 records in
$ K2 M' \$ g/ a$ ~$ H  L9 ?9 o6 L1024+0 records out
7 j- n  b2 _9 y. R/ i1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s5 k6 ]/ r( j( u7 r; c, D' U
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试" J2 A8 ~7 |# r4 \, u  j( {+ f
测试完成!
/ ]& \* o9 o' v+ j$ J$ Z" m开始清除测试文件
0 M1 }% t: {$ Y$ _. k测试文件清除完成7 [: j1 N  Y& J' x7 {! ^3 q
------------------------------------------4 E' R* X- m" T3 B8 i! B
显示group1 的log5 K3 i/ A9 x% Y4 b4 p
Fri Sep  5 13:30:06 CST 2014
8 u5 x: g0 o" T: P2097152+0 records in& u4 k# n( h6 J  a' v
2097152+0 records out) P/ S- S9 o4 F" r6 d: r. L) l
1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s- e# u0 x* D- T5 t
Fri Sep  5 13:30:25 CST 2014
+ Z+ @5 e! d! c1 E4 O0 L: ]- |------------------------------------------! \! R' A. k3 {  b( \% p/ B! T
显示group2 的log6 g( u2 o$ o- I; g
Fri Sep  5 13:30:06 CST 2014
3 ^1 z# K& ]# P2097152+0 records in7 p% y- l) H1 [& O
2097152+0 records out% W& Y  w1 B2 J# o( J: z% I
1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
3 M  U1 i; H2 f' w7 M: lFri Sep  5 13:30:17 CST 2014; y: G9 k( h9 o) R
------------------------------------------$ h, T, d: S( \2 |& F
复制代码4 N! ?& \9 V8 F; _
; R3 E: o- y# J' v( R1 x$ a+ w

. t' C8 ^6 C7 S! Y) H可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.: r! w9 @$ d9 N$ r

8 Y8 V9 ~4 S8 O* ^( ] " a) W( {6 l' ]5 j) s

/ g5 p. ~8 Z2 _" C6 }3 g总结
3 i" h, b+ l3 y其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件.5 J6 ]" W: x6 r+ ~
% S% C# O$ y9 H& C5 W, ?& k
各个文件的具体含义, 请参考更详细的 cgroup 相关文档.

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 21:32 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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