免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: noted2011
打印 上一主题 下一主题

[进程管理] 唤醒进程(wake_up_process)到进程真正执行延迟较大 [复制链接]

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
31 [报告]
发表于 2014-02-17 15:48 |只看该作者
junnyg 发表于 2014-02-17 15:16
回复 29# humjb_1983
ENEA的LWRT提供了运行于用户空间的轻量级线程调度系统,LWT由其进行调度
http://ww ...

谢谢,抽空看看~~

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
32 [报告]
发表于 2014-02-17 21:24 |只看该作者
本帖最后由 mordorwww 于 2014-02-17 21:25 编辑
junnyg 发表于 2014-02-17 15:16
回复 29# humjb_1983
ENEA的LWRT提供了运行于用户空间的轻量级线程调度系统,LWT由其进行调度
http://ww ...



在用户态调度的话,事件怎么处理?比如定时器,IO

论坛徽章:
0
33 [报告]
发表于 2014-02-18 09:57 |只看该作者
回复 32# mordorwww
用户态公共库组件实现这类功能,形成一个用户态的自治系统


   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
34 [报告]
发表于 2014-02-18 11:59 |只看该作者
本帖最后由 mordorwww 于 2014-02-18 12:02 编辑
junnyg 发表于 2014-02-18 09:57
回复 32# mordorwww
用户态公共库组件实现这类功能,形成一个用户态的自治系统


估计是用户态中断或者用户态轮询,象DPDK

用户态的自治系统, 我觉得这玩意有点象虚拟化啊

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
35 [报告]
发表于 2014-02-19 11:19 |只看该作者
humjb_1983 发表于 2014-02-14 13:02
1ms的硬中断是指时钟中断么?
建议在唤醒A之后,手工设置下NEED_RESCHED标记,这样,在中断返回的后,就有 ...


是这个补丁么:
PREEMPT_RT ?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
36 [报告]
发表于 2014-02-19 12:47 |只看该作者
mordorwww 发表于 2014-02-19 11:19
是这个补丁么:
PREEMPT_RT ?

印象中,RT补丁有很多的,包括多个方面的实时性提升。

论坛徽章:
0
37 [报告]
发表于 2014-02-19 14:28 |只看该作者
本帖最后由 noted2011 于 2014-02-19 14:41 编辑

1ms_int_delay20140219002.zip (216.22 KB, 下载次数: 17)

humjb_1983 发表于 2014-02-17 09:37
补充下,需要确认下这里的延时是中断延时还是调度延时,需要打点确认。
对中断延时影响最大的就是关中断 ...


用ftrace调试了一下,定位了一下问题,是 __switch_to这块延迟较大,
主要是从 <idle>-0  => 1_l2_Ma-732这个上下文切换延迟较大,有800多us。但是从1_l2_Ma-732  => <idle>-0 只有100us。具体的统计数据细节,可以查看附件。下面粘贴部分数据,注意红色的部分, 1_l2_Ma-732就是进程A。
bpu-3 /sys/kernel/debug/tracing # cat trace
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |
1)   1.024 us    |        pick_next_task_fair();
1)   0.928 us    |        pick_next_task_rt();
1)   0.928 us    |        pick_next_task_fair();
1)   0.960 us    |        pick_next_task_idle();
1)               |        __switch_to() {
------------------------------------------
1)  1_l2_Ma-732   =>    <idle>-0   
------------------------------------------

