提高Producer的发送速度

发送一条消息出去要经过三步,一是客户端发送请求到服务器,二是服务器处理该请求,三是服务器向客户端返回应答,一次消息的发送耗时是上述三个步骤的总和。在一些对速度要求高,但是可靠性要求不高的场景下,比如日志收集类应用,可以采用Oneway方式发送,Oneway方式只发送请求不等待应答,即将数据写入客户端的Socket缓冲区就返回,不等待对方返回结果,用这种方式发送消息的耗时可以缩短到微秒级。

另一种提高发送速度的方法是增加Producer的并发量,使用多个Producer同时发送,我们不用担心多Producer同时写会降低消息写磁盘的效率,RocketMQ引入了一个并发窗口,在窗口内消息可以并发地写入DirectMem中,然后异步地将连续一段无空洞的数据刷入文件系统当中。顺序写CommitLog可让RocketMQ无论在HDD还是SSD磁盘情况下都能保持较高的写入性能。目前在阿里内部经过调优的服务器上,写入性能达到90万+的TPS,我们可以参考这个数据进行系统优化。

在Linux操作系统层级进行调优,推荐使用EXT4文件系统,IO调度算法使用deadline算法。

如图7-3所示,EXT4创建/删除文件的性能比EXT3及其他文件系统要好,RocketMQ的CommitLog会有频繁的创建/删除动作。

图7-3 几种文件系统在Bonnie++中创建/删除32K文件需要的时间

另外,IO调度算法也推荐调整为deadline。deadline算法大致思想如下:实现四个队列,其中两个处理正常的read和write操作,另外两个处理超时的read和write操作。正常的read和write队列中,元素按扇区号排序,进行正常的IO合并处理以提高吞吐量。因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,可能会有其他磁盘位置的IO请求被饿死。超时的read和write的队列中,元素按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的IO请求会优先被处理。

相关推荐
忆~遂愿9 小时前
电影照片散在硬盘里不好找?我用群晖+Plex整理成可远程访问的家庭媒体库
开发语言·php
这个DBA有点耶9 小时前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba
宋明河9 小时前
windows与ubuntu双系统主机下ubuntu访问windows磁盘是只读
linux·windows·ubuntu
chenxy029 小时前
国产加速卡-应知应会
linux·运维·服务器
小羊没烦恼!9 小时前
浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
前端·数据库·后端·python·web安全·oracle
HackTwoHub9 小时前
免 Root 安卓渗透工具 Stryker|把 Kali 装进手机!随身无线渗透工作站,内置 Nmap/Nuclei/Metasploit 全套武器库
android·linux·运维·人工智能·web安全·macos·智能手机
RuoyiOffice9 小时前
Spring AI+Vue3 企业知识库设计:让每个答案有依据,让每份资料守住权限
java·spring boot·vue3·rag·企业知识库·spring ai·ruoyi office
代码村新手9 小时前
Linux-环境变量
linux
kmomo..9 小时前
Linux 驱动开发学习笔记:I2C 子系统从入门到实践
linux·驱动开发·学习
敲上瘾10 小时前
分布式系统——Redis哨兵:自动故障转移与选举原理
linux·数据库·redis·分布式·缓存·微服务