brpc icon indicating copy to clipboard operation
brpc copied to clipboard

bthread支持多个线程池

Open vinllen opened this issue 2 years ago • 5 comments

Is your feature request related to a problem? (你需要的功能是否与某个问题有关?) bthread这种模型更适合网络IO比较重的场景,对于某些场景比如磁盘IO比较重的话,会导致bthread worker线程TaskGroup长期被占用,导致别的任务得不到调度。

Describe the solution you'd like (描述你期望的解决方法) bthread支持多个线程池,比如线程池1处理brpc/braft消息的分发,线程池2用于用户业务内部代码的运转。这样也方便做隔离,防止因为业务内部代码占用比较多的时间片资源从而导致别的任务得不到调度,进一步也实现了按优先级调度的策略。

Describe alternatives you've considered (描述你想到的折衷方案) 有一种折中的方式是自己搞一个线程池,bthread只用于brpc/braft等协议的交互,对于内部比如要写盘这些重IO操作的,可以丢到自己的线程池中去实现。但这里也有个性能问题就是会涉及到多次bthread<->pthread的来回切换,而且遇到锁的处理mutex/bmutex必须非常小心,否则特别容易出现死锁的问题。

Additional context/screenshots (更多上下文/截图)

vinllen avatar Sep 07 '23 08:09 vinllen

目前这个痛点对我们比较明显,目前共用一个大的bthread线程池会导致资源争抢,比如一个大IO导致bthread打满,从而影响了控制链路层面的问题,比如braft主从心跳断开了,这个影响面就比较大了。

一方面,我们做了一些流控策略,另一方面,我们计划在bthread里面做一些改造。

我们计划自己修改bthread代码,现在有2个修改思路,大佬帮忙做一下可行性的评估。

  1. 从TaskControl层面拆开,全局2个TaskControl。每个TaskControl下来都有一组TaskGroup,比如64个。
  2. 全局仍然保留一个TaskControl,但是内部拆2组隔离的TaskGroup list,例如TaskGroup list1管理32个线程(TaskGroup),TaskGroup list2管理32个线程,list1和list2互相隔离。stealing策略不跨list。

vinllen avatar Sep 07 '23 08:09 vinllen

https://github.com/apache/brpc/pull/2358 这个PR能满足需求吗?

wwbmmm avatar Sep 07 '23 09:09 wwbmmm

@wwbmmm 可以满足需求,这个PR会合入吗

vinllen avatar Sep 07 '23 11:09 vinllen

请问op和brpc maintainer,是否有合适的方法得到一个bthread在被调度前wait的耗时?我们的服务也怀疑有这样的问题,但是苦于没有证据。

coyorkdow avatar Oct 30 '23 10:10 coyorkdow

@coyorkdow 这个指标反馈bthread创建到被调度的时间:bthread_creation_latency

vinllen avatar Oct 31 '23 07:10 vinllen