1) ! 132.128 us  |    } /* __switch_to */
1)               |    finish_task_switch() {
1)               |      _raw_spin_unlock() {
1)   0.896 us    |        sub_preempt_count();
1)   2.656 us    |      }
1)   4.448 us    |    }
1)   0.992 us    |    sub_preempt_count();
1) ! 157.088 us  |  } /* __schedule */
1)   1.056 us    |  add_preempt_count();
1)               |  tick_nohz_stop_sched_tick() {
1)               |    ktime_get() {
1)   0.928 us    |      ktime_add_ns();
1)   2.880 us    |    }
1)   0.928 us    |    timekeeping_max_deferment();
1)   0.928 us    |    rcu_needs_cpu();
1)   0.896 us    |    printk_needs_cpu();
1)               |    get_next_timer_interrupt() {
1)               |      rt_spin_trylock() {
1)   0.960 us    |        rt_mutex_trylock();
1)   2.720 us    |      }
1)   0.928 us    |      rt_spin_unlock();
1)               |      hrtimer_get_next_event() {
1)               |        _raw_spin_lock_irqsave() {
1)               |          __raw_spin_lock_irqsave() {
1)   0.928 us    |            add_preempt_count();
1)   2.752 us    |          }
1)   4.480 us    |        }
1)               |        _raw_spin_unlock_irqrestore() {
1)   0.864 us    |          sub_preempt_count();
1)   2.688 us    |        }
1)   9.888 us    |      }
1) + 19.840 us   |    }
1)   0.960 us    |    ktime_add_ns();
1)   1.152 us    |    select_nohz_load_balancer();
1)   1.120 us    |    rcu_enter_nohz();
1)               |    hrtimer_start() {
1)               |      __hrtimer_start_range_ns() {
1)               |        lock_hrtimer_base() {
1)               |          _raw_spin_lock_irqsave() {
1)               |            __raw_spin_lock_irqsave() {
1)   0.896 us    |              add_preempt_count();
1)   2.752 us    |            }
1)   4.448 us    |          }
1)   6.272 us    |        }
1)               |        __remove_hrtimer() {
1)               |          hrtimer_force_reprogram() {
1)               |            tick_program_event() {
1)               |              tick_dev_program_event() {
1)               |                ktime_get() {
1)   0.896 us    |                  ktime_add_ns();
1)   2.784 us    |                }
1)   1.088 us    |                clockevents_program_event();
1)   6.592 us    |              }
1)   8.480 us    |            }
1) + 10.368 us   |          }
1) + 12.288 us   |        }
1)   0.960 us    |        ktime_add_ns();
1)   0.928 us    |        ktime_add_safe();
1)   1.088 us    |        enqueue_hrtimer();
1)               |        hrtimer_reprogram() {
1)               |          tick_program_event() {
1)               |            tick_dev_program_event() {
1)               |              ktime_get() {
1)   0.928 us    |                ktime_add_ns();
1)   2.752 us    |              }
1)   0.992 us    |              clockevents_program_event();
1)   6.432 us    |            }
1)   8.224 us    |          }
1) + 10.080 us   |        }
1)               |        _raw_spin_unlock_irqrestore() {
1)   0.864 us    |          sub_preempt_count();
1)   2.688 us    |        }
1) + 41.664 us   |      }
1) + 43.424 us   |    }
1) + 81.632 us   |  }
0)   2.720 us    |                      } /* __raw_spin_lock */
0)   5.216 us    |                    } /* _raw_spin_lock */
0)               |                    activate_task() {
0)               |                      enqueue_task() {
0)               |                        enqueue_task_rt() {
0)               |                          cpupri_set() {
0)               |                            _raw_spin_lock_irqsave() {
0)               |                              __raw_spin_lock_irqsave() {
0)   0.896 us    |                                add_preempt_count();
0)   2.784 us    |                              }
0)   4.608 us    |                            }
0)               |                            _raw_spin_unlock_irqrestore() {
0)   0.896 us    |                              sub_preempt_count();
0)   0.960 us    |                              preempt_schedule();
0)   4.544 us    |                            }
0)               |                            _raw_spin_lock_irqsave() {
0)               |                              __raw_spin_lock_irqsave() {
0)   0.896 us    |                                add_preempt_count();
0)   2.784 us    |                              }
0)   4.544 us    |                            }
0)               |                            _raw_spin_unlock_irqrestore() {
0)   0.928 us    |                              sub_preempt_count();
0)   0.896 us    |                              preempt_schedule();
0)   4.576 us    |                            }
0) + 22.848 us   |                          }
0)   0.928 us    |                          update_rt_migration();
0) + 26.880 us   |                        }
0) + 28.704 us   |                      }
0) + 30.528 us   |                    }
0)   1.088 us    |                    preempt_schedule();
0)               |                    check_preempt_curr_idle() {
0)               |                      resched_task() {
0)               |                        smp_send_reschedule() {
0)   1.088 us    |                          doorbell_message_pass();
1)               |  doorbell_exception() {
0)   2.848 us    |                        }
1)   0.896 us    |    smp_message_recv();
0)   4.960 us    |                      }
0)   6.688 us    |                    }
1)   3.040 us    |  }
0)   0.928 us    |                    task_woken_rt();
1)               |  tick_nohz_restart_sched_tick() {
0)               |                    _raw_spin_unlock_irqrestore() {
1)               |    ktime_get() {
0)   0.864 us    |                      sub_preempt_count();
1)   0.896 us    |      ktime_add_ns();
0)   0.928 us    |                      preempt_schedule();
1)   3.008 us    |    }
1)   0.928 us    |    tick_nohz_stop_idle();
0)   4.480 us    |                    }
0)   0.960 us    |                    sub_preempt_count();
1)   1.088 us    |    rcu_exit_nohz();
0)   0.896 us    |                    preempt_schedule();
1)   1.088 us    |    select_nohz_load_balancer();
0) + 75.936 us   |                  } /* try_to_wake_up */
0) + 77.728 us   |                } /* wake_up_process */
1)   1.088 us    |    tick_do_update_jiffies64();
0) + 79.520 us   |              } /* int_wake_dl */
0)               |              riochan_compose() {
1)               |    account_idle_ticks() {
0)               |                rio_compose() {
1)   0.960 us    |      account_idle_time();
0)               |                  riochan_debug() {
0)   1.056 us    |                    rio_debug();
1)   2.752 us    |    }
1)               |    hrtimer_cancel() {
0)   3.008 us    |                  }
1)               |      hrtimer_try_to_cancel() {
0)   0.896 us    |                  set_desc_src();
1)               |        lock_hrtimer_base() {
1)               |          _raw_spin_lock_irqsave() {
0)   0.896 us    |                  set_desc_dst();
1)               |            __raw_spin_lock_irqsave() {
1)   0.896 us    |              add_preempt_count();
0)   1.056 us    |                  set_desc_cnt();
1)   2.752 us    |            }
0)   0.928 us    |                  clear_ld_eol();
1)   4.448 us    |          }
1)   6.368 us    |        }
0) + 12.288 us   |                }
1)               |        __remove_hrtimer() {
0)               |                rio_compose() {
1)               |          hrtimer_force_reprogram() {
0)               |                  riochan_debug() {
1)               |            tick_program_event() {
0)   0.928 us    |                    rio_debug();
1)               |              tick_dev_program_event() {
1)               |                ktime_get() {
0)   2.720 us    |                  }
1)   0.864 us    |                  ktime_add_ns();
0)   0.896 us    |                  set_desc_src();
1)   2.880 us    |                }
0)   0.928 us    |                  set_desc_dst();
1)   1.056 us    |                clockevents_program_event();
0)   0.928 us    |                  set_desc_cnt();
1)   6.624 us    |              }
1)   8.384 us    |            }
0)   0.928 us    |                  set_desc_dst();
1) + 10.176 us   |          }
1) + 12.064 us   |        }
0)               |                  riochan_debug() {
1)               |        _raw_spin_unlock_irqrestore() {
0)   0.960 us    |                    rio_debug();
1)   0.864 us    |          sub_preempt_count();
0)   2.784 us    |                  }
1)   0.864 us    |          preempt_schedule();
0)   0.896 us    |                  clear_ld_eol();
1)   4.608 us    |        }
0) + 17.376 us   |                }
1) + 26.656 us   |      }
0) + 32.352 us   |              }
1) + 28.480 us   |    }
0)               |              int_kstat_isr() {
1)               |    hrtimer_forward() {
0)   0.928 us    |                osp_cpu_clock();
1)   0.960 us    |      ktime_add_safe();
0)   2.816 us    |              }
1)   0.896 us    |      ktime_add_safe();
0)               |              int_wake_dl() {
0)               |                wake_up_process() {
1)   4.672 us    |    }
0)               |                  try_to_wake_up() {
1)               |    hrtimer_start_range_ns() {
0)   0.864 us    |                    add_preempt_count();
1)               |      __hrtimer_start_range_ns() {
1)               |        lock_hrtimer_base() {
0)               |                    task_rq_lock() {
1)               |          _raw_spin_lock_irqsave() {
1)               |            __raw_spin_lock_irqsave() {
0)               |                      _raw_spin_lock() {
1)   0.832 us    |              add_preempt_count();
0)               |                        __raw_spin_lock() {
0)   0.864 us    |                          add_preempt_count();
1)   2.720 us    |            }
1)   4.480 us    |          }
0)   2.752 us    |                        }
1)   6.272 us    |        }
0)   5.216 us    |                      }
1)   0.960 us    |        ktime_add_ns();
0)   7.168 us    |                    }
0)   1.024 us    |                    select_task_rq_rt();
1)   0.928 us    |        ktime_add_safe();
0)               |                    _raw_spin_unlock() {
1)   0.960 us    |        enqueue_hrtimer();
0)   0.896 us    |                      sub_preempt_count();
1)               |        hrtimer_reprogram() {
0)   0.896 us    |                      preempt_schedule();
1)               |          tick_program_event() {
1)               |            tick_dev_program_event() {
0)   4.512 us    |                    }
1)               |              ktime_get() {
0)               |                    _raw_spin_lock() {
1)   0.896 us    |                ktime_add_ns();
0)               |                      __raw_spin_lock() {
0)   0.928 us    |                        add_preempt_count();
1)   2.880 us    |              }
1)   1.024 us    |              clockevents_program_event();
0)   2.688 us    |                      }
0)   4.480 us    |                    }
1)   6.560 us    |            }
0)               |                    activate_task() {
1)   8.320 us    |          }
0)               |                      enqueue_task() {
1) + 10.176 us   |        }
0)               |                        enqueue_task_rt() {
1)               |        _raw_spin_unlock_irqrestore() {
0)               |                          cpupri_set() {
1)   0.896 us    |          sub_preempt_count();
0)               |                            _raw_spin_lock_irqsave() {
0)               |                              __raw_spin_lock_irqsave() {
1)   0.928 us    |          preempt_schedule();
0)   0.896 us    |                                add_preempt_count();
1)   4.672 us    |        }
1) + 30.176 us   |      }
0)   2.688 us    |                              }
0)   4.480 us    |                            }
1) + 31.968 us   |    }
1) + 84.480 us   |  }
0)               |                            _raw_spin_unlock_irqrestore() {
1)   1.088 us    |  sub_preempt_count();
0)   0.896 us    |                              sub_preempt_count();
0)   0.928 us    |                              preempt_schedule();
1)               |  __schedule() {
1)   1.024 us    |    rcu_sched_qs();
0)   4.512 us    |                            }
0)               |                            _raw_spin_lock_irqsave() {
1)   0.992 us    |    add_preempt_count();
0)               |                              __raw_spin_lock_irqsave() {
0)   0.896 us    |                                add_preempt_count();
1)               |    _raw_spin_lock_irq() {
1)               |      __raw_spin_lock_irqsave() {
0)   2.688 us    |                              }
1)   0.896 us    |        add_preempt_count();
0)   4.512 us    |                            }
0)               |                            _raw_spin_unlock_irqrestore() {
0)   0.928 us    |                              sub_preempt_count();
1)   2.816 us    |      }
1)   5.408 us    |    }
0)   0.896 us    |                              preempt_schedule();
1)   0.896 us    |    put_prev_task_idle();
0)   4.640 us    |                            }
0) + 22.656 us   |                          }
1)               |    pick_next_task_rt() {
0)   0.928 us    |                          update_rt_migration();
1)   0.896 us    |      dequeue_pushable_task();
0) + 26.496 us   |                        }
1)   2.944 us    |    }
0) + 28.320 us   |                      }
1)               |    __switch_to() {
0) + 30.144 us   |                    }
0)   0.896 us    |                    preempt_schedule();
------------------------------------------
1)    <idle>-0    =>  1_l2_Ma-732  
------------------------------------------

