arthur-zhang / morning-up-up

78 stars 6 forks source link

1210 分享:CPU 与上下文切换 #33

Open arthur-zhang opened 3 years ago

arthur-zhang commented 3 years ago

systemtap 脚本

global csw_count
global idle_count
global csw_total

probe scheduler.cpu_off {
      csw_count[task_prev, task_next]++
      csw_total+=1
      idle_count+=idle
}

function fmt_task(task_prev, task_next) {
   return sprintf("tid(%d)->tid(%d)", task_tid(task_prev), task_tid(task_next))
}

function print_cswtop () {
  printf ("%45s %10s\n", "Context switch", "COUNT")
  foreach ([task_prev, task_next] in csw_count- limit 5) {
    printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next])
  }
  printf("%45s %10d\n", "csw_total", csw_total)
  printf("%45s %10d\n", "idle", idle_count)

  delete csw_total
  delete csw_count
  delete idle_count
}

probe timer.s($1) {
  print_cswtop ()
  printf("--------------------------------------------------------------\n")
}
IKNOWLJT commented 3 years ago

[TOC]

CPU上下文切换

CPU上下文:CPU执行任务前必须依赖的环境

上下文切换的类型

系统调用的过程中是有上下文切换的,并且发生了两次上下文切换(保存用户的指令位置,保存寄存器的值),一次用户态切换到内核态,一次内核态切回用户态

分析进程对CPU的占用:

观测CPU上下文切换:

systemtap 观测:
vmstat 观测:

image-20201210211718311

pidstat:

image-20201210212027620