|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, q2 V' j/ p" T( ]前一篇介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.2 F, V' w# P6 U# K7 `
" _. r) u& G. m4 D% z前提条件
1 I- S0 v) @" T5 V如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.1 _6 r4 l2 o; E
! S5 ?1 h" B7 q+ a) [4 G; O% O" }
CONFIG_BLK_CGROUP=y
" G: R6 Z& n! G/ [) R9 h: o) fCONFIG_CFQ_GROUP_IOSCHED=y
+ p/ R( @; \& A" @7 z& ~查看是否开启这2个内核编译选项的方法很简单:
( P: J) O6 J; Z* v. s3 P! M( ^# Y
' b# B* S6 f ]3 u% [root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`9 a$ T9 K1 ~2 z/ U% e5 Q
root@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`0 n1 N/ I! h& Y# G+ _
如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.
- g. y7 Z( G j. A8 V* e. u! n, D
3 z8 U% m- n1 O) d, k; L3 b7 G% `
2 f0 A" H% @# a1 t* s9 G) k/ Q3 l, }4 c% {: b; B
再次通过 /proc/cgroups 来查看 blkio 是否已经启用.
/ {, i3 Q( K% ~8 Q
, A' Y( b1 T. P4 y* b复制代码' K- ~3 _5 B. ^6 ], l( C: G4 x
root@debian-113:~# cat /proc/cgroups & |0 _4 d2 _4 G4 P3 m0 i- n
#subsys_name hierarchy num_cgroups enabled
# j- d: V; |/ gcpuset 0 1 1
n- d4 U9 [/ ?' dcpu 0 1 11 d" H4 I2 Z5 `, A; R' m8 ^4 K$ S
cpuacct 0 1 1
# P9 A* d. y9 g: t" N2 }4 ymemory 0 1 1% g4 {* N n( i1 L& I! c2 r5 ~" L
devices 0 1 1
, U0 v7 }6 H! F8 k. g0 kfreezer 0 1 1- M9 w9 T/ @' ^. G5 a0 }' E$ v
net_cls 0 1 13 H' e' o9 J: T1 T6 ~
blkio 0 1 1 <-- enabled = 1, 说明已经启用
) S. F& Q1 K$ [& U4 OpeRF_event 0 1 1: ?& [ r' O" G# m9 k
复制代码& f# {! n* {0 E1 _/ j
如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.
; y5 Z5 r$ `7 ?4 r% X0 A& S6 \0 m' F7 w2 A h: r
类似的可以参考: Linux资源控制-CPU和内存 中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。6 a+ d$ k. L0 ?
& L: E% ?+ V; ?3 D5 L
& U' \* W+ o2 H. k6 ]! O$ K- W2 a W" [
除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.
( W8 q; \, ~; l! Z7 a, _% o. S+ k& D. X" v! {
root@debian-113:~# cat /sys/class/block/sda/queue/scheduler
9 x( Q/ N+ p: Y1 h% Vnoop deadline [cfq]
3 i0 ?# k" a; ]) K7 B, d上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.! z2 P, w b3 E' L
) T; s3 w+ U! w# F如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.2 P- _6 I+ b$ L$ M
8 e, V) E- ^, m% c% z% r5 r( ]
如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么" G& X# |- y: \/ X: r0 ]; d
$ G! I$ ~' j5 w. a7 ocat cfq /sys/class/block/sda/queue/scheduler <-- 将当前的IO调度程序设置成 cfq
0 s6 v: l) ?- q2 f/ B注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.
: q5 s' l$ y( [7 l, P# z1 i, B/ Q1 |# _7 M/ k0 ?3 p
$ m# U# P, R: v7 ]. [$ b6 b1 q; j
& ?0 J" Q' L4 M. M9 m
实例 - 控制IO优先级) }- F6 i& X6 m0 H
挂载 cgroup文件系统, 挂载参数 -o blkio
6 j: D3 X5 u- p# a建立2个group, 分别为 A 和 B
: w, l/ r( r% M& b5 B" \# H2 u; a默认情况, 2个 group中的dd进程同时进行文件操作( L+ }2 i [8 u9 p8 Q
查看默认情况下, 2个dd进程完成的时间6 g6 z- M& z: x2 j) v; O! l
设置 A 的优先级为 100, B 的优先级为 10005 K! V: }, ]& v& E. ~2 B9 k: v
同时在2个group A 和 B 中运行 dd进程" V6 F" [' @% w/ v
查看group A 和 B 中的 dd进程完成的时间! P+ z8 f+ k' Z+ A# l5 R
, y4 [/ m' J- |# n
/ `4 a% G2 R; ]0 M1 X7 G/ u/ z
实验之前, 先制作测试脚本. (简单写了一个如下)
8 R: s- U2 c& K) |, e/ X
6 z. ?5 [3 F' E6 t# J复制代码1 X/ T4 G0 U6 P' Y2 I. ]# ~/ \( S
#!/bin/bash
4 Y! T# M: C6 V/ x5 Q9 L) d& D/ I+ a, |* t
####################################################################: [- u3 p. k3 \" M( p
# 1. 创造2个测试文件, 大小都是1G
' S. T, ~+ U/ ^& S# 2. 将当前进程加入到指定 cgroup }3 X/ \+ D% V' U1 l( j
# 3. 执行 dd 操作/ {# O% r6 P$ P1 z3 B
# 4. 删除 测试文件
' P3 m$ ?1 ?+ ]8 b( E# l5 f# 5. 显示log' C) v6 a/ r1 L7 t! H' x
####################################################################/ g* V( c+ o: o! D) A7 }, T- L
8 P! b Z/ Y S& k* m
function usage()
+ k6 H0 w+ K" }7 y5 b{
2 [/ Y- @6 W8 k: j$ Z0 w echo "./blkio-test.sh <group1> <group2>" q) H' y% f2 v" M) O9 F( U
exit 1$ F6 s( n! G6 u
}
. Z- W; V/ Y4 |4 B. C/ D8 ~) a" s# o; l1 f. \- e" ~
if [ $# != 2 ]; then8 Y' J7 b5 j; }! h, R" o- Q
usage
( y, x) t, Q/ D0 n9 a. Ufi
) w$ z! P! |2 g. N& ~# j3 ]* ~' y. ^9 j) W E% G( @9 [) x
group1_src=~/group1.src
7 L: X' m- b# [$ mgroup2_src=~/group2.src7 e) p' I/ V% S. N% n
8 \9 h) ^' \+ [
group1_log=/tmp/group1.log
' _/ _& u! u( b; Q O+ Ggroup2_log=/tmp/group2.log
# B n3 p* Y# ^! l, g
2 G" P$ X/ }( p s' egroup1=$1; N5 {2 X* q- K" Z1 Z7 [4 b
group2=$2
; z. L1 D: x3 V7 f' S3 m
" x; w9 W7 o$ n- K4 r$ k, Iecho "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
: I B, c$ J& l8 bdd if=/dev/zero of=$group1_src count=1024 bs=1M3 N) L. ?" f" k& B: [
dd if=/dev/zero of=$group2_src count=1024 bs=1M* V3 G5 {+ A4 h- y4 d. K- o
/ m Q) n6 t/ U$ f5 S0 {2 [3 D
echo "同时在 $group1 和 $group2 中开始 dd 测试"
. W8 [" M# w) ]- ]8 D& Mecho 3 > /proc/sys/vm/drop_caches+ K6 L( V" F) e1 {! S5 [4 h) {
echo $$ >> $group1/tasks
( G# P# N+ j2 g; O$ @" H0 m1 ?(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &
* x% }# w' ^& ~1 W( I
5 r1 K) _% {3 n" K8 L5 A3 E1 Gecho $$ >> $group2/tasks
; `1 u3 l! W3 \, b(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &( Y' Q, Z2 G+ j) ]& ~
3 X. e0 I- F- Z9 d1 r
wait
- e+ c( W" {' M4 {7 p& i4 wecho "测试完成!"4 ^$ k& g8 h7 Z3 }8 v
' e( M0 J* n8 G6 X
echo "开始清除测试文件"
+ g7 T& u; \; ~/ _; [" Q) o+ k5 Crm -rf $group1_src $group2_src
: U$ N7 W Q0 W) ^echo "测试文件清除完成"
- o# l" r6 v0 F' w0 I) x
. b( { R# }% R1 d; E- G, Gecho "------------------------------------------"
9 {& d( |) p6 ~* {/ ~* P# Jecho "显示group1 的log"! f8 a6 r. Y4 i7 m, _: b' O, H
cat $group1_log
5 n$ m! K; c' O, F
0 U0 o: v8 c9 V( Jecho "------------------------------------------"4 u# T2 t" a' `+ T0 h
echo "显示group2 的log"
! }' o' h. {8 X. o$ _cat $group2_log
% A/ k" K. z1 L( w/ s2 |+ E7 S, M$ d
echo "------------------------------------------"# `% _. r3 `. s }) X
复制代码; |4 y- X3 |5 @9 v
) O) \+ E2 k3 c; U4 ]% q$ N5 n
) B' q- ~- q1 `% p0 U% r& y% G
开始实验:
+ v7 X# {3 f% U, R# T+ \4 W: b5 a, ^. }4 Z8 C2 j) `; Y, p
复制代码8 W% k: ?4 R" m
# 挂载 cgroup 文件系统
% o9 S; O; V, D2 V$ D+ V, j* P( W+ Groot@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/
$ @' |( G+ i. Y5 h z$ E; X2 M: d/ p, |/ F/ W6 [8 A+ y
root@debian-113:~# mkdir /mnt/cgroup/{A,B}$ F! e3 R; K: H" \8 q+ o
root@debian-113:~# ll /mnt/cgroup/
- I# b: C) |& H, `; _total 0% ?3 g$ a5 F; Z# O5 T) E
drwxr-xr-x 2 root root 0 Sep 5 13:23 A
( k; V+ G8 [) T6 K1 H% j( Udrwxr-xr-x 2 root root 0 Sep 5 13:23 B0 W& n. f9 |, u, K
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_merged' x. E! v/ ]) b) U0 {) ~
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_queued0 m# n# t# R& E8 P0 h+ _2 m! H
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_bytes
) z; C# Y& h7 {& q. w1 A3 }-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_serviced
' @8 w7 E5 X* l) [+ v4 y0 g-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_time( l& N4 ^( @" F' O* H3 Z
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_wait_time
' k0 l# Y' C) J, a6 Y9 P--w------- 1 root root 0 Sep 5 13:23 blkio.reset_stats
; c, Q9 v) i! H3 M+ X* [ l/ x-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.sectors8 J8 |3 H% l$ i, i, B1 h$ u% w
-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.time
; [8 F) Y$ v7 z# S! }: u-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight <-- 这个就是设置IO优先级的文件* O7 I( O. y5 e- X( A
-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight_device
" H9 Z0 ]) p5 Z j4 J y-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.clone_children
2 |; O# H& L, H2 C--w--w--w- 1 root root 0 Sep 5 13:23 cgroup.event_control. Z: m3 |% o3 Y
-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.procs" B1 N' L, G5 s6 R2 _, ]
-rw-r--r-- 1 root root 0 Sep 5 13:23 notify_on_release. E/ y# c1 L! O7 h! z' A
-rw-r--r-- 1 root root 0 Sep 5 13:23 release_agent+ n; T" ]# [# J+ ?
-rw-r--r-- 1 root root 0 Sep 5 13:23 tasks6 @2 O2 G E2 \) `. M6 n
7 D6 b& B5 M% a8 d, D# 默认2个组内的IO优先级都是500
1 }# }$ Y! _- ?- ]: @/ B! jroot@debian-113:~# cat /mnt/cgroup/A/blkio.weight& d2 [7 F6 g( i# A B7 y
500 <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高
1 }9 M6 d7 k: o6 K( d6 F/ aroot@debian-113:~# cat /mnt/cgroup/B/blkio.weight
7 U3 @- Q- H2 W( p2 m6 n500
2 _: j3 ]+ H7 L# I9 R( H# D8 Z0 k6 p' o# P: R* l
# 默认情况下的测试结果如下: A和B耗时都是 20秒
# X+ z$ B' F7 H0 ]3 Lroot@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B) r' k; i2 m* B3 n; R3 m3 e8 v0 g+ f
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)( o& H# e W7 v4 N
1024+0 records in
5 B6 Q- `( N8 N. s2 g$ |) H4 a1024+0 records out
7 M: s( a: X9 s' N# S2 Q- D' J' K9 X1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s0 e* K$ t. q2 z2 B: e+ ?
1024+0 records in
1 y, G5 Q( b' r- \( A* V/ u1024+0 records out A/ |$ m) L) X) b( Q3 @8 R8 {) A
1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s3 l+ ~' Q. R$ m1 u% Q% N" Q
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
% l1 N( U' K$ o4 x# v4 I( p测试完成!8 |, Y+ W. f2 ~( c/ d( I# s6 s0 c
开始清除测试文件
3 I3 k, Y$ g/ m# }2 p测试文件清除完成/ {8 j4 {( r4 g- H5 F
------------------------------------------2 F2 K* }8 g& B/ e' q7 M
显示group1 的log5 g' \6 e5 w" k1 g8 Y" K4 y7 C U4 z
Fri Sep 5 13:26:31 CST 20147 B; W, F+ I( D* X/ G
2097152+0 records in
# }* T5 T, p+ [4 i2097152+0 records out L: f- q, P1 k8 k4 g5 G7 x0 H% i7 \
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
9 G2 Y: D$ v+ j0 ZFri Sep 5 13:26:51 CST 2014
% v7 h0 I. D' Z; `* f1 @9 W------------------------------------------
/ Z6 x: K3 o& R# y- w+ L# W; V& ~9 Q显示group2 的log9 A0 j2 ^1 y o, v9 { ^
Fri Sep 5 13:26:31 CST 20141 l' I& {. p5 b- ]5 X& y/ K) z) u
2097152+0 records in
6 L) Y9 R' Q$ N( v/ c, r2097152+0 records out
( e7 A, U% `" A' C9 {1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
- V4 n* ?& s9 C- A: F: JFri Sep 5 13:26:51 CST 2014. T0 s+ J/ u: Q7 o4 Y
------------------------------------------
d0 h% w' Z5 J% v! c+ i1 X' O# G2 j9 T
# 修改A的优先级为100, B的优先级为1000
0 o2 p" n/ n5 |/ v7 ?) Hroot@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight
- V1 x$ D- h: `7 V; G% [# Q7 hroot@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight
6 W# q6 }. K0 {, jroot@debian-113:~# cat /mnt/cgroup/A/blkio.weight1 i8 q1 C/ v5 F( @: e- T
100: b7 b( w. ^) E F/ {5 z# Y
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight; q6 F- V6 `1 g$ g$ G) q! ?
1000& l# f- S6 @3 y, K' U. W
/ B) W: [, P5 a4 N! ^$ d2 e; F2 j
# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
/ {+ f7 v+ N5 ~' Croot@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
! n' d$ _ ?& \9 L生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)2 p# t5 D! d4 H4 b+ Q2 p
1024+0 records in
$ E" |* A! ~2 n. H' T2 E4 y1024+0 records out* E. Y7 Z# T" W( T
1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s& k' h% w) g$ ]1 h% t
1024+0 records in) y! n# b0 d6 {/ d- C% _
1024+0 records out+ u/ v8 k' @. o7 f/ H# m5 K
1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s
/ x! I( q0 @ b5 u同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试* O' H8 O. ~- Z, V" \, w
测试完成!
5 W/ p' j/ }) b9 ^开始清除测试文件6 R3 |0 R8 S2 v
测试文件清除完成( x! p$ J- ^4 g8 d# w
------------------------------------------! R! `' w+ q( E7 h8 N# `1 x
显示group1 的log$ ^5 u- G: ` x7 V4 A. f: q
Fri Sep 5 13:30:06 CST 20147 C3 ~: s7 n* O# f8 \# @% z" y
2097152+0 records in
- D S3 x& R8 ]+ U* b2097152+0 records out
/ `- [$ D% v1 y0 @8 X/ u- _" A1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s" Z. s8 s. _1 L8 \& p4 U8 b- H( D
Fri Sep 5 13:30:25 CST 2014
X6 \( n5 s$ e3 U; r& Q8 G------------------------------------------
0 `% A9 A) E6 [* F" U显示group2 的log
$ |. B; j! m; R6 E8 tFri Sep 5 13:30:06 CST 2014
" z' z7 N4 n) P3 u2097152+0 records in
7 {$ f: B3 x/ F! ?0 W2097152+0 records out. i v" i& ]; T1 U
1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
5 T/ n* H D2 B. rFri Sep 5 13:30:17 CST 20144 g0 y, `. X& F; b
------------------------------------------
Q. e6 ?: u) i1 d复制代码+ @* T- `2 M% |! ?
4 C( G) y4 _. z' y
9 ]. |/ Y* B @* q6 J可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.
3 T* u7 z) ]6 S' V6 N! T, o/ P) b7 Q( D
" B3 @* _: x/ Y/ w+ i
9 q- L$ @9 J# R! w I+ t _; `$ @: R总结
2 I, m& z! x1 [+ F2 q! g9 h( L$ o其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件.
9 r- \% k) u; W% y7 J$ U, s. v- D- P- N" t8 Q2 s/ x3 a
各个文件的具体含义, 请参考更详细的 cgroup 相关文档. |
|