1) ! 870.304 us  |        } /* __switch_to */
1)               |        finish_task_switch() {
0)               |                    check_preempt_curr_idle() {
1)               |          _raw_spin_unlock() {
0)               |                      resched_task() {
1)   0.928 us    |            sub_preempt_count();
0)               |                        smp_send_reschedule() {
1)   2.688 us    |          }
0)   1.024 us    |                          doorbell_message_pass();
1)   4.544 us    |        }
1)   0.992 us    |        sub_preempt_count();
0)   2.848 us    |                        }
0)   4.928 us    |                      }
1) ! 990.624 us  |      } /* __schedule */
0)   6.688 us    |                    }
1) ! 992.512 us  |    } /* schedule */
0)   1.024 us    |                    task_woken_rt();
1)   0.896 us    |    __osp_int_wake_unreg();
0)               |                    _raw_spin_unlock_irqrestore() {
1) ! 997.984 us  |  } /* sys_wait_wakeup */
0)   0.864 us    |                      sub_preempt_count();
0)   0.896 us    |                      preempt_schedule();
1)               |  sys_wait_wakeup() {
1)   0.896 us    |    __osp_int_wake_reg();
0)   4.512 us    |                    }
0)   0.928 us    |                    sub_preempt_count();
1)               |    schedule() {
1)               |      __schedule() {
0)   0.928 us    |                    preempt_schedule();
1)   1.088 us    |        rcu_sched_qs();
0) + 75.200 us   |                  }
1)   0.992 us    |        add_preempt_count();
0) + 76.960 us   |                }
0) + 78.752 us   |              }
1)               |        _raw_spin_lock_irq() {
0)               |              riochan_compose() {
1)               |          __raw_spin_lock_irqsave() {
0)               |                rio_compose() {
1)   0.864 us    |            add_preempt_count();
0)               |                  riochan_debug() {
0)   0.960 us    |                    rio_debug();
1)   2.816 us    |          }
1)   4.640 us    |        }
0)   2.816 us    |                  }
1)               |        deactivate_task() {
0)   0.928 us    |                  set_desc_src();
1)               |          dequeue_task() {
1)               |            dequeue_task_rt() {
0)   0.928 us    |                  set_desc_dst();
1)               |              update_curr_rt() {
0)   0.928 us    |                  set_desc_cnt();
1)               |                _raw_spin_lock() {
1)               |                  __raw_spin_lock() {
0)   0.960 us    |                  clear_ld_eol();
1)   0.896 us    |                    add_preempt_count();
0) + 11.904 us   |                }
1)   2.752 us    |                  }
1)   4.512 us    |                }
0)               |                rio_compose() {
0)               |                  riochan_debug() {
1)   0.960 us    |                balance_runtime();
0)   0.992 us    |                    rio_debug();
1)               |                _raw_spin_unlock() {
0)   2.720 us    |                  }
1)   0.896 us    |                  sub_preempt_count();
0)   1.024 us    |                  set_desc_src();
1)   2.656 us    |                }
1) + 12.032 us   |              }
0)   0.928 us    |                  set_desc_dst();
1)               |              __dequeue_rt_entity() {
0)   0.928 us    |                  set_desc_cnt();
1)               |                cpupri_set() {
1)               |                  _raw_spin_lock_irqsave() {
0)   0.928 us    |                  set_desc_dst();
1)               |                    __raw_spin_lock_irqsave() {
1)   0.928 us    |                      add_preempt_count();
0)               |                  riochan_debug() {
1)   2.816 us    |                    }
0)   0.960 us    |                    rio_debug();
1)   4.512 us    |                  }
1)               |                  _raw_spin_unlock_irqrestore() {
0)   2.816 us    |                  }
1)   0.864 us    |                    sub_preempt_count();
0)   0.928 us    |                  clear_ld_eol();
1)   2.688 us    |                  }
0) + 18.432 us   |                }
1)               |                  _raw_spin_lock_irqsave() {
0) + 33.088 us   |              }
1)               |                    __raw_spin_lock_irqsave() {
0)               |              int_kstat_isr() {
1)   0.896 us    |                      add_preempt_count();
0)   0.928 us    |                osp_cpu_clock();
1)   2.816 us    |                    }
0)   2.720 us    |              }
1)   4.576 us    |                  }
0)               |              int_wake_dl() {
1)               |                  _raw_spin_unlock_irqrestore() {
0)               |                wake_up_process() {
1)   0.896 us    |                    sub_preempt_count();
0)               |                  try_to_wake_up() {
0)   0.896 us    |                    add_preempt_count();
1)   2.688 us    |                  }
1) + 19.232 us   |                }
0)               |                    task_rq_lock() {
1)   0.960 us    |                update_rt_migration();
0)               |                      _raw_spin_lock() {
1) + 23.072 us   |              }
0)               |                        __raw_spin_lock() {
1)   0.928 us    |              dequeue_pushable_task();
0)   0.992 us    |                          add_preempt_count();
1) + 39.552 us   |            }
0)   2.880 us    |                        }
1) + 41.376 us   |          }
0)   4.608 us    |                      }
1) + 43.200 us   |        }
0)   6.720 us    |                    }
1)               |        pre_schedule_rt() {
0)   1.088 us    |                    select_task_rq_rt();
1)   0.896 us    |          pull_rt_task();
0)               |                    _raw_spin_unlock() {
1)   2.720 us    |        }
0)   0.896 us    |                      sub_preempt_count();
1)               |        _raw_spin_unlock() {
1)   0.864 us    |          sub_preempt_count();
0)   0.928 us    |                      preempt_schedule();
1)   2.656 us    |        }
0)   4.480 us    |                    }
1)               |        load_balance() {
0)               |                    _raw_spin_lock() {
1)   0.960 us    |          scale_rt_power();
0)               |                      __raw_spin_lock() {
0)   0.896 us    |                        add_preempt_count();
1)   1.088 us    |          scale_rt_power();
0)   2.720 us    |                      }
0)   4.448 us    |                    }
1)   0.960 us    |          scale_rt_power();
0)               |                    activate_task() {
0)               |                      enqueue_task() {
1)   0.960 us    |          scale_rt_power();
0)               |                        enqueue_task_rt() {
0)               |                          cpupri_set() {
1)   0.960 us    |          scale_rt_power();
0)               |                            _raw_spin_lock_irqsave() {
0)               |                              __raw_spin_lock_irqsave() {
1)   0.928 us    |          scale_rt_power();
0)   0.896 us    |                                add_preempt_count();
0)   2.720 us    |                              }
0)   4.544 us    |                            }
1)   1.888 us    |          scale_rt_power();
0)               |                            _raw_spin_unlock_irqrestore() {
0)   0.896 us    |                              sub_preempt_count();
1)   0.960 us    |          scale_rt_power();
0)   0.896 us    |                              preempt_schedule();
1) + 18.976 us   |        }
1)   0.928 us    |        msecs_to_jiffies();
0)   4.576 us    |                            }
0)               |                            _raw_spin_lock_irqsave() {
1)               |        _raw_spin_lock() {
0)               |                              __raw_spin_lock_irqsave() {
1)               |          __raw_spin_lock() {
0)   0.864 us    |                                add_preempt_count();
1)   0.928 us    |            add_preempt_count();
0)   2.784 us    |                              }
1)   2.624 us    |          }
0)   4.576 us    |                            }
1)   4.448 us    |        }
0)               |                            _raw_spin_unlock_irqrestore() {
1)               |        put_prev_task_rt() {
0)   0.864 us    |                              sub_preempt_count();
1)               |          update_curr_rt() {
1)               |            _raw_spin_lock() {
0)   0.960 us    |                              preempt_schedule();
1)               |              __raw_spin_lock() {
1)   0.864 us    |                add_preempt_count();
0)   4.544 us    |                            }
0) + 22.720 us   |                          }
1)   2.816 us    |              }
0)   0.864 us    |                          update_rt_migration();
1)   4.480 us    |            }
1)   0.928 us    |            balance_runtime();
0) + 26.560 us   |                        }
0) + 28.384 us   |                      }
1)               |            _raw_spin_unlock() {
0) + 30.176 us   |                    }
1)   1.024 us    |              sub_preempt_count();
0)   0.896 us    |                    preempt_schedule();
1)   2.816 us    |            }
0)               |                    check_preempt_curr_idle() {
1) + 11.872 us   |          }
0)               |                      resched_task() {
1) + 13.760 us   |        }
0)               |                        smp_send_reschedule() {
1)   0.960 us    |        pick_next_task_fair();
0)   1.056 us    |                          doorbell_message_pass();
1)   0.864 us    |        pick_next_task_rt();
0)   2.784 us    |                        }
0)   4.800 us    |                      }
1)   1.120 us    |        pick_next_task_fair();
0)   6.560 us    |                    }
0)   0.992 us    |                    task_woken_rt();
1)   0.960 us    |        pick_next_task_idle();
0)               |                    _raw_spin_unlock_irqrestore() {
0)   0.832 us    |                      sub_preempt_count();
1)               |        __switch_to() {
------------------------------------------
1)  1_l2_Ma-732   =>    <idle>-0   
------------------------------------------

