• Yafang Shao's avatar
    sched/rt: Support schedstats for RT sched class · 57a5c2da
    Yafang Shao authored
    We want to measure the latency of RT tasks in our production
    environment with schedstats facility, but currently schedstats is only
    supported for fair sched class. This patch enable it for RT sched class
    as well.
    
    After we make the struct sched_statistics and the helpers of it
    independent of fair sched class, we can easily use the schedstats
    facility for RT sched class.
    
    The schedstat usage in RT sched class is similar with fair sched class,
    for example,
                    fair                        RT
    enqueue         update_stats_enqueue_fair   update_stats_enqueue_rt
    dequeue         update_stats_dequeue_fair   update_stats_dequeue_rt
    put_prev_task   update_stats_wait_start     update_stats_wait_start_rt
    set_next_task   update_stats_wait_end       update_stats_wait_end_rt
    
    The user can get the schedstats information in the same way in fair sched
    class. For example,
           fair                            RT
           /proc/[pid]/sched               /proc/[pid]/sched
    
    schedstats is not supported for RT group.
    
    The output of a RT task's schedstats as follows,
    $ cat /proc/10349/sched
    ...
    sum_sleep_runtime                            :           972.434535
    sum_block_runtime                            :           960.433522
    wait_start                                   :        188510.871584
    sleep_start                                  :             0.000000
    block_start                                  :             0.000000
    sleep_max                                    :            12.001013
    block_max                                    :           952.660622
    exec_max                                     :             0.049629
    slice_max                                    :             0.000000
    wait_max                                     :             0.018538
    wait_sum                                     :             0.424340
    wait_count                                   :                   49
    iowait_sum                                   :           956.495640
    iowait_count                                 :                   24
    nr_migrations_cold                           :                    0
    nr_failed_migrations_affine                  :                    0
    nr_failed_migrations_running                 :                    0
    nr_failed_migrations_hot                     :                    0
    nr_forced_migrations                         :                    0
    nr_wakeups                                   :                   49
    nr_wakeups_sync                              :                    0
    nr_wakeups_migrate                           :                    0
    nr_wakeups_local                             :                   49
    nr_wakeups_remote                            :                    0
    nr_wakeups_affine                            :                    0
    nr_wakeups_affine_attempts                   :                    0
    nr_wakeups_passive                           :                    0
    nr_wakeups_idle                              :                    0
    ...
    
    The sched:sched_stat_{wait, sleep, iowait, blocked} tracepoints can
    be used to trace RT tasks as well. The output of these tracepoints for a
    RT tasks as follows,
    
    - runtime
              stress-10352   [004] d.h.  1035.382286: sched_stat_runtime: comm=stress pid=10352 runtime=995769 [ns] vruntime=0 [ns]
              [vruntime=0 means it is a RT task]
    
    - wait
              <idle>-0       [004] dN..  1227.688544: sched_stat_wait: comm=stress pid=10352 delay=46849882 [ns]
    
    - blocked
         kworker/4:1-465     [004] dN..  1585.676371: sched_stat_blocked: comm=stress pid=17194 delay=189963 [ns]
    
    - iowait
         kworker/4:1-465     [004] dN..  1585.675330: sched_stat_iowait: comm=stress pid=17189 delay=182848 [ns]
    
    - sleep
               sleep-18194   [023] dN..  1780.891840: sched_stat_sleep: comm=sleep.sh pid=17767 delay=1001160770 [ns]
               sleep-18196   [023] dN..  1781.893208: sched_stat_sleep: comm=sleep.sh pid=17767 delay=1001161970 [ns]
               sleep-18197   [023] dN..  1782.894544: sched_stat_sleep: comm=sleep.sh pid=17767 delay=1001128840 [ns]
               [ In sleep.sh, it sleeps 1 sec each time. ]
    
    [lkp@intel.com: reported build failure in earlier version]
    Signed-off-by: default avatarYafang Shao <laoar.shao@gmail.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210905143547.4668-7-laoar.shao@gmail.com
    57a5c2da
rt.c 69.3 KB