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

Linux资源管理-IO优先级

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
+ h9 k& h" r6 r
前一篇介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.
* @' v# L& H) R- L) C& \  s- G1 P# \
前提条件7 [  K: k4 Y7 f7 ]7 G( ^' e4 u6 y
如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.
* X& k1 H0 u0 }1 }/ ?' K1 V% {
: W  S4 I$ p. y/ \1 vCONFIG_BLK_CGROUP=y
* h" w; R6 z& o, \CONFIG_CFQ_GROUP_IOSCHED=y
& d* r5 L4 I9 W查看是否开启这2个内核编译选项的方法很简单:' a( B1 p1 ]' S4 b

3 h3 h, ]2 l2 \1 e0 k. Uroot@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`
8 x/ g, p* h) G4 q" ^% Qroot@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`: D. A8 x+ D8 G
如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.
' H! U3 e( A  }/ g) d5 Q, }8 u+ Y1 p2 R2 X6 j

/ @# K$ T( l+ R  ]/ b( e# [* `, k. l0 L. S2 P# a5 Y1 S# r- [% }4 I
再次通过 /proc/cgroups 来查看 blkio 是否已经启用.9 O7 f8 h5 h: v' g& }6 G, B
& n6 k/ F! P6 I* w1 I8 I1 v3 p
复制代码
9 n) T9 S  ^# d6 C) u9 S, {root@debian-113:~# cat /proc/cgroups 4 j8 n0 k* O5 T9 p# G6 @
#subsys_name    hierarchy    num_cgroups    enabled
8 V) U9 B5 U9 V2 p) Q. Jcpuset    0    1    1- L( j2 E# P4 ?" d1 T
cpu    0    1    1( x  Y3 |6 s9 J0 y' a  z
cpuacct    0    1    1
/ [# U8 [6 Y+ f, k; Amemory    0    1    1+ ?+ {, l5 R/ ]
devices    0    1    1
6 E4 g8 [& k6 F' {freezer    0    1    1
. E/ e% O7 ]& g* {! B! @* Dnet_cls    0    1    1
& U1 k4 d0 K* v$ c) q. p6 Oblkio    0    1    1    <-- enabled = 1, 说明已经启用
  S5 b9 s! K; ^! c, K7 M, q" s$ bpeRF_event    0    1    11 u/ a. w) _' j! b% Z' U4 u* ?! @
复制代码
. @1 \7 V2 {" u1 w' s如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.
1 p& ?' ]: G( `# y6 B. U: O' N* f( n0 Q1 |
类似的可以参考: Linux资源控制-CPU和内存  中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。
3 \9 ~0 |$ P: m9 {/ g+ Z* u) ?% ]$ g- @
' @' z' g0 K! c% x! f

+ Q) a& Q1 N7 U% v" \0 `2 w! f除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.( s. K% V6 ~, v) W9 l2 J
& q3 ~! W+ V; Y7 ~- K) A0 T! ?  `6 {
root@debian-113:~# cat /sys/class/block/sda/queue/scheduler 7 Q% r# l9 M5 G1 }7 g8 ?7 |5 e6 o
noop deadline [cfq]
; A# _& N5 _" Z3 r上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.7 b# {! E% [1 P+ |0 ~6 p
) R6 {4 X1 @1 ~- {7 s( T; d" e& c
如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.6 D6 r' C. i- f+ K
5 w+ S6 k# ^- C# i. G6 `
如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么
, h" Y& q: O" x% z5 G! ]0 u" }, p) @; `$ Q
cat cfq /sys/class/block/sda/queue/scheduler     <-- 将当前的IO调度程序设置成 cfq
8 e& }/ B- U. E: W7 Z* ^% x注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.+ w. U, w. G1 V$ n) t4 t

