(command.CommandList children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:tracing spids:[124]) op: Equal rhs: {(/sys/kernel/debug/tracing)} spids: [124] ) ] spids: [124] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:flock spids:[127]) op: Equal rhs: {(/var/tmp/.ftrace-lock)} spids: [127] ) ] spids: [127] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:bufsize_kb spids:[130]) op: Equal rhs: {(4096)} spids: [130] ) ] spids: [130] ) (command.CommandList children: [ (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_device spids:[133]) op: Equal rhs: {(0)} spids: [133] ) ] spids: [133] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:device spids:[137]) op: Equal rhs: (word.EmptyWord) spids: [137] ) ] spids: [137] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_iotype spids:[140]) op: Equal rhs: {(0)} spids: [140] ) ] spids: [140] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:iotype spids:[144]) op: Equal rhs: (word.EmptyWord) spids: [144] ) ] spids: [144] ) terminator: <Op_Semi ';'> ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_timestamp spids:[147]) op: Equal rhs: {(0)} spids: [147] ) ] spids: [147] ) ] ) (command.CommandList children: [ (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_interval spids:[150]) op: Equal rhs: {(0)} spids: [150] ) ] spids: [150] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:interval spids:[154]) op: Equal rhs: {(1)} spids: [154] ) ] spids: [154] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_count spids:[158]) op: Equal rhs: {(0)} spids: [158] ) ] spids: [158] ) terminator: <Op_Semi ';'> ) (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:count spids:[162]) op: Equal rhs: {(0)} spids: [162] ) ] spids: [162] ) terminator: <Op_Semi ';'> ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_queue spids:[166]) op: Equal rhs: {(0)} spids: [166] ) ] spids: [166] ) ] ) (C {(trap)} {(SQ <':'>)} {(INT)} {(QUIT)} {(TERM)} {(PIPE)} {(HUP)}) (command.FuncDef name: usage body: (command.BraceGroup children: [ (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(END)} here_end_span_id: 223 stdin_parts: [ ('USAGE: iolatency [-hQT] [-d device] [-i iotype] [interval [count]]\n') (' -d device # device string (eg, ') (Right_DoubleQuote '"') ('202,1)\n') (" -i iotype # match type (eg, '*R*' for all reads)\n") (' -Q # use queue insert as start time\n') (' -T # timestamp on output\n') (' -h # this usage message\n') (' interval # summary interval, seconds (default 1)\n') (' count # number of summaries\n') (' eg,\n') (' iolatency # summarize latency every second\n') (' iolatency -Q # include block I/O queue time\n') (' iolatency 5 2 # 2 x 5 second summaries\n') (" iolatency -i '*R*' # trace reads\n") (' iolatency -d 202,1 # trace device 202,1 only\n') ('\n') ('See the man page and example file for more info.\n') ] ) (redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)}) ] ) (command.ControlFlow token:<ControlFlow_Exit exit>) ] spids: [193] ) spids: [189 192] ) (command.FuncDef name: warn body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [(C {(eval)} {(DQ ($ VSub_At '$@'))})] negated: T ) terminator: <Op_Semi ';'> ) ] action: [ (command.SimpleCommand words: [ {(echo)} { (DQ ('WARNING: command failed ') (word_part.EscapedLiteralPart token: <Lit_EscapedChar '\\"'> ) ($ VSub_At '$@') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ) } ] redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})] ) ] spids: [16777215 248] ) ] spids: [16777215 264] ) ] spids: [234] ) spids: [230 233] ) (command.FuncDef name: end body: (command.BraceGroup children: [ (command.SimpleCommand words: [{(echo)}] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) (command.SimpleCommand words: [{(echo)} {(DQ ('Ending tracing...'))}] redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})] ) (C {(cd)} {($ VSub_DollarName '$tracing')}) (C {(warn)} {(DQ ('echo 0 > events/block/') ($ VSub_DollarName '$b_start') (/enable))}) (C {(warn)} {(DQ ('echo 0 > events/block/block_rq_complete/enable'))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithBinary op_id: Arith_DPipe left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_device>) right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_iotype>) ) spids: [319 328] ) terminator: <Op_Semi ';'> ) ] action: [ (C {(warn)} {(DQ ('echo 0 > events/block/') ($ VSub_DollarName '$b_start') (/filter))} ) (C {(warn)} {(DQ ('echo 0 > events/block/block_rq_complete/filter'))}) ] spids: [16777215 331] ) ] spids: [16777215 350] ) (C {(warn)} {(DQ ('echo > trace'))}) (command.AndOr ops: [Op_DAmp] children: [ (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike wroteflock>) spids: [360 365] ) (C {(warn)} {(DQ ('rm ') ($ VSub_DollarName '$flock'))}) ] ) ] spids: [273] ) spids: [269 272] ) (command.FuncDef name: die body: (command.BraceGroup children: [ (command.SimpleCommand words: [{(echo)} {(DQ ($ VSub_At '$@'))}] redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})] ) (command.ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [383] ) spids: [379 382] ) (command.FuncDef name: edie body: (command.BraceGroup children: [ (command.SimpleCommand words: [{(echo)} {(DQ ($ VSub_At '$@'))}] redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})] ) (command.SimpleCommand words: [{(exec)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)}) (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)}) ] ) (C {(end)}) (command.ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [407] ) spids: [403 406] ) (command.WhileUntil keyword: <KW_While while> cond: [(C {(getopts)} {(d) (Lit_Other ':') (hi) (Lit_Other ':') (QT)} {(opt)})] body: (command.DoGroup children: [ (command.Case to_match: {($ VSub_DollarName '$opt')} arms: [ (case_arm pat_list: [{(d)}] action: [ (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_device spids:[471]) op: Equal rhs: {(1)} spids: [471] ) ] spids: [471] ) terminator: <Op_Semi ';'> ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:device spids:[475]) op: Equal rhs: {($ VSub_DollarName '$OPTARG')} spids: [475] ) ] spids: [475] ) ] spids: [468 469 478 16777215] ) (case_arm pat_list: [{(i)}] action: [ (command.Sentence child: (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_iotype spids:[484]) op: Equal rhs: {(1)} spids: [484] ) ] spids: [484] ) terminator: <Op_Semi ';'> ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:iotype spids:[488]) op: Equal rhs: {($ VSub_DollarName '$OPTARG')} spids: [488] ) ] spids: [488] ) ] spids: [481 482 491 16777215] ) (case_arm pat_list: [{(Q)}] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_queue spids:[497]) op: Equal rhs: {(1)} spids: [497] ) ] spids: [497] ) ] spids: [494 495 500 16777215] ) (case_arm pat_list: [{(T)}] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_timestamp spids:[506]) op: Equal rhs: {(1)} spids: [506] ) ] spids: [506] ) ] spids: [503 504 509 16777215] ) (case_arm pat_list: [{(h)} {(Lit_Other '?')}] action: [(C {(usage)})] spids: [512 515 519 16777215] ) ] spids: [461 465 522] ) ] spids: [458 524] ) ) (C {(shift)} { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Minus left: (arith_expr.ArithWord w:{($ VSub_DollarName '$OPTIND')}) right: (arith_expr.ArithWord w:{(Lit_Digits 1)}) ) spids: [528 537] ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithWord w:{($ VSub_Pound '$#')}) spids: [541 546] ) terminator: <Op_Semi ';'> ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_interval spids:[552]) op: Equal rhs: {(1)} spids: [552] ) ] spids: [552] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:interval spids:[556]) op: Equal rhs: {($ VSub_Number '$1')} spids: [556] ) ] spids: [556] ) (C {(shift)}) ] spids: [16777215 549] ) ] spids: [16777215 562] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithWord w:{($ VSub_Pound '$#')}) spids: [566 571] ) terminator: <Op_Semi ';'> ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:opt_count spids:[577]) op: Equal rhs: {(1)} spids: [577] ) ] spids: [577] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:count spids:[581]) op: Equal rhs: {($ VSub_Number '$1')} spids: [581] ) ] spids: [581] ) ] spids: [16777215 574] ) ] spids: [16777215 584] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_device>) spids: [588 593] ) terminator: <Op_Semi ';'> ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:major spids:[599]) op: Equal rhs: { (word_part.BracedVarSub token: <VSub_Name device> suffix_op: (suffix_op.StringUnary op_id:VOp1_Percent arg_word:{(',*')}) spids: [600 604] ) } spids: [599] ) ] spids: [599] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:minor spids:[607]) op: Equal rhs: { (word_part.BracedVarSub token: <VSub_Name device> suffix_op: (suffix_op.StringUnary op_id:VOp1_Pound arg_word:{('*,')}) spids: [608 612] ) } spids: [607] ) ] spids: [607] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:dev spids:[615]) op: Equal rhs: { (word_part.ArithSubPart anode: (arith_expr.ArithBinary op_id: Arith_Plus left: (arith_expr.ArithBinary op_id: Arith_DLess left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike major>) right: (arith_expr.ArithWord w:{(Lit_Digits 20)}) ) right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike minor>) ) spids: [616 631] ) } spids: [615] ) ] spids: [615] ) ] spids: [16777215 596] ) ] spids: [16777215 633] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_queue>) spids: [637 642] ) terminator: <Op_Semi ';'> ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:b_start spids:[648]) op: Equal rhs: {(block_rq_insert)} spids: [648] ) ] spids: [648] ) ] spids: [16777215 645] ) ] else_action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:b_start spids:[654]) op: Equal rhs: {(block_rq_issue)} spids: [654] ) ] spids: [654] ) ] spids: [651 657] ) (command.AndOr ops: [Op_DAmp Op_DPipe] children: [ (command.DBracket expr:(bool_expr.BoolUnary op_id:BoolUnary_x child:{(/usr/bin/mawk)})) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:awk spids:[673]) op: Equal rhs: {(SQ <'mawk -W interactive'>)} spids: [673] ) ] spids: [673] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:awk spids:[680]) op: Equal rhs: {(awk)} spids: [680] ) ] spids: [680] ) ] ) (command.AndOr ops: [Op_DPipe] children: [ (C {(cd)} {($ VSub_DollarName '$tracing')}) (C {(die)} { (DQ ('ERROR: accessing tracing. Root user? Kernel has FTRACE?\n') (' debugfs mounted? (mount -t debugfs debugfs /sys/kernel/debug)') ) } ) ] ) (command.AndOr ops: [Op_DAmp] children: [ (command.DBracket expr: (bool_expr.BoolUnary op_id:BoolUnary_e child:{($ VSub_DollarName '$flock')}) ) (C {(die)} { (DQ ('ERROR: ftrace may be in use by PID ') (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(cat)} {($ VSub_DollarName '$flock')})] ) left_token: <Left_CommandSub '$('> spids: [718 722] ) (' ') ($ VSub_DollarName '$flock') ) } ) ] ) (command.AndOr ops: [Op_DPipe] children: [ (command.SimpleCommand words: [{(echo)} {($ VSub_Dollar '$$')}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {($ VSub_DollarName '$flock')} ) ] ) (C {(die)} {(DQ ('ERROR: unable to write ') ($ VSub_DollarName '$flock') (.))}) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:wroteflock spids:[745]) op: Equal rhs: {(1)} spids: [745] ) ] spids: [745] ) (C {(warn)} {(DQ ('echo nop > current_tracer'))}) (C {(warn)} {(DQ ('echo ') ($ VSub_DollarName '$bufsize_kb') (' > buffer_size_kb'))}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:filter spids:[766]) op: Equal rhs: (word.EmptyWord) spids: [766] ) ] spids: [766] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_iotype>) spids: [770 775] ) terminator: <Op_Semi ';'> ) ] action: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:filter spids:[781]) op: Equal rhs: { (DQ ('rwbs ~ ') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ($ VSub_DollarName '$iotype') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ) } spids: [781] ) ] spids: [781] ) ] spids: [16777215 778] ) ] spids: [16777215 789] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_device>) spids: [793 798] ) terminator: <Op_Semi ';'> ) ] action: [ (command.AndOr ops: [Op_DAmp] children: [ (command.DBracket expr: (bool_expr.BoolBinary op_id: BoolBinary_GlobNEqual left: {(DQ ($ VSub_DollarName '$filter'))} right: {(DQ )} ) ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:filter spids:[819]) op: Equal rhs: {(DQ ($ VSub_DollarName '$filter') (' && '))} spids: [819] ) ] spids: [819] ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:filter spids:[826]) op: Equal rhs: {(DQ (${ VSub_Name filter) ('dev == ') ($ VSub_DollarName '$dev'))} spids: [826] ) ] spids: [826] ) ] spids: [16777215 801] ) ] spids: [16777215 835] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithBinary op_id: Arith_DPipe left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_iotype>) right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_device>) ) spids: [839 848] ) terminator: <Op_Semi ';'> ) ] action: [ (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Op_DPipe] children: [ (command.Pipeline children: [ (command.SimpleCommand words: [{(echo)} {(DQ ($ VSub_DollarName '$filter'))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(events/block/) ($ VSub_DollarName '$b_start') (/filter)} ) ] ) ] negated: T ) (command.Pipeline children: [ (command.SimpleCommand words: [{(echo)} {(DQ ($ VSub_DollarName '$filter'))}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(events/block/block_rq_complete/filter)} ) ] ) ] negated: T ) ] ) ] action: [(C {(edie)} {(DQ ('ERROR: setting -d or -t filter. Exiting.'))})] spids: [16777215 887] ) ] spids: [16777215 897] ) ] spids: [16777215 851] ) ] spids: [16777215 899] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.AndOr ops: [Op_DPipe] children: [ (command.Pipeline children: [ (command.SimpleCommand words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(events/block/) ($ VSub_DollarName '$b_start') (/enable)} ) ] ) ] negated: T ) (command.Pipeline children: [ (command.SimpleCommand words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(events/block/block_rq_complete/enable)} ) ] ) ] negated: T ) ] ) terminator: <Op_Semi ';'> ) ] action: [(C {(edie)} {(DQ ('ERROR: enabling block I/O tracepoints. Exiting.'))})] spids: [16777215 930] ) ] spids: [16777215 939] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:etext spids:[941]) op: Equal rhs: (word.EmptyWord) spids: [941] ) ] spids: [941] ) (command.AndOr ops: [Op_DAmp] children: [ (command.DParen child: (arith_expr.ArithUnary op_id: Arith_Bang child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_count>) ) spids: [943 949] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:etext spids:[953]) op: Equal rhs: {(DQ (' Ctrl-C to end.'))} spids: [953] ) ] spids: [953] ) ] ) (C {(echo)} { (DQ ('Tracing block I/O. Output every ') ($ VSub_DollarName '$interval') (' seconds.') ($ VSub_DollarName '$etext') ) } ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:offset spids:[989]) op: Equal rhs: { (word_part.CommandSubPart command_list: (command.CommandList children: [ (C {($ VSub_DollarName '$awk')} { (SQ <'BEGIN { o = 0; }\n'> <'\t$1 == "#" && $2 ~ /TASK/ && NF == 6 { o = 1; }\n'> <'\t$2 ~ /TASK/ { print o; exit }'> ) } {(trace)} ) ] ) left_token: <Left_CommandSub '$('> spids: [990 1000] ) } spids: [989] ) ] spids: [989] ) (C {(warn)} {(DQ ('echo > trace'))}) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:i spids:[1012]) op: Equal rhs: {(0)} spids: [1012] ) ] spids: [1012] ) (command.Pipeline children: [ (command.WhileUntil keyword: <KW_While while> cond: [ (command.Sentence child: (command.DParen child: (arith_expr.ArithBinary op_id: Arith_DPipe left: (arith_expr.ArithUnary op_id: Arith_Bang child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_count>) ) right: (arith_expr.ArithBinary op_id: Arith_Less left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike i>) right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike count>) ) ) spids: [1017 1033] ) terminator: <Op_Semi ';'> ) ] body: (command.DoGroup children: [ (command.DParen child: (arith_expr.UnaryAssign op_id: Node_PostDPlus child: (lhs_expr.LhsName name:i spids:[1041]) ) spids: [1039 1045] ) (C {(sleep)} {($ VSub_DollarName '$interval')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.BoolUnary op_id:BoolUnary_x child:{(snapshot)}) ) terminator: <Op_Semi ';'> ) ] action: [ (command.SimpleCommand words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: {(snapshot)} ) ] ) (command.SimpleCommand words: [{(echo)}] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(trace)})] ) (C {(cat)} {(snapshot)}) ] spids: [16777215 1069] ) ] else_action: [ (C {(cat)} {(trace)}) (command.SimpleCommand words: [{(echo)}] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(trace)})] ) ] spids: [1093 1108] ) (command.AndOr ops: [Op_DAmp] children: [ (command.DParen child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_timestamp>) spids: [1112 1117] ) (C {(printf)} {(DQ ('time %(%H:%M:%S)T:') (Lit_Other '\\') (n))} {(-1)}) ] ) (C {(echo)} {(DQ (tick))}) ] spids: [1036 1138] ) ) (C {($ VSub_DollarName '$awk')} {(-v)} {(Lit_VarLike 'o=') ($ VSub_DollarName '$offset')} {(-v)} {(Lit_VarLike 'opt_timestamp=') ($ VSub_DollarName '$opt_timestamp')} {(-v)} {(Lit_VarLike 'b_start=') ($ VSub_DollarName '$b_start')} { (SQ <'\n'> <'\tfunction star(sval, smax, swidth) {\n'> <'\t\tstars = ""\n'> <'\t\tif (smax == 0) return ""\n'> <'\t\tfor (si = 0; si < (swidth * sval / smax); si++) {\n'> <'\t\t\tstars = stars "#"\n'> <'\t\t}\n'> <'\t\treturn stars\n'> <'\t}\n'> <'\n'> <'\tBEGIN { max_i = 0 }\n'> <'\n'> <'\t# common fields\n'> <'\t$1 != "#" {\n'> <'\t\ttime = $(3+o); sub(":", "", time)\n'> <'\t\tdev = $(5+o)\n'> <'\t}\n'> <'\n'> <'\t# block I/O request\n'> <'\t$1 != "#" && $0 ~ b_start {\n'> <'\t\t#\n'> <'\t\t# example: (fields1..4+o) 202,1 W 0 () 12862264 + 8 [tar]\n'> <'\t\t# The cmd field "()" might contain multiple words (hex),\n'> <'\t\t# hence stepping from the right (NF-3).\n'> <'\t\t#\n'> <'\t\tloc = $(NF-3)\n'> <'\t\tstarts[dev, loc] = time\n'> <'\t\tnext\n'> <'\t}\n'> <'\n'> <'\t# block I/O completion\n'> <'\t$1 != "#" && $0 ~ /rq_complete/ {\n'> <'\t\t#\n'> <'\t\t# example: (fields1..4+o) 202,1 W () 12862256 + 8 [0]\n'> <'\t\t#\n'> <'\t\tdir = $(6+o)\n'> <'\t\tloc = $(NF-3)\n'> <'\n'> <'\t\tif (starts[dev, loc] > 0) {\n'> <'\t\t\tlatency_ms = 1000 * (time - starts[dev, loc])\n'> <'\t\t\ti = 0\n'> <'\t\t\tfor (ms = 1; latency_ms > ms; ms *= 2) { i++ }\n'> <'\t\t\thist[i]++\n'> <'\t\t\tif (i > max_i)\n'> <'\t\t\t\tmax_i = i\n'> <'\t\t\tdelete starts[dev, loc]\n'> <'\t\t}\n'> <'\t\tnext\n'> <'\t}\n'> <'\n'> <'\t# timestamp\n'> <'\t$1 == "time" {\n'> <'\t\tlasttime = $2\n'> <'\t}\n'> <'\n'> <'\t# print summary\n'> <'\t$1 == "tick" {\n'> <'\t\tprint ""\n'> <'\t\tif (opt_timestamp)\n'> <'\t\t\tprint lasttime\n'> <'\n'> <'\t\t# find max value\n'> <'\t\tmax_v = 0\n'> <'\t\tfor (i = 0; i <= max_i; i++) {\n'> <'\t\t\tif (hist[i] > max_v)\n'> <'\t\t\t\tmax_v = hist[i]\n'> <'\t\t}\n'> <'\n'> <'\t\t# print histogram\n'> <'\t\tprintf "%8s .. %-8s: %-8s |%-38s|\\n", ">=(ms)", "<(ms)",\n'> <'\t\t "I/O", "Distribution"\n'> <'\t\tms = 1\n'> <'\t\tfrom = 0\n'> <'\t\tfor (i = 0; i <= max_i; i++) {\n'> <'\t\t\tprintf "%8d -> %-8d: %-8d |%-38s|\\n", from, ms,\n'> <'\t\t\t hist[i], star(hist[i], max_v, 38)\n'> <'\t\t\tfrom = ms\n'> <'\t\t\tms *= 2\n'> <'\t\t}\n'> <'\t\tfflush()\n'> <'\t\tdelete hist\n'> <'\t\tdelete starts\t# invalid if events missed between snapshots\n'> <'\t\tmax_i = 0\n'> <'\t}\n'> <'\n'> <'\t$0 ~ /LOST.*EVENTS/ { print "WARNING: " $0 > "/dev/stderr" }\n'> ) } ) ] negated: F ) (C {(end)}) ] )