//运行函数 int Comm_SvrdApp_NonCtrl::run_instance() { ZLOG_INFO("[framework] app %s class [%s] run_instance start.", get_app_basename(), typeid(*this).name()); // size_t size_io_event = 0 , size_timer_expire = 0; size_t prc_frame = 0, idle = 0, proc_data_num = 0; ZCE_Time_Value select_interval(0, 0); ZCE_Timer_Queue *time_queue = ZCE_Timer_Queue::instance(); ZCE_Reactor *reactor = ZCE_Reactor::instance(); for (; app_run_;) { // 检查是否需要重新加载配置 if (app_reload_) { // 重新加载配置 reload_config(); } //处理收到的命令 popfront_recvpipe(prc_frame); size_timer_expire = time_queue->expire(); // 处理其他方式通信数据 proc_data_num = 0; proc(proc_data_num); //如果没有处理任何帧 // 处理管道的包少于要求处理的最大数则说明管道已经空了 if (prc_frame < MAX_ONCE_PROCESS_FRAME && size_timer_expire <= 0 && proc_data_num <= 0) { ++idle; } else { idle = 0; } // 如果空循环太多则会白白耗电不低碳 // 理论上这里睡眠最大时间是100毫秒 // 因此只要内存管道大小>=100毫秒最大系统处理包数*每个包字节数 // 则再睡醒以后能够正常处理数据而不至于管道满而丢数据 // 假设系统所有资源够用,那么网卡速率则决定了最大处理能力 // 网卡按1Gbit计算,则管道临界大小为1Gbit-per(S)/8/10≈12MByte,再加上管道自身的内存结构占用 // 考虑为16MByte也即足以,所以只要管道大小超过16MByte应该就顶的住。 // 所以这里就不用空跑那么多次了。 if (idle < 1) { continue; } //如果空闲很多,休息一下,如果你比较空闲,在这儿SELECT相当于Sleep, else if (idle >= HEAVY_IDLE_SLEEP_INTERVAL) { select_interval.usec(HEAVY_IDLE_INTERVAL_MICROSECOND); } //else 相当于 else if (idle >= LIGHT_IDLE_SELECT_INTERVAL) else { select_interval.usec(LIGHT_IDLE_INTERVAL_MICROSECOND); } // reactor->handle_events(&select_interval, &size_io_event); } ZLOG_INFO("[framework] app %s class [%s] run_instance end.", get_app_basename(), typeid(*this).name()); return SOAR_RET::SOAR_RET_SUCC; }
//运行处理, int Comm_SvrdApp_FSM_Notify::app_run() { // fix me add log ZCE_LOG(RS_INFO, "======================================================================================================"); ZCE_LOG(RS_INFO, "[framework] app %s class [%s] run_instance start.", get_app_basename(), typeid(*this).name()); //空闲N次后,调整SELECT的等待时间间隔 const unsigned int LIGHT_IDLE_SELECT_INTERVAL = 128; //空闲N次后,SLEEP的时间间隔 const unsigned int HEAVY_IDLE_SLEEP_INTERVAL = 10240; //microsecond // 64位tlinux下idle的时间如果太短会导致cpu过高 const int LIGHT_IDLE_INTERVAL_MICROSECOND = 10000; const int HEAVY_IDLE_INTERVAL_MICROSECOND = 100000; size_t all_proc_frame = 0 , all_gen_trans = 0; size_t prcframe_queue = 0 , gentrans_queue = 0, num_timer_expire = 0, num_io_event = 0; size_t idle = 0; MT_NOTIFY_TRANS_MANGER *notify_trans_mgr = static_cast<MT_NOTIFY_TRANS_MANGER *>(Transaction_Manager::instance()); ZCE_Time_Value select_interval(0, 0); ZCE_Timer_Queue *time_queue = ZCE_Timer_Queue::instance(); ZCE_Reactor *reactor = ZCE_Reactor::instance(); for (; app_run_;) { // 检查是否需要重新加载配置 //从PIPE处理收到的命令 notify_trans_mgr->process_pipe_frame(all_proc_frame, all_gen_trans); //从RECV QUEUE处理命令 notify_trans_mgr->process_recvqueue_frame(prcframe_queue, gentrans_queue); all_proc_frame += prcframe_queue; all_gen_trans += gentrans_queue; //超时 num_timer_expire = time_queue->expire(); // 处理网络包 reactor->handle_events(&select_interval, &num_io_event); if ((all_proc_frame + num_timer_expire + num_io_event) <= 0) { ++idle; } else { idle = 0; } //如果忙,继续干活 if (idle < LIGHT_IDLE_SELECT_INTERVAL) { select_interval.usec(0); continue; } //如果空闲很多,休息一下,如果你比较空闲,在这儿SELECT相当于Sleep, else if (idle >= HEAVY_IDLE_SLEEP_INTERVAL) { select_interval.usec(HEAVY_IDLE_INTERVAL_MICROSECOND ); } //else 相当于 else if (idle >= LIGHT_IDLE_SELECT_INTERVAL) else { select_interval.usec(LIGHT_IDLE_INTERVAL_MICROSECOND ); } } ZCE_LOG(RS_INFO, "======================================================================================================"); return 0; }
//运行处理, int Comm_SvrdApp_FSM::app_run() { ZCE_LOG(RS_INFO, "======================================================================================================"); ZCE_LOG(RS_INFO, "[framework] app %s class [%s] run_instance start.", get_app_basename(), typeid(*this).name()); //空闲N次后,调整SELECT的等待时间间隔 const unsigned int LIGHT_IDLE_SELECT_INTERVAL = 128; //空闲N次后,SLEEP的时间间隔 const unsigned int HEAVY_IDLE_SLEEP_INTERVAL = 10240; //microsecond // 64位tlinux下idle的时间如果太短会导致cpu过高 const int LIGHT_IDLE_INTERVAL_MICROSECOND = 10000; const int HEAVY_IDLE_INTERVAL_MICROSECOND = 100000; Transaction_Manager *trans_mgr = Transaction_Manager::instance(); size_t size_io_event = 0 , num_timer_expire = 0; size_t proc_frame = 0, gen_trans = 0, proc_data_num = 0; unsigned int idle = 0; ZCE_Time_Value select_interval(0, 0); ZCE_Timer_Queue *time_queue = ZCE_Timer_Queue::instance(); ZCE_Reactor *reactor = ZCE_Reactor::instance(); for (; app_run_;) { //处理收到的命令 trans_mgr->process_pipe_frame(proc_frame, gen_trans); //超时 num_timer_expire = time_queue->expire(); // IO事件 size_io_event = 0; reactor->handle_events(&select_interval, &size_io_event); //如果没有处理任何帧 if ((proc_frame + num_timer_expire + proc_data_num + size_io_event) <= 0) { ++idle; } else { idle = 0; } //如果忙,继续干活 if (idle < LIGHT_IDLE_SELECT_INTERVAL) { select_interval.usec(0); continue; } //如果空闲很多,休息一下,如果你比较空闲,在这儿SELECT相当于Sleep, else if (idle >= HEAVY_IDLE_SLEEP_INTERVAL) { select_interval.usec(HEAVY_IDLE_INTERVAL_MICROSECOND); } //else 相当于 else if (idle >= LIGHT_IDLE_SELECT_INTERVAL) else { select_interval.usec(LIGHT_IDLE_INTERVAL_MICROSECOND); } } ZCE_LOG(RS_INFO, "[framework] app %s class [%s] run_instance end.", get_app_basename(), typeid(*this).name()); ZCE_LOG(RS_INFO, "======================================================================================================"); return 0; }