|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ v. A: k1 W) X& E1 Q! f" w
前一篇介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.
# Y2 e z$ `! H, M$ F& E9 T' P6 O
+ ]* e# o3 G7 ?( n3 h' I前提条件
; Y0 _3 S9 n0 w$ z) ^/ w: k如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.8 p) r9 e8 o4 V) I/ w' g
3 x2 ^( ^8 k& e0 ^& _CONFIG_BLK_CGROUP=y
' Z& m6 f! L5 s2 f- ECONFIG_CFQ_GROUP_IOSCHED=y
7 e2 a- p7 S/ \& I; P查看是否开启这2个内核编译选项的方法很简单:
: ]0 r6 {; g; v2 |* X# }% d9 Z% G* n/ m3 O' E$ k0 K+ f0 D2 Z- a B, k8 k
root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`
% \( Z- }5 e/ {* o$ s1 kroot@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`4 z! r7 @8 x' j# y6 T6 R# B9 a
如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.
0 b) p h; w8 c. |* ?
4 o) H0 s$ x: q g$ j
! `8 Z6 d( {5 V' v
8 n2 |: H; a/ m再次通过 /proc/cgroups 来查看 blkio 是否已经启用.0 ]. t1 r" y7 d6 U+ V; j1 T# Q
/ x$ a Z& k2 i5 l/ z复制代码
5 j$ {. L6 X- \9 A/ {# _root@debian-113:~# cat /proc/cgroups
: v+ l, j1 t7 U7 T; Z' }8 B#subsys_name hierarchy num_cgroups enabled! i1 k7 d* Y6 R, n) b+ c
cpuset 0 1 1
4 W* b! x6 }1 b& |$ a2 g9 Ccpu 0 1 1! y9 ^3 n$ ]6 d% | |
cpuacct 0 1 1
: l; u8 r {; z4 e8 k7 E4 i* xmemory 0 1 1. b4 {4 C1 B8 o& ~6 ^& \' y
devices 0 1 1
! D) E: B9 g8 M$ v0 C5 Jfreezer 0 1 1
' K" P2 v/ Z! n. l' @net_cls 0 1 1/ c) j) R( X1 k3 @0 V
blkio 0 1 1 <-- enabled = 1, 说明已经启用/ T: p, x4 k6 E1 U, t: O3 J
peRF_event 0 1 1
' w* @5 J2 o9 u+ T* V/ Q8 o4 b复制代码
0 J3 |: r6 Y$ G. f, a* y如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.+ H, t" y+ r' I& C/ Z3 j
0 ^+ v, ?) |9 M; E2 \4 O* ~
类似的可以参考: Linux资源控制-CPU和内存 中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。
$ f6 F! S& w# w" a ?, ]7 G% f! l) ~* g) {
/ I1 I& f! w, z4 Y3 p8 f
+ Q+ E" D! J, m4 p; d除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.$ s0 |" e9 ?* K1 e" n5 {6 q. Q
7 ^, \- G6 o$ e3 e8 U: q
root@debian-113:~# cat /sys/class/block/sda/queue/scheduler , M. @" d1 ]" [6 y' S/ J' B
noop deadline [cfq]
* v( K- E- \3 P0 H1 ^上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.
1 ]) b' M" |1 W5 l
/ u9 ?5 K. r; p6 ^' r如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.5 C0 W6 V3 g1 h% y$ f: h5 Z, L7 C
+ A" F0 I; B1 Q' R# _3 p/ G
如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么
6 r! p0 ~+ s% q( ?. |: d# `4 i1 `
cat cfq /sys/class/block/sda/queue/scheduler <-- 将当前的IO调度程序设置成 cfq8 k1 u+ k# A, N4 H# G7 L2 e" a
注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.
: r" w+ ^" v8 ~5 @3 ]( M! a. g p/ o( d
4 L; k% p3 Z& K7 O5 f! E
, ~( c; ~" H3 J1 W1 U
实例 - 控制IO优先级' _+ }' F8 T7 c! W1 S/ ?
挂载 cgroup文件系统, 挂载参数 -o blkio
( T$ U6 b v9 P: J9 l+ K0 V建立2个group, 分别为 A 和 B7 j2 |6 K7 S5 {. n9 h
默认情况, 2个 group中的dd进程同时进行文件操作& e$ V* x1 K8 o
查看默认情况下, 2个dd进程完成的时间0 o7 v3 c8 _4 m. `3 I. z
设置 A 的优先级为 100, B 的优先级为 1000
: \" o4 y; w% e) R8 u同时在2个group A 和 B 中运行 dd进程( H- V# _! s( e3 Q& G
查看group A 和 B 中的 dd进程完成的时间
1 K) O# q8 H$ u6 z1 C* J
, J- ?3 f) b, K6 _6 M/ L* H4 d5 P5 ?1 Q, |5 o+ H
实验之前, 先制作测试脚本. (简单写了一个如下)
# ^+ d4 u! l& q8 P+ s/ O
3 Q- w; j g$ W6 |- l复制代码( p {4 e/ |: x, M
#!/bin/bash
' s3 ~+ X1 z% b: P- a) Y: z2 e( L% Y, K D8 `: E" @( o( X
####################################################################
w: ?2 I% S3 b% @1 n' F# 1. 创造2个测试文件, 大小都是1G
4 I5 A' c2 Y( A* g8 Z; q9 ^# C# 2. 将当前进程加入到指定 cgroup
6 z# x8 o* ^6 u! E4 C9 @# 3. 执行 dd 操作' T7 K! M7 D8 K7 q! L
# 4. 删除 测试文件
: ?. G7 ~* a# o! C6 k9 P# 5. 显示log& W, H: }# g K9 f' \7 {
####################################################################& t& e8 B) g( `4 B2 o! [
$ K! |, R! q+ r! S+ T! o8 f
function usage()4 H9 ^9 n' w3 f7 Q0 T% W1 f0 N4 W
{
1 g( Y- N$ w# k* U% k1 i echo "./blkio-test.sh <group1> <group2>"( a8 k: i4 D6 |" m- ]# E! h. A
exit 1
, d' ~+ ]5 r& c0 o# Y" ]$ o}
! o4 n, s' I3 \5 o$ J& X+ s; O8 Q" o) w; {
if [ $# != 2 ]; then8 a( n! r) l3 U( s- N
usage
7 a! ]6 ]4 h" s% Z: Y, ~, }+ ?fi" Z) w) [1 ?" M+ }; I
, |* z! u/ h( J: Fgroup1_src=~/group1.src
7 m% M" Q# [* }+ W9 ]group2_src=~/group2.src
7 {- k* J- [# ^+ D- @/ d# Y
, ^! A3 y8 X7 I5 C1 n& x; a& Pgroup1_log=/tmp/group1.log0 m4 v9 r/ i l3 W9 @( u
group2_log=/tmp/group2.log& T- _4 y9 Q1 Q. r1 F" }
4 s. g' U5 a% k' ?% Lgroup1=$1- ~0 L) O. S6 D; M) z/ H8 |; L
group2=$2+ J' Y: _) f2 }% l4 p* G' V
. H+ b6 X$ y ]$ C Oecho "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"0 H+ Y5 C% v6 a* S* K) D' y
dd if=/dev/zero of=$group1_src count=1024 bs=1M
+ z1 k0 F+ e; R5 L; u* M2 B% Udd if=/dev/zero of=$group2_src count=1024 bs=1M
6 {3 W/ g/ \: A8 `0 }( C: T8 S$ J
0 B6 ~2 n% l& D n9 d5 |3 M5 y' Recho "同时在 $group1 和 $group2 中开始 dd 测试". ]5 K( h3 ~" y% b' Q
echo 3 > /proc/sys/vm/drop_caches9 M& K" g8 N" m: s4 d( j3 N
echo $$ >> $group1/tasks1 ?7 J3 r2 {3 w6 [ \4 \
(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &4 p+ Z3 `8 B+ r4 C* W9 a
- u. w% Y, S' N% U
echo $$ >> $group2/tasks
0 W8 ~ Z6 l( U5 Y8 H(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &5 A- N7 u. q+ j% P: K3 ~
' d6 e. ]* v3 cwait
! }4 g7 [' v+ C) ]9 p$ g. jecho "测试完成!") l. E: G+ i0 Q5 E! \
* V% ~1 f" S! n' j4 k7 }echo "开始清除测试文件"
% w, F1 e5 ?) M3 Arm -rf $group1_src $group2_src4 w5 X% q: S: N6 c4 K
echo "测试文件清除完成"
' Z) F W; t1 k& D# c7 S) J5 F I/ X& C0 [& }
echo "------------------------------------------"
" Y* d4 Z7 r7 P0 cecho "显示group1 的log"
1 X2 C& i( L6 C2 W& K2 d+ zcat $group1_log
7 q* q3 y' z0 d; F! ]- L5 d3 j
. H5 h0 ]% u5 P5 U; gecho "------------------------------------------"' z& {6 f# `+ @6 p, \
echo "显示group2 的log"
B" I% t2 S7 S) w% Fcat $group2_log
% a8 X1 ~- ~ j: s* A# L
5 E C3 p; _+ t' A& y1 xecho "------------------------------------------"
7 L1 S, o7 g9 F* F2 E" h7 H复制代码5 }+ R9 j" s) v5 P
1 u2 {, \# Q D- ~: i8 [% r0 L( {' _' x
开始实验:# m7 T" C9 j( Y* x( n, _
6 \% W3 p9 t; f) O9 K; u复制代码
# G2 A) y" y% c# 挂载 cgroup 文件系统
6 |" ?6 E1 J/ P7 oroot@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/
3 a0 _5 \8 v- C5 }) A7 ?* @
& r6 V( e0 K' _2 t. t# troot@debian-113:~# mkdir /mnt/cgroup/{A,B}) J) z" P. l% R% C- a# G
root@debian-113:~# ll /mnt/cgroup/6 P) y' _% \7 t6 h, ?0 E
total 0& m; i3 u3 J. k0 J
drwxr-xr-x 2 root root 0 Sep 5 13:23 A
0 p5 T3 y) H: j$ l* F n9 G8 Gdrwxr-xr-x 2 root root 0 Sep 5 13:23 B
7 k% m( c3 B! `# E-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_merged9 u2 @; W$ A X+ V1 B
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_queued; z' F6 U* p6 T' Y) w; r
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_bytes
: {7 f) e" f; w5 |-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_serviced& f- _( Y5 R8 ^3 I+ Y: D: H
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_time
7 m5 P" S, {, {# g/ N; |7 O5 n8 L-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_wait_time9 p1 V. S& D" ] o
--w------- 1 root root 0 Sep 5 13:23 blkio.reset_stats
: {; h5 R0 Q* U% }2 q5 I" q1 |-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.sectors
8 G" C* g+ k, E* v: o I6 {-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.time
6 X9 u0 B( @3 \3 h/ q# f-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight <-- 这个就是设置IO优先级的文件- _6 W+ P" e3 O% \6 C: ?
-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight_device
- K% r5 l# k) S5 ^* F1 |-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.clone_children% T1 T# Z% J! e3 f- j, P d
--w--w--w- 1 root root 0 Sep 5 13:23 cgroup.event_control. r: N4 @( w' |% X
-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.procs' u' p( W% M- ]
-rw-r--r-- 1 root root 0 Sep 5 13:23 notify_on_release
3 k3 D- S) G5 H7 Q7 F& P. l& }, ]3 W# X' Z-rw-r--r-- 1 root root 0 Sep 5 13:23 release_agent
7 c/ ?/ a# f+ Z M-rw-r--r-- 1 root root 0 Sep 5 13:23 tasks2 w0 T7 Z4 K) e3 O
& T$ i, R& R/ j& x& x
# 默认2个组内的IO优先级都是5007 v. S- ^/ I- G) A3 s
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
B2 g; F' r5 B6 o3 L' ?$ Z- R) t/ f500 <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高0 D# ~" o& @! p& }- ^
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
6 z) z; h. g8 z5009 x/ j* O& q0 c$ [ ^1 k
Z" h$ D2 N9 X3 {# 默认情况下的测试结果如下: A和B耗时都是 20秒
$ ]$ i$ H8 c' u5 rroot@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B8 {# P7 P3 m& [5 x8 @9 i& `
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
6 T; w1 Q( _8 r2 i7 d% D! M1024+0 records in
0 x/ O' m0 O. o1024+0 records out6 A) O, A) }2 P
1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s
/ `1 s9 {9 t) ?/ @% t- Z1024+0 records in
4 Z1 }' s8 \9 [3 `, A: `+ L1024+0 records out
# E5 b6 M5 S) j1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s
2 V9 k/ x: H+ N [, w& r6 A& s同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
# v4 z; h: ]3 y$ h* p测试完成!. K8 v) T# n: \2 G+ o3 u- l/ M
开始清除测试文件# q7 \% N4 {. f) H4 j: A( H' _, k" K
测试文件清除完成 i f2 k! @' @0 f
------------------------------------------
( Q5 d* z$ w# g# @% z" G显示group1 的log
4 A0 E! P N/ w+ N, ~Fri Sep 5 13:26:31 CST 2014
+ r* k: ^- v( {3 t' x# O' X" x2097152+0 records in3 ~$ h8 z/ k5 z4 o
2097152+0 records out9 o' O( I+ V& ?. N3 j3 D5 h
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s6 |% g( S5 b$ B v4 D' o
Fri Sep 5 13:26:51 CST 2014% v6 {5 u5 O8 q0 A' p( C
------------------------------------------
: r4 c9 y6 P5 u* H( w显示group2 的log
7 b; ^: v* R; ]Fri Sep 5 13:26:31 CST 2014; r- c8 t- r6 J8 i; V# r" D! G: s2 x
2097152+0 records in: D5 d# q0 Y# i2 ]6 T% Y
2097152+0 records out. W) d7 M+ h! z6 H
1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
# V3 z& X& e/ Z. _Fri Sep 5 13:26:51 CST 2014( E3 F7 b& M2 Y
------------------------------------------0 T5 k6 b8 ] G5 [* a% S
: b, I$ c' }3 N) v* [3 z- r# 修改A的优先级为100, B的优先级为1000
5 m8 I6 M" w" v0 C% \. i1 q3 J0 oroot@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight4 G5 n$ L" W7 D0 U, N
root@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight1 g* B5 D- [( J1 Y& ]1 N1 ~
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight' e3 t8 q" s0 S
100! m% h" G. K5 r) U6 S. H
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
, P! k* B4 `6 z. a" {0 x10009 J' i3 z; Y) M
9 e, t% F8 |3 n/ V
# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒2 }( w8 g2 K6 ]4 H' k/ T7 a1 Z g) ]" _
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B! U, } \' m% F# y2 A3 i
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)% J7 v [3 @& M) S* i; ^
1024+0 records in" g |: P4 m( ?9 q$ ?
1024+0 records out
. X% X4 F7 h' |) {/ q1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s
: w: }, x( A3 C9 H4 B7 O1024+0 records in- K2 O9 x% t8 y) C3 r
1024+0 records out
; A0 Y7 L5 f \+ Z4 R7 L1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s: Z$ G G6 v0 J' R* _
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试- {, H. s& m! m2 E
测试完成!# C: r& a H2 [5 m( ]. m1 d( |" s
开始清除测试文件. O- ^+ q/ O% u) @. k" b/ y
测试文件清除完成4 y, g p4 B, I4 ]0 g$ n
------------------------------------------& H, Y' p9 @' N" j# C: e' f
显示group1 的log
3 s$ H# p0 S/ l. s: ?8 R& |Fri Sep 5 13:30:06 CST 2014
p: A3 `5 n; y$ P& b9 r: d2097152+0 records in9 n" m i: k! V% o5 J
2097152+0 records out
$ l0 E, n# k+ K, }! P1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s
- d7 @/ C, B2 xFri Sep 5 13:30:25 CST 2014
u2 f$ `4 e; w: v0 o3 }------------------------------------------
8 i3 R6 ~9 U7 J显示group2 的log p. K0 e7 A1 C0 P% P
Fri Sep 5 13:30:06 CST 20145 K h) ?; D. Q# ]$ B
2097152+0 records in
: t1 S$ ]( a& G+ x5 o/ _2097152+0 records out
- @# e6 I9 K/ e" v, F2 P1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
( t+ U( `& E* w) N! _Fri Sep 5 13:30:17 CST 2014+ A7 n" U' H' ` ?% ` e
------------------------------------------
/ {! }! A: @2 M& u( F复制代码
* Z! b$ Z% u2 g5 |4 Q. L) g" o/ {: {4 m
4 `0 B" Z; K2 f6 a: U7 H5 a1 z, C+ m2 [$ e; u, Y8 x0 B
可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.2 `. \. s, E0 |, M, W, Y6 t
X, @+ X% I w+ T H* z$ Q) e( ]
& W- I7 F& x! B3 T/ _! H" H$ F, X
& A; Z9 r# q- I% N; v总结 R' N" ?& h7 X7 J& T8 R7 {
其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件., Y, w3 P V+ h% [+ D3 C
4 C& L( g' l |
各个文件的具体含义, 请参考更详细的 cgroup 相关文档. |
|