dubbo参数调优说明

转载:http://blog.csdn.net/youaremoon/article/details/51884644


dubbo作为一个服务治理框架,功能相对比较完善,性能也挺不错。但很多朋友在使用dubbo的时候,只是简单的参考官方说明进行搭建,并没有过多的去思考一些关键参数的意义(也可能是时间紧任务多,没空出来研究),最终做出来的效果有一定的打折。 这里我根据目前我们项目的使用情况列出几个性能调优的参数及其意义,供大家参考。

        在介绍参数之前,我们先了解下dubbo中配置的优先级,以免出现调优参数设置了却没发现效果实际是配置被覆盖导致这样的问题。dubbo分为consumer和provider端,在配置各个参数时,其优先级如下:

1、consumer的method配置 

2、provider的method配置

3、consumer的reference配置

4、provider的service配置

5、consumer的consumer节点配置

6、provider的provider节点配置

可以看到,方法级的配置优先级高于接口级,consumer的优先级高于provider。同时,在本地参数配置还存在一层优先级:

1、系统参数(-D),如-Ddubbo.protocol.port=20881

2、xml配置

3、property文件

         了解了这两个优先级,调优起来才会更加清晰,省去了一些诸如配置设置了不生效这样的麻烦。注意,其实dubbo中还可以通过将配置写入注册中心的方式覆盖用户配置(优先级高于系统参数),这里不展开,有兴趣的同学可以去看官方文档。接下来我们看看dubbo的几个比较重要的调优参数,及其影响的方式和大概实现。

          

参数名作用范围默认值说明备注
activesconsumer0每服务消费者每服务每方法最大并发调用数0表示不限制
connectionsconsumer 对每个提供者的最大连接数,rmi、http、hessian等短连接协议表示限制连接数,dubbo等长连接协表示建立的长连接个数dubbo时为1,及复用单链接
acceptsprovider0服务提供方最大可接受连接数0表示不限制
iothreadsprovidercpu个数+1io线程池大小(固定大小) 
threadsprovider200业务线程池大小(固定大小) 
executesprovider0服务提供者每服务每方法最大可并行执行请求数0表示不限制
tpsprovider 指定时间内(默认60s)最大的可执行次数,注意与executes的区别默认不开启












        注意表中参数与图中的对应关系:

        1、当consumer发起一个请求时,首先经过active limit(参数actives)进行方法级别的限制,其实现方式为CHM中存放计数器(AtomicInteger),请求时加1,请求完成(包括异常)减1,如果超过actives则等待有其他请求完成后重试或者超时后失败;

        2、从多个连接(connections)中选择一个连接发送数据,对于默认的netty实现来说,由于可以复用连接,默认一个连接就可以。不过如果你在压测,且只有一个consumer,一个provider,此时适当的加大connections确实能够增强网络传输能力。但线上业务由于有多个consumer多个provider,因此不建议增加connections参数;

        3、连接到达provider时(如dubbo的初次连接),首先会判断总连接数是否超限(acceps),超过限制连接将被拒绝;

        4、连接成功后,具体的请求交给io thread处理。io threads虽然是处理数据的读写,但io部分为异步,更多的消耗的是cpu,因此iothreads默认cpu个数+1是比较合理的设置,不建议调整此参数;

        5、数据读取并反序列化以后,交给业务线程池处理,默认情况下线程池为fixed,且排队队列为0(queues),这种情况下,最大并发等于业务线程池大小(threads),如果希望有请求的堆积能力,可以调整queues参数。如果希望快速失败由其他节点处理(官方推荐方式),则不修改queues,只调整threads;

        6、execute limit(参数executes)是方法级别的并发限制,原理与actives类似,只是少了等待的过程,即受限后立即失败;

        7、tps,控制指定时间内(默认60s)的请求数。注意目前dubbo默认没有支持该参数,需要加一个META-INF/dubbo/com.alibaba.dubbo.rpc.Filter文件,文件内容为:

                   tps=com.alibaba.dubbo.rpc.filter.TpsLimitFilter


        从上面的分析,可以看出如果consumer数*actives>provider数*threads且queues=0,则会存在部分请求无法申请到资源,重试也有很大几率失败。 当需要对一个接口的不同方法进行不同的并发控制时使用executes,否则调整threads就可以。




### 设计一个用于教师确认年度及聘期教学工作量系统的原型图 为了实现一个高效的系统来帮助教师确认其年度及聘期的教学工作量,可以考虑以下几个方面: #### 功能模块划分 1. **登录与身份验证** 教师可以通过唯一的工号或邮箱地址进行登录认证[^1]。此功能确保只有授权人员能够访问敏感数据。 2. **个人信息管理** 提供界面让教师更新他们的基本信息,如联系方式、所属院系等。这有助于保持记录的准确性并便于后续通知发送。 3. **教学活动录入** 创建表单允许教师输入不同类型的教育活动详情,比如课程名称、授课对象(本科/硕士),以及具体的课时数量等信息。这些字段应支持批量导入导出操作以便于大规模处理。 4. **自动计算机制** 基于预设的标准公式(例如每节课对应多少标准学时),系统会自动生成每位老师的总教学当量学时数,并显示给用户查看。 5. **审核流程集成** 设置多级审批过程,在提交之后由相关部门负责人逐层审查所填写的内容是否属实合理。一旦批准,则正式计入该名教职员工的工作档案之中。 6. **反馈渠道建立** 开通在线留言板或者邮件提醒服务,方便师生之间就任何疑问展开交流沟通而不必依赖第三方通讯工具像钉钉那样单独发消息。 7. **报表生成功能** 定义多种格式选项可供下载打印最终版本的结果文件,满足不同场合下的需求展示要求。 以下是基于上述描述的一个简单Python脚本示例,它模拟了一个基本的数据收集和初步核算逻辑: ```python class TeacherWorkloadSystem: def __init__(self, teacher_id): self.teacher_id = teacher_id self.activities = [] def add_activity(self, activity_type, hours_spent): """Add a new teaching activity.""" self.activities.append({"type": activity_type, "hours": hours_spent}) def calculate_workload(self): """Calculate total workload based on predefined standards.""" standard_hours_per_class = 10 # Example value; adjust as needed. total_standard_hours = sum([act["hours"] * (standard_hours_per_class / act["hours"]) for act in self.activities]) return round(total_standard_hours) # Usage example teacher_system = TeacherWorkloadSystem("TCH123") teacher_system.add_activity("Undergraduate Lecture", 40) teacher_system.add_activity("Graduate Seminar", 20) print(f"Total Workload: {teacher_system.calculate_workload()} Standard Hours.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值