1) ! 131.360 us  |    } /* __switch_to */
0)   0.832 us    |                      preempt_schedule();
1)               |    finish_task_switch() {
1)               |      _raw_spin_unlock() {
0)   4.512 us    |                    }
1)   0.896 us    |        sub_preempt_count();
0)   0.928 us    |                    sub_preempt_count();
1)   2.688 us    |      }
0)   0.928 us    |                    preempt_schedule();
1)   4.480 us    |    }
1)   0.960 us    |    sub_preempt_count();
0) + 74.912 us   |                  }
0) + 76.672 us   |                }
1) ! 157.120 us  |  } /* __schedule */


论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
38 [报告]
发表于 2014-02-19 15:02 |只看该作者
回复 37# noted2011
主要是从 <idle>-0  => 1_l2_Ma-732这个上下文切换延迟较大,有800多us。

这个貌似没什么问题吧,我这边没有RT的centos6.5 2.6.32-431内核,进程切换也会出现这种情况
  1)   0.186 us    |              pick_next_task_fair();
  1)   0.309 us    |              pick_next_task_stop();
  1)   0.285 us    |              pick_next_task_rt();
  1)   0.173 us    |              pick_next_task_fair();
  1)   0.192 us    |              pick_next_task_idle();
  1)   0.239 us    |              perf_event_task_sched_out();
  1)   0.190 us    |              native_load_sp0();
  1)   0.174 us    |              native_load_tls();
  1)   0.169 us    |              native_read_cr0();
  1)   0.248 us    |              native_write_cr0();
