参数配置优先级
dubbo中的配置存在优先级,不考虑优先级的话,很有可能出现调优参数设置了却没生效的问题。
dubbo分为consumer和provider端,在配置各个参数时,其优先级如下:
- consumer的method配置
- provider的method配置
- consumer的reference配置
- provider的service配置
- consumer的consumer节点配置
- provider的provider节点配置
方法级的配置优先级高于接口级,consumer的优先级高于provider。
参数调优
参数名 | 作用范围 | 默认值 | 说明 | 备注 |
threads | provider | 200 | 业务处理线程池大小 | |
threadspool | provider | fixed | 线程池类型,其值可以是 fixed、cached、limited、eager | fixed 线程池启动时就创建了固定大小的线程数,不做伸缩。 limited 可伸缩线程池,但池中的线程数只会增长不会收缩,为了避免收缩时突然来了大流量引起的性能问题。 |
dispatcher | provider | All | 一般可以选message,只有请求响应消息派发到线程池,其它连接断开事件、心跳等消息,直接在IO线程上执行。 | 设置成message不会存在Provider线程池满了,Consumer却还在等待的情况,因为默认IO线程池是无界的,一定会有线程来处理异常和应答,减少在Provider线程池打满时整个系统雪崩的风险。 |
iothreads | provider | CPU+1 | io线程池大小 | |
queues | provider | 0 | 线程池队列大小,当线程池满时,排队等待执行的队列大小, 建议不要设置,当线程程池时应立即失败,重试其它服务提供机器。 | |
connections | consumer | 0 | 对每个提供者的最大连接数, rmi、http、hessian等短连接协议表示限制连接数, Dubbo等长连接协表示建立的长连接个数 | Dubbo协议默认共享一个长连接 |
actives | consumer | 0 | 每服务消费者每服务每方法最大并发调用数 | 0表示不限制 |
acceptes | provider | 0 | 服务提供方最大可接受连接数 | 0表示不限制 |
executes | provider | 0 | 服务提供者每服务每方法最大可并行执行请求数 | 0表示不限制 |
参数在dubbo流程中应用
- consumer发起一个请求时,首先经过active limit(参数actives消费端最大并发调用数)进行方法级别的限制,如果超过actives则等待有其他请求完成后重试或者超时后失败。
- 从多个连接(connections)中选择一个连接发送数据,对于默认的netty实现来说,由于可以复用连接,默认一个连接就可以。线上业务由于有多个consumer多个provider,因此不建议增加connections参数。
- 连接到达provider时(如dubbo的初次连接),首先会判断总连接数是否超限(acceps),超过限制连接将被拒绝。
- 连接成功后,具体的请求交给io thread处理。io threads虽然是处理数据的读写,但io部分为异步,更多的消耗的是cpu,因此iothreads默认cpu个数+1是比较合理的设置,不建议调整此参数。
- 数据读取并反序列化以后,交给业务线程池处理,默认情况下线程池为fixed,且排队队列为0(queues),这种情况下,最大并发等于业务线程池大小(threads),如果希望有请求的堆积能力,可以调整queues参数。如果希望快速失败由其他节点处理(官方推荐方式),则不修改queues,只调整threads。
- execute limit(参数executes)是方法级别的并发限制,原理与actives类似,只是少了等待的过程,即受限后立即失败。
- tps,控制指定时间内(默认60s)的请求数。注意目前dubbo默认没有支持该参数,需要加一个META-INF/dubbo/com.alibaba.dubbo.rpc.Filter文件,文件内容为:tps=com.alibaba.dubbo.rpc.filter.TpsLimitFilter