什么是PSI
PSI是pressure information的缩写,用来衡量系统某种资源的紧张程度。(非进程或线程级别)
使用场景:
PSI实现
- psi_group
psi_group作为一个pressure information跟踪对象,可能分布在多个cpu上用psi_group_cpu单独跟踪。
首先跟踪每个psi_group_cpu的状态变化,入口函数是psi_group_change。状态包括NR_IOWAIT, NR_MEMSTALL, NR_RUNNING, NR_ONCPU即四种状态的task数量,来决定group的状态:PSI_IO_SOME,PSI_IO_FULL,PSI_MEM_SOME,PSI_MEM_FULL,PSI_CPU_SOME,PSI_CPU_FULL,PSI_NONIDLE。
- record_times
在psi_group_cpu状态发生改变时需要计算上个state*duration贡献的pressure information。比如:groupc->times[PSI_IO_SOME] += delta;
- 周期或按需更新PSI
上面的调度器路径只累积对应状态的时间,不更新PSI。psi_show按需更新,psi_avgs_work周期更新直到不需要更新,psi_poll_work按需更新。
- collect_percpu_times
deltas[s] += (u64)times[s] * nonidle 每个CPU的对应状态的时间用nonidle时间scale up权重。