------------------------------------------
  1)    cat-9569    =>    <idle>-0   
------------------------------------------

  1)   0.227 us    |    finish_task_switch();
  1) ! 800.145 us  |  }  
  1)               |  tick_nohz_stop_sched_tick() {
  1) + 10.047 us   |    ktime_get();
  1)   0.183 us    |    update_ts_time_stats();
  1)   0.176 us    |    rcu_needs_cpu();
  1)   0.185 us    |    printk_needs_cpu();
  1)               |    get_next_timer_interrupt() {
  1)   0.184 us    |      _spin_lock();
  1)               |      hrtimer_get_next_event() {
  1)   0.177 us    |        _spin_lock_irqsave();
  1)   0.176 us    |        _spin_unlock_irqrestore();
  1)   0.882 us    |      }     
  1)   1.737 us    |    }
  1)   0.569 us    |    select_nohz_load_balancer();
   

论坛徽章:
0
39 [报告]
发表于 2014-02-19 15:24 |只看该作者
瀚海书香 发表于 2014-02-19 15:02
回复 37# noted2011

这个貌似没什么问题吧,我这边没有RT的centos6.5 2.6.32-431内核,进程切换也会出现 ...



不一样呀,我的 __switch_to 开始到结束,中间就是<idle>-0    =>  1_l2_Ma-732 ,花了870.304 us,core 0那些不在这个范围之内。
1)               |    __switch_to() {
0) + 30.144 us   |                    }
0)   0.896 us    |                    preempt_schedule();
------------------------------------------
1)    <idle>-0    =>  1_l2_Ma-732  
------------------------------------------

