1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of softirqs, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard WorkerThis program traces soft interrupts (irqs), and stores timing statistics 5*387f9dfdSAndroid Build Coastguard Workerin-kernel for efficiency. For example: 6*387f9dfdSAndroid Build Coastguard Worker 7*387f9dfdSAndroid Build Coastguard Worker# ./softirqs 8*387f9dfdSAndroid Build Coastguard WorkerTracing soft irq event time... Hit Ctrl-C to end. 9*387f9dfdSAndroid Build Coastguard Worker^C 10*387f9dfdSAndroid Build Coastguard WorkerSOFTIRQ TOTAL_usecs 11*387f9dfdSAndroid Build Coastguard Workerrcu_process_callbacks 974 12*387f9dfdSAndroid Build Coastguard Workerrun_rebalance_domains 1809 13*387f9dfdSAndroid Build Coastguard Workerrun_timer_softirq 2615 14*387f9dfdSAndroid Build Coastguard Workernet_tx_action 14605 15*387f9dfdSAndroid Build Coastguard Workertasklet_action 38692 16*387f9dfdSAndroid Build Coastguard Workernet_rx_action 88188 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard WorkerThe SOFTIRQ column prints the interrupt action function name. While tracing, 19*387f9dfdSAndroid Build Coastguard Workerthe net_rx_action() soft interrupt ran for 20199 microseconds (20 milliseconds) 20*387f9dfdSAndroid Build Coastguard Workerin total. 21*387f9dfdSAndroid Build Coastguard Worker 22*387f9dfdSAndroid Build Coastguard WorkerThis tool works by dynamic tracing the individual softirq functions, and will 23*387f9dfdSAndroid Build Coastguard Workerneed to be adjusted to match kernel/module changes. Future versions should 24*387f9dfdSAndroid Build Coastguard Workeruse the softirq tracepoints instead. 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Worker 27*387f9dfdSAndroid Build Coastguard WorkerAn interval can be provided, and also optionally a count. Eg, printing output 28*387f9dfdSAndroid Build Coastguard Workerevery 1 second, and including timestamps (-T): 29*387f9dfdSAndroid Build Coastguard Worker 30*387f9dfdSAndroid Build Coastguard Worker# ./softirqs -T 1 3 31*387f9dfdSAndroid Build Coastguard WorkerTracing soft irq event time... Hit Ctrl-C to end. 32*387f9dfdSAndroid Build Coastguard Worker 33*387f9dfdSAndroid Build Coastguard Worker22:29:16 34*387f9dfdSAndroid Build Coastguard WorkerSOFTIRQ TOTAL_usecs 35*387f9dfdSAndroid Build Coastguard Workerrcu_process_callbacks 456 36*387f9dfdSAndroid Build Coastguard Workerrun_rebalance_domains 1005 37*387f9dfdSAndroid Build Coastguard Workerrun_timer_softirq 1196 38*387f9dfdSAndroid Build Coastguard Workernet_tx_action 2796 39*387f9dfdSAndroid Build Coastguard Workertasklet_action 5534 40*387f9dfdSAndroid Build Coastguard Workernet_rx_action 15075 41*387f9dfdSAndroid Build Coastguard Worker 42*387f9dfdSAndroid Build Coastguard Worker22:29:17 43*387f9dfdSAndroid Build Coastguard WorkerSOFTIRQ TOTAL_usecs 44*387f9dfdSAndroid Build Coastguard Workerrcu_process_callbacks 456 45*387f9dfdSAndroid Build Coastguard Workerrun_rebalance_domains 839 46*387f9dfdSAndroid Build Coastguard Workerrun_timer_softirq 1142 47*387f9dfdSAndroid Build Coastguard Workernet_tx_action 1912 48*387f9dfdSAndroid Build Coastguard Workertasklet_action 4428 49*387f9dfdSAndroid Build Coastguard Workernet_rx_action 14652 50*387f9dfdSAndroid Build Coastguard Worker 51*387f9dfdSAndroid Build Coastguard Worker22:29:18 52*387f9dfdSAndroid Build Coastguard WorkerSOFTIRQ TOTAL_usecs 53*387f9dfdSAndroid Build Coastguard Workerrcu_process_callbacks 502 54*387f9dfdSAndroid Build Coastguard Workerrun_rebalance_domains 840 55*387f9dfdSAndroid Build Coastguard Workerrun_timer_softirq 1192 56*387f9dfdSAndroid Build Coastguard Workernet_tx_action 2341 57*387f9dfdSAndroid Build Coastguard Workertasklet_action 5496 58*387f9dfdSAndroid Build Coastguard Workernet_rx_action 15656 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard WorkerThis can be useful for quantifying where CPU cycles are spent among the soft 61*387f9dfdSAndroid Build Coastguard Workerinterrupts (summarized as the %softirq column from mpstat(1), and shown as 62*387f9dfdSAndroid Build Coastguard Workerevent counts in /proc/softirqs). The output above shows that most time was spent 63*387f9dfdSAndroid Build Coastguard Workerprocessing net_rx_action(), which was around 15 milliseconds per second (total 64*387f9dfdSAndroid Build Coastguard Workertime across all CPUs). 65*387f9dfdSAndroid Build Coastguard Worker 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard WorkerThe distribution of interrupt run time can be printed as a histogram with the -d 68*387f9dfdSAndroid Build Coastguard Workeroption. Eg: 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Worker# ./softirqs -d 71*387f9dfdSAndroid Build Coastguard WorkerTracing soft irq event time... Hit Ctrl-C to end. 72*387f9dfdSAndroid Build Coastguard Worker^C 73*387f9dfdSAndroid Build Coastguard Worker 74*387f9dfdSAndroid Build Coastguard Workersoftirq = net_tx_action 75*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 76*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 77*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 78*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 79*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 80*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 81*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 82*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 83*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 84*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 440 | | 85*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 27613 |****************************************| 86*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 5728 |******** | 87*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 439 | | 88*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 53 | | 89*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 2 | | 90*387f9dfdSAndroid Build Coastguard Worker 91*387f9dfdSAndroid Build Coastguard Workersoftirq = net_rx_action 92*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 93*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 94*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 95*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 96*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 97*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 98*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 99*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 100*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 101*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 102*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 6 | | 103*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 35 | | 104*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 3562 |**************** | 105*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 7023 |******************************** | 106*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 8770 |****************************************| 107*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 1780 |******** | 108*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 216 | | 109*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 4 | | 110*387f9dfdSAndroid Build Coastguard Worker 111*387f9dfdSAndroid Build Coastguard Workersoftirq = tasklet_action 112*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 113*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 114*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 115*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 116*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 117*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 118*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 119*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 120*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 121*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 95 | | 122*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 12521 |****************************************| 123*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 1068 |*** | 124*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1077 |*** | 125*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 12349 |*************************************** | 126*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 464 |* | 127*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 1 | | 128*387f9dfdSAndroid Build Coastguard Worker 129*387f9dfdSAndroid Build Coastguard Workersoftirq = rcu_process_callbacks 130*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 131*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 132*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 133*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 134*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 135*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 136*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 137*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 138*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 139*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 140*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 708 |****************************************| 141*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 495 |*************************** | 142*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 98 |***** | 143*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 62 |*** | 144*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 4 | | 145*387f9dfdSAndroid Build Coastguard Worker 146*387f9dfdSAndroid Build Coastguard Workersoftirq = run_timer_softirq 147*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 148*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 149*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 150*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 151*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 152*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 153*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 154*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 155*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 156*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 2 | | 157*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 366 |********* | 158*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 1525 |****************************************| 159*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 629 |**************** | 160*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 87 |** | 161*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 1 | | 162*387f9dfdSAndroid Build Coastguard Worker 163*387f9dfdSAndroid Build Coastguard Workersoftirq = run_rebalance_domains 164*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 165*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 166*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 167*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 168*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 169*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 170*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 171*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 172*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 173*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 3 | | 174*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 18 |* | 175*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 80 |******** | 176*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 374 |****************************************| 177*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 257 |*************************** | 178*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 50 |***** | 179*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 24 |** | 180*387f9dfdSAndroid Build Coastguard Worker 181*387f9dfdSAndroid Build Coastguard Worker 182*387f9dfdSAndroid Build Coastguard WorkerSometimes you just want counts of events, and don't need the distribution 183*387f9dfdSAndroid Build Coastguard Workerof times. You can use the -C or --events option: 184*387f9dfdSAndroid Build Coastguard Worker 185*387f9dfdSAndroid Build Coastguard Worker# ./softirqs.py -C 186*387f9dfdSAndroid Build Coastguard WorkerTracing soft irq events... Hit Ctrl-C to end. 187*387f9dfdSAndroid Build Coastguard Worker^C 188*387f9dfdSAndroid Build Coastguard WorkerSOFTIRQ TOTAL_count 189*387f9dfdSAndroid Build Coastguard Workerblock 5 190*387f9dfdSAndroid Build Coastguard Workertasklet 6 191*387f9dfdSAndroid Build Coastguard Workernet_rx 402 192*387f9dfdSAndroid Build Coastguard Workersched 5251 193*387f9dfdSAndroid Build Coastguard Workerrcu 5748 194*387f9dfdSAndroid Build Coastguard Workertimer 9530 195*387f9dfdSAndroid Build Coastguard Worker 196*387f9dfdSAndroid Build Coastguard Worker 197*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 198*387f9dfdSAndroid Build Coastguard Worker 199*387f9dfdSAndroid Build Coastguard Worker# ./softirqs -h 200*387f9dfdSAndroid Build Coastguard Workerusage: softirqs [-h] [-T] [-N] [-C] [-d] [-c CPU] [interval] [count] 201*387f9dfdSAndroid Build Coastguard Worker 202*387f9dfdSAndroid Build Coastguard WorkerSummarize soft irq event time as histograms. 203*387f9dfdSAndroid Build Coastguard Worker 204*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 205*387f9dfdSAndroid Build Coastguard Worker interval output interval, in seconds 206*387f9dfdSAndroid Build Coastguard Worker count number of outputs 207*387f9dfdSAndroid Build Coastguard Worker 208*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 209*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 210*387f9dfdSAndroid Build Coastguard Worker -T, --timestamp include timestamp on output 211*387f9dfdSAndroid Build Coastguard Worker -N, --nanoseconds output in nanoseconds 212*387f9dfdSAndroid Build Coastguard Worker -C, --events show the number of soft irq events 213*387f9dfdSAndroid Build Coastguard Worker -d, --dist show distributions as histograms 214*387f9dfdSAndroid Build Coastguard Worker -c CPU, --cpu CPU trace this CPU only 215*387f9dfdSAndroid Build Coastguard Worker 216*387f9dfdSAndroid Build Coastguard Workerexamples: 217*387f9dfdSAndroid Build Coastguard Worker ./softirqs # sum soft irq event time 218*387f9dfdSAndroid Build Coastguard Worker ./softirqs -C # show the number of soft irq events 219*387f9dfdSAndroid Build Coastguard Worker ./softirqs -d # show soft irq event time as histograms 220*387f9dfdSAndroid Build Coastguard Worker ./softirqs 1 10 # print 1 second summaries, 10 times 221*387f9dfdSAndroid Build Coastguard Worker ./softirqs -NT 1 # 1s summaries, nanoseconds, and timestamps 222*387f9dfdSAndroid Build Coastguard Worker ./softirqs -c 1 # sum soft irq event time on CPU 1 only 223*387f9dfdSAndroid Build Coastguard Worker 224