task control 中所有的 local queue is full 导致死锁&解决方案.
问题: 当请求量过大时,所有的local queue 都是 full 的状态,就会执行pthread 的 usleep,这样会导致死锁(这个问题以前有人提过). ====task_group_inl.h 代码如下===== while (!_rq.push(tid)) { flush_nosignal_tasks(); ::usleep(1000); } 方案 如果local queue 是full 的状态,当前线程直接执行,不尝试再次放到队列中(不进行 usleep) 伪代码如下: while (!_rq.push(tid)) { // 替换 usleep, push tid 失败,直接执行tid(不经过队列,直接切换栈) TaskGroup::exchange( current_group , tid) } @jamesge @cdjingit 戈神,帮忙评估一下这个方案的风险性 ? 多谢.
@jamesge @cdjingit 对于local queue队列满了,上面方案可行的,我们经过验证,并且已经应用到在线服务. brpc 官方可以考虑一下,或有更好的方案,多谢.
直接TaskGroup::exchange切换栈的话,当前bthread是不是丢失了?没有把当前bthread的tid记录到队列里。
直接TaskGroup::exchange切换栈的话,当前bthread是不是丢失了?没有把当前bthread的tid记录到队列里。
当前的bthread会被push进rq里面,等待执行。这样不能解决问题