1) ! 870.304 us  |        } /* __switch_to */

但是你的是从某个函数开始(你没有贴完整,具体是哪里不知道),到大括号},这整个时间是800.145us,还有你们没有打RT patch,性能是不一样的,没有可比性。
1)   0.186 us    |              pick_next_task_fair();
  1)   0.309 us    |              pick_next_task_stop();
  1)   0.285 us    |              pick_next_task_rt();
  1)   0.173 us    |              pick_next_task_fair();
  1)   0.192 us    |              pick_next_task_idle();
  1)   0.239 us    |              perf_event_task_sched_out();
  1)   0.190 us    |              native_load_sp0();
  1)   0.174 us    |              native_load_tls();
  1)   0.169 us    |              native_read_cr0();
  1)   0.248 us    |              native_write_cr0();
------------------------------------------
  1)    cat-9569    =>    <idle>-0   
------------------------------------------

  1)   0.227 us    |    finish_task_switch();
  1) ! 800.145 us  |  }  

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
40 [报告]
发表于 2014-02-19 15:31 |只看该作者
noted2011 发表于 2014-02-19 14:28
用ftrace调试了一下,定位了一下问题,是 __switch_to这块延迟较大,
主要是从 -0  => 1_l2_Ma-73 ...

这个应该是正常的,个人理解如下
1、__switch_to这个函数统计的800多us,应该是从 <idle>-0    =>  0_main_-680 => <idle>-0 的时间,并非<idle>-0    =>  0_main_-680 的时间。
   也就是说这个800us,包含,从idle切换到A进程+A进程自身的执行时间+A进程重新切换回idle的时间。这800us中,很有可能是A进程自身的执行时间消耗掉了。
   因为这个__switch_to实际是在idle进程的进程上下文中执行的,当idle进程被调度出去(切换到A),然后重新回到idle进程执行时,返回的地方就是
   __switch_to返回的地方,后面会接着执行finish_task_switch()
    所以,这里统计到的__switch_to的执行时间,个人理解并不代表从idle切换到A的进程上下文切换时间。
2、从另一个130us左右的__switch_to的统计看,这个应该是 A=> idle=>A的时间, 道理跟上面一样,这个感觉跟你环境中的定时器(170us)相关,idle执行
   过程中,定时器到了,就又切换回来了~~
3、另一方面,两个__switch_to的时间之刚好近似于1ms,这个似乎也是能对上的,感觉调度可能并没有延时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP