a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 45|回复: 0

[综合辅导] Linux认证之Linux下谁在切换我们的进程

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证之Linux下谁在切换我们的进程
, S4 a% W: a/ l0 p& m% ?Linux下谁在切换我们的进程' V! A. i' n- m
我们在做Linux服务器的时候经常会需要知道谁在做进程切换,什么原因需要做进程切换。 因为进程切换的代价很高,我给出一个LMbench测试出来的数字:
- y$ ]" n4 {( V" @1 I9 t& \Context switching – times in microseconds – smaller is better
2 Q$ ]2 O9 ]7 }& K8 `" m) F. C————————————————————————-
$ M$ j" c! u9 s$ c& E$ kHost OS 2p/0K 2p/16K 2p/64K 8p/16K 8p/64K 16p/16K 16p/64K
4 m$ j5 m# G" p' c! yctxsw ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw
3 O7 n8 W" R- C6 x. ~6 h3 R% c——— ————- —— —— —— —— —— ——- ——-. D5 Y8 Q9 ~* F* r+ `7 [
my174.cm4 Linux 2.6.18- 6.1100 7.0200 6.1100 8.7400 7.7200 8.96000 9.62000
+ s8 E# C5 x. e& a5 k2 b在我的很高端的服务器上,进程切换的开销在8us左右, 这个相对于高性能的服务器是不可接受的, 所以我们要在一个时间片内尽可能的多做事情,而不是把时间浪费在无谓的切换上。" w5 k% }: ^3 b% I3 n
好奇害死猫,我们来调查下谁在切换我们的进程:, E! O/ t' g8 w/ q& g. }5 |
view sourceprint?[root@my174 admin]# dstat 1, f" X* h( F- ~4 |! k; {! `+ o
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
6 M" g+ ~# k/ ^4 @) K+ F0 musr sys idl wai hiq siq| read writ| recv send| in out | int csw
& i9 E* j1 H  ?0 c: Q7 O0 0 100 0 0 0| 0 0 | 796B 1488B| 0 0 |1004 128- ?8 l) a4 Y7 F. z! q
0 0 100 0 0 0| 0 0 | 280B 728B| 0 0 |1005 1140 ]6 k  e1 n) _8 N& W1 ^
0 0 100 0 0 0| 0 0 | 280B 728B| 0 0 |1005 128
! Q% j* `% P4 ?2 ?. e, `9 e0 0 100 0 0 0| 0 0 | 280B 728B| 0 0 |1005 114
% ]" z+ e4 r8 ]8 _( a0 0 100 0 0 0| 0 320k| 280B 728B| 0 0 |1008 143/ d; J& ~9 K7 Z& `2 V" }% N# V
。..# }+ b; ^4 o7 X
我们可以看到 csw的数目是 120/S, 但是dstat或者vmstat类似的工具并没有告诉我们谁在干坏事。好吧!我们自己动手行吧。
/ I! e* \% c! @. ^4 w- y1 _5 }祭出我们可爱的systemtap!
- j% n% w7 e0 V" G) W7 M4 `! r% dview sourceprint?[root@my174 admin]# cat 》cswmon.stp
8 y( O5 L8 A* M3 r#! /usr/bin/env stap
0 y: P; S/ ]1 e, K* e#7 l# S; G6 x* F
#
7 Y0 e8 q6 H" A6 g7 Dglobal csw_count0 B4 j+ j- _3 w4 t7 w$ I
global idle_count6 \7 A+ o4 i7 i; U# K- G
probe scheduler.cpu_off {
* A9 x1 x2 `5 [1 E! p7 mcsw_count[task_prev, task_next]++4 u2 u1 Q/ }4 q6 y9 J
idle_count+=idle" |- D, h5 O/ V5 V. U8 o1 S
}
* V' _5 ]9 J- m6 x6 Dfunction fmt_task(task_prev, task_next): S* J& D8 h7 }5 T1 i4 ?
{
: D+ S/ [; J) {3 a  Q1 g, Sreturn sprintf(“%s(%d)-》%s(%d)”,( O, G+ _" }' N; _0 t
task_execname(task_prev),/ L' t) B+ [" p9 p9 p" u- x, x! q
task_pid(task_prev),: }9 G$ E# E$ B( D+ @0 e. `4 O) u
task_execname(task_next),! d6 h7 O, X# n1 N- Z. r1 Y
task_pid(task_next))
4 ~- d, B' O+ E3 {0 y6 Z. K0 q}* h  d8 z9 y) u) [% D# b
function print_cswtop () {
; ^, }9 O) l6 D# W7 fprintf (“%45s %10s\n”, “Context switch”, “COUNT”)
. C* U" `9 C5 `% X- rforeach ([task_prev, task_next] in csw_count- limit 20) {
7 x) T$ {8 U* A0 a$ O, J' l* Jprintf(“%45s %10d\n”, fmt_task(task_prev, task_next), csw_count[task_prev, task_next])% d, Q' Q6 W+ x  V: N% A, @
}
% G) [; v6 g& n5 t: ?# H- l+ W; X7 E/ K1 i5 M
* b4 w/ J8 ^. r6 U2 D
printf(“%45s %10d\n”, “idle”, idle_count)
1 Z$ z, J# m+ ?delete csw_count
6 y% H) [; i, P# a0 _$ Sdelete idle_count
4 T$ q3 o. U8 O}+ ?" p/ A4 ]3 d  M8 U
probe timer.s($1) {5 \( o: X8 q4 i* v: }% {0 r& A: e
print_cswtop ()
# O% {; F4 b- G, j4 Hprintf(“--------------------------------------------------------------\n”)
6 X; c. j0 q! D' g3 L3 M}
) k% j( E+ O/ a9 E5 C. RCTRL+D+ C( z" @8 q, j* J
这个脚本会每隔设定的时间打印出TOP 20切换最多的进程和他的pid, 我们来看下结果把:6 y6 E. q$ m9 U3 X2 l
view sourceprint?[root@my174 admin]# stap cswmon.stp 5
2 ~/ g& j5 |0 d" V3 zContext switch COUNT- C9 ~1 f' B" \+ |8 e2 Y# ^. `6 {$ V
swapper(0)-》systemtap/11(908) 500* I- D! J3 C) w/ t+ S* i
systemtap/11(908)-》swapper(0) 498
# k  v; {( P1 Sswapper(0)-》fct1-worker(2492) 508 A1 |$ X/ M. k& a
fct1-worker(2492)-》swapper(0) 50% h! R; f* t! z& _/ ?' }4 ^
swapper(0)-》fct0-worker(2191) 50
+ D5 n& H7 K* A' t; K- X" Xfct0-worker(2191)-》swapper(0) 50
+ p: ~: |8 g/ r7 xswapper(0)-》bond0(3432) 503 M+ T. h4 |3 B
bond0(3432)-》swapper(0) 50
- E$ K/ v2 x$ j% p9 a3 Nstapio(879)-》swapper(0) 26
* h& h- \% H1 Q8 h" M3 I4 Iswapper(0)-》stapio(879) 25
, N  a7 r1 Q/ K  x6 ^$ ostapio(879)-》swapper(0) 19. T  I# G1 q6 e1 {- [
swapper(0)-》stapio(879) 175 g% V) k6 X0 K) W+ l
swapper(0)-》watchdog/9(31) 53 e& ?9 P# Z$ `' D% b4 c" @
watchdog/9(31)-》swapper(0) 5) a# @- Y. P8 }2 y9 i
swapper(0)-》mysqld(18346) 5
9 z$ K% k" X7 d1 E+ _mysqld(18346)-》swapper(0) 50 M* o4 ~, f2 f! x3 M6 l
swapper(0)-》watchdog/13(43) 5  A+ x; o' G8 X- h0 D# a
watchdog/13(43)-》swapper(0) 5" y# S. n- O% [  z& R
swapper(0)-》watchdog/14(46) 5
& V. N0 x# F8 Y" r7 ?( Ewatchdog/14(46)-》swapper(0) 5
9 q. {3 m; A6 x; C4 }idle 859
1 L5 M. h5 m% c/ S4 W4 M--------------------------------------------------------------, h/ H; b$ E1 e: Y) {
我们可以看到进程从哪里切换到哪里,并且发生了多少次, 最后一行,我打印出来idle的次数,也就是说这时候系统没啥事情做,就切换到idle(0)这个进程去休息去了。
# h: K  y% \$ f" f通过上面的调查,我们会很清楚的了解到我们系统的开销发生在那里,方便我们定位问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 23:54 , Processed in 0.337184 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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