( m# w" z- |  G  V  U# @
, w; Z, w; {1 K5 Y7 j; k: c0 K* O8 D/ c& U& _8 t. D
实例 - 控制IO优先级' b) v# c" t4 {: N6 v- U: s, D
挂载 cgroup文件系统, 挂载参数 -o blkio
) B2 Q- L5 L# T; \6 [建立2个group, 分别为 A 和 B
, M- V& C4 G" I; e- M" j0 i6 m5 l默认情况, 2个 group中的dd进程同时进行文件操作- ^8 F( A# _# E% k% E, z: W6 o
查看默认情况下, 2个dd进程完成的时间; s& N! c9 k$ y4 v: K3 O5 `% w
设置 A 的优先级为 100, B 的优先级为 1000
# C1 v$ ?0 _- l+ x同时在2个group A 和 B 中运行 dd进程
. K) T1 n+ \2 }" o- h8 T查看group A 和 B 中的 dd进程完成的时间
& S. f0 ^; g+ R/ x% U, T- U3 `( ?8 @ 7 u% T- O$ J$ q) W
0 D  X0 }3 w' \- i; B
实验之前, 先制作测试脚本. (简单写了一个如下)
3 `$ K; c* z7 V5 j& A/ }# S+ `+ J9 k$ ^/ S6 ~" N2 A
复制代码
: G$ O7 u# z" _7 p- O& p#!/bin/bash
# o% X! D/ }$ i) e
( _) O8 y+ ?" M2 ]/ G% U) L% E####################################################################
6 d! e9 F* y4 }# 1. 创造2个测试文件, 大小都是1G3 f9 I* ?' ~  C2 u
# 2. 将当前进程加入到指定 cgroup% H% f) I7 H7 Z5 ]- U% y
# 3. 执行 dd 操作
2 m& X4 d9 ?. q: b0 N- c; p# 4. 删除 测试文件
* t0 M: j) H- c' k# 5. 显示log* R2 |6 e6 @6 ~) {0 o3 T
####################################################################
! f+ E5 z0 {! b* B
3 |; V3 B8 `8 p& \- Jfunction usage()
8 J! m) l9 v: |, z1 i# J8 W# @{
& Y# Z5 l' r( X- o" c& ?    echo "./blkio-test.sh <group1> <group2>"' S& u6 E5 s( [$ I+ O6 i3 n3 w
    exit 1% X' c# h4 v* o! |! g* D0 S1 v
}; A# S+ r/ J. Z7 n  T* j

$ p1 @; P. P- m  qif [ $# != 2 ]; then2 X" z% ]% \3 Y, E" z
    usage
/ e) [/ S" X: |; E: {$ a8 ^" ?) @fi, U1 D$ b- p" w0 r  r; e6 P6 O

7 O/ F3 y* d% ?" ^group1_src=~/group1.src
! [3 N4 d% E2 y. O+ pgroup2_src=~/group2.src
0 H& a. J+ K' ?- ~; f% A6 A, |# E6 M% W
group1_log=/tmp/group1.log
# o7 x& J: P& p5 N. X+ {group2_log=/tmp/group2.log, z- C# W! }) S. [" z) a/ L# l$ T
% g: q$ L# p! X1 Z
group1=$1
4 b( o2 p7 j3 O; Vgroup2=$27 W! r2 J" T/ h1 K$ k& d

) |, x1 l& n, ^( U9 q( H# wecho "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"  A6 v; J) R# }# ^  |: o! R
dd if=/dev/zero of=$group1_src count=1024 bs=1M
) @( o# R! p) n) p5 ~" \dd if=/dev/zero of=$group2_src count=1024 bs=1M
. z% e0 C3 h4 M" r( b% \7 V' D1 t$ }, ^( B' P  J
echo "同时在 $group1 和 $group2 中开始 dd 测试") B4 |# m% C2 x+ Y
echo 3 > /proc/sys/vm/drop_caches
( e9 M+ _4 e* ?  E! pecho $$ >> $group1/tasks( x/ [1 C- n6 x' i$ R
(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &
) C  J- |* A+ a# M; \) j
6 C3 X# \) ]9 t( ~7 P: r& e( secho $$ >> $group2/tasks# l# w2 P! W+ y# v
(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &
9 v9 X) a/ i3 B7 r& O, F1 f, H/ _) E; K! U$ P7 i
wait
. ?( Z9 p+ T  T/ S: Uecho "测试完成!"
% s* U0 S" o. T3 a# q: d' z) t( d
echo "开始清除测试文件"
0 a/ v# Y5 s( X, x# a3 w( L6 [rm -rf $group1_src $group2_src: W4 J; h0 T2 v" S
echo "测试文件清除完成") F. V. U0 n) _
7 y2 _' o* W$ S2 g
echo "------------------------------------------"3 Q( }$ g+ v; B1 e  L% m" N
echo "显示group1 的log"* g6 t% w! r. {6 J: ?0 ]
cat $group1_log# v! \/ @% J2 ^' B- |6 A( T$ P0 j
8 ?' K/ {! E% _% Z& G
echo "------------------------------------------"
# i4 D( o/ K# i* F: u0 a# G( @+ Techo "显示group2 的log"1 s% v, n6 Q" K9 {
cat $group2_log
5 ~/ {5 O% T: M, E- t) b0 x! \! h! U) J' }
echo "------------------------------------------"
$ G1 D: J' m' R复制代码
" ~0 p* |0 G: h) V1 E, @ # Y0 q" k$ }% x( W7 Y
' [' f4 Z, c. W. L. v
开始实验:' i( y7 k; f$ e

% G/ e5 X' ^* I& f' M复制代码! n7 w# @/ {# c7 @
# 挂载 cgroup 文件系统
$ z+ j7 c( ]3 qroot@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/! a2 |( \4 a9 a

3 e$ f$ y8 y8 Sroot@debian-113:~# mkdir /mnt/cgroup/{A,B}" m/ _2 o; K: g4 E7 m
root@debian-113:~# ll /mnt/cgroup/
: y2 h- }: T0 y/ c4 l* y% Utotal 0" b0 Z2 D" U6 S9 q- R. R$ ]1 V5 j" q
drwxr-xr-x 2 root root 0 Sep  5 13:23 A
( S; H( {/ {1 h" s2 z1 |/ @* Ddrwxr-xr-x 2 root root 0 Sep  5 13:23 B" w. e" I8 ?" N- y7 G
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_merged
( L4 v( h* h7 Y0 J1 K  x. K% i-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_queued
9 p9 D& H2 M% D. i( M* o( S. B, H-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_bytes
- d, x: N; \: B0 s* c) `5 i-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_serviced
- [3 c$ F+ ~* \! W. u" J; H- d-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_time0 k) d/ Q  y& }
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_wait_time
" B9 _# Q% i" T--w------- 1 root root 0 Sep  5 13:23 blkio.reset_stats. S* ^2 H( a" r$ f; r' M6 x
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.sectors
7 I( n0 K# }4 U+ A-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.time
& n" n. u' @+ i) v- d7 s! t" E-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight   <-- 这个就是设置IO优先级的文件! p: P( E+ B- a. V! U% r  C
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight_device
9 {1 _, o7 n2 y5 o+ g1 v-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.clone_children
, k% l* }" n/ X& K--w--w--w- 1 root root 0 Sep  5 13:23 cgroup.event_control0 c. F5 e! k0 s& Y, `
-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.procs, w: t- q' k( T+ i: v% P/ E# n+ j
-rw-r--r-- 1 root root 0 Sep  5 13:23 notify_on_release
% k1 Y  o4 w/ t6 b-rw-r--r-- 1 root root 0 Sep  5 13:23 release_agent
& T9 S0 n& p* f& ]) y-rw-r--r-- 1 root root 0 Sep  5 13:23 tasks/ L5 Q% }* J9 Z9 R
7 v9 q4 {; F) g7 d
# 默认2个组内的IO优先级都是500" e" G) {6 m/ @+ G# I
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight) F& X1 d3 A: S  m! E3 |! S% t
500  <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高
  `) U6 _. h- z. \6 `2 w6 Z1 Oroot@debian-113:~# cat /mnt/cgroup/B/blkio.weight
  t* p" }7 p+ x. B500) q6 M& M  f+ P' W4 Z
1 r* s( d! O: R( U' N9 a
# 默认情况下的测试结果如下: A和B耗时都是 20秒
% ~9 Q) W7 P- t, L0 s9 Groot@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
+ O* I6 Y* l3 I. N% d" [生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)$ E$ p5 I6 e+ i. k$ o
1024+0 records in
0 H4 l( K3 o( q1024+0 records out
. ?+ X+ ]/ n7 V4 `' J1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s+ C3 K; _( o3 T- T5 R/ j5 k
1024+0 records in
: g% E/ B! _1 \/ ~' E1024+0 records out/ A- W1 x+ K+ i. }" I# w/ Z' h
1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s% R' j6 N2 v/ O+ L# d
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试; R& \4 M1 z9 U1 a% L
测试完成!, U1 ^9 h6 |) I/ B8 B6 p
开始清除测试文件
' W) k4 c) p( C, x% g  K) G8 \' n测试文件清除完成, b$ y  k  }' u6 E+ \9 \& y
------------------------------------------% V; \+ E. O  z" v# H# V
显示group1 的log" ~: U5 I- _  p/ n/ e" _+ V
Fri Sep  5 13:26:31 CST 2014& H% M- E7 h; ?; Q4 h7 K# B
2097152+0 records in& y8 w9 g5 O0 G# a% A
2097152+0 records out) r* o9 F* ^2 P
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
  i/ S9 V! ]2 |% O5 ~( O1 bFri Sep  5 13:26:51 CST 2014
  Z; ?* _8 f. E* w; I# z------------------------------------------2 f! k! R7 O" O0 f7 l. ?* s. c3 s
显示group2 的log
% F, s8 `# J4 _; KFri Sep  5 13:26:31 CST 2014: d& m% x, i1 {) U  O  `
2097152+0 records in
4 f6 S/ j8 G# b. J2097152+0 records out2 [3 [* J/ T) o2 ^3 N6 ^
1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
; V. n1 [5 ~6 w6 t( }Fri Sep  5 13:26:51 CST 2014
7 f, s- z4 p: {9 Y2 @4 G" ?------------------------------------------
8 k* o$ R+ m' F  D6 l
2 ^' D/ B, Z8 `" b2 g# 修改A的优先级为100, B的优先级为1000! J. q8 I7 \# q/ B2 l6 p- b1 ~; Z' J
root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight
  [- d4 q$ A& O: x1 d  Aroot@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight3 a1 {% Z4 B1 h& ~( _; I
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight7 _. c' v0 C) g. z
1006 c% c# C. B0 q' S( P& `
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight1 D: F3 n" [" g9 f2 F' N& X
1000
' K, h# j8 |: V/ Q  T! x+ I- w
" P& Z6 g' P- f, o8 q; n) I2 W& b* y# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
+ u3 J8 ^. I' }root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
, l1 o9 k. ^4 d5 J生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)- Z& a3 W2 V$ o$ t
1024+0 records in
' S* j( g. O  C/ U+ j' q9 T1024+0 records out
) ^( T: g! b* O4 S' ]1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s* r  c( U9 I$ F$ q# i
1024+0 records in- a2 }5 [6 C" T  K! U
1024+0 records out9 u% B, W2 w* V5 B# l, l
1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s# [3 I- l0 e! c! I2 @6 j! v$ m" ?
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试7 N5 ~& i& H3 S8 o6 G
测试完成!
9 |7 h* ^: h8 K' n1 S' ~开始清除测试文件
/ N9 V7 ?/ G, @测试文件清除完成% P/ i6 Z8 ]: h( M4 d, L0 Z
------------------------------------------* W% `4 N, y% t3 e. z
显示group1 的log7 f; V) g' I) V, ~3 i/ W
Fri Sep  5 13:30:06 CST 2014
( p$ y: e$ G; Y1 \9 r, `2097152+0 records in
1 ^" A" M/ x" m7 ?8 @" C" E2097152+0 records out3 b- b. x6 V2 x8 l: T, T  N
1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s$ h; N! v# ~7 N( h9 @& O
Fri Sep  5 13:30:25 CST 2014( @2 X( l+ N7 c" r  y$ C$ [
------------------------------------------/ v! B+ }% x9 [2 K$ j0 q/ w
显示group2 的log/ c4 w0 L7 L" j% I0 \5 l
Fri Sep  5 13:30:06 CST 2014+ v. ^3 j+ C: W0 d0 {
2097152+0 records in
4 G' D( V' ?( l  g% a2097152+0 records out" t/ `  K8 c# a
1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
- p- Q2 B5 A' _  W* R& Q6 J% [Fri Sep  5 13:30:17 CST 20148 p( e$ p7 h4 z7 i0 c
------------------------------------------
5 G6 n3 W1 d4 w+ e1 l/ r' u复制代码
# h9 L: \! D( `" p( b" b% {# g : ?. z) |6 t/ r+ T: _+ M0 N
5 s- X0 d) U- f" s% H& O( F
可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.
" W3 u: b9 W. T$ m, D5 U* A& m- K4 T6 E2 H% t9 _0 E) z* k
9 }& C' |# Y+ W& S3 g5 p

1 l+ a  x. c9 G; D2 [总结
: B: l# B) \- Z) E- i- h: T# g6 I5 k其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件.
; V' L8 Z# P7 v+ c8 ]% d
2 f+ s" I/ t7 G" D4 q7 S" H9 Y各个文件的具体含义, 请参考更详细的 cgroup 相关文档.

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-26 19:38 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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