文档章节

【面试必问】支撑百万并发的"IO多路复用"技术你了解吗?

Java干货分享
 Java干货分享
发布于 11/19 21:38
字数 972
阅读 15
收藏 0

多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理。对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输;由于上层应用协议的制订问题,导致了很多传统服务并不能支持多路复用;如:http1.1,sqlserver和redis等等,虽然有些服务提供批量处理,但这些处理都基于一个RPS(每秒请求数)下。下面通过图解来了解释单路和多路复用的区别。

 

一、单路存在的问题

每个请求响应独占一个连接,并独占连接网络读写;这样导致连接在有大量时间被闲置无法更好地利用网络资源。由于是独占读写IO,这样导致RPS处理量由必须由IO承担,IO操作起来比较损耗性能,这样在高RPS处理就出现性能问题。由于不能有效的合并IO也会导致在通讯中的带宽存在浪费情况,特别对于比较小的请求数据包。通讯上的延时当要持大量的RPS那就必须要有更多连接支撑,连接数增加也对资源的开销有所增加。

二、多路复用的优点

多路复用可以在一个连接上同时处理多个请求响应,这样可以大大的减少连接的数量,并提高了网络的处理能力。由于是共享连接不同请求响应数据包可以合并到一个IO上处理,这样可以大大降低IO的处理量,让性能表现得更出色。

三、通过多路复用实现百万级RPS

多路复用是不是真的如此出色呢,以下在.net core上使用多路复用实现单服务百万RPS吞吐,并能达到比较低的延时性。以下是测试流程:

 

由于基础通讯不具备消息包合并功能,所以在BeetleX的基础上做集成测试,主要BeetleX会自动合并消息到一个Buffer上,从而降低IO的读写。

四、测试消息结构

本测试使用了Protobuf作为基础交互消息,毕竟Protobuf已经是一个二进制序列化标准了。

4.1、请求消息

 

4.2、响应消息

 

4.3、服务端处理代码

 

4.4、服务响应对象内容

 

接收消息后放入队列,然后由队列处理响应,设置请求相应请求时间并记录总处理消息计数。

4.5、客户端请求代码

 

4.6、客户端测试发起代码

 

整个测试开启了10个连接,在这10个连接的基础上进行请求响应复用。

五、测试配置

测试环境是两台服务器,配置是阿里云上的12核服务器(对应的物理机应该是6核12线程)

服务和客户端的系统都是:Ubuntu 16.04

Dotnet core版本是:2.14

六、测试结果

6.1、客户端统计结果

 

6.2、服务端统计信息

 

6.3、带宽统计

 

测试使用了10个连接进行多路复用,每秒接收响应量在100W,大部分响应延时在1-3毫秒之间;

6.4、测试代码

https://github.com/IKende/BeetleX/blob/master/samples/MultiplexingConnectionTest.zip

© 著作权归作者所有

共有 人打赏支持
Java干货分享
粉丝 146
博文 79
码字总数 231104
作品 0
深圳
私信 提问
五种网络IO模型和select/epoll对比

下面都是以网络读数据为例 【2阶段网络IO】 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络IO模型 【阻塞blocking IO】 两...

一凡Sir
06/26
0
0
Java IO:BIO和NIO区别及各自应用场景

引言 BIO和NIO是两种不同的网络通信模型,现如今NIO已经大量应用在Jetty、ZooKeeper、Netty等开源框架中。 一个面向流、一个面向缓冲区 一个是阻塞式的、一个非阻塞 一个没有io多路复用器、一...

Zero零_度
2016/08/27
73
0
单线程多路复用和多线程加锁的区别(Redis)

单线程多路复用和多线程加锁的区别 unix linux c golang Deen 2015年11月21日提问 关注 9 关注 收藏 1 收藏,776 浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键...

tantexian
2016/06/06
775
0
Python篇-IO多路复用详解

一 : 科普一分钟 是的一种,是一种单线程处理多并发的操作的方案,其他操作方案分别有 : 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( IO multiplexing) 异步 I/O(...

TianTianBaby223
2017/12/01
0
0
架构设计:系统间通信(4)——IO通信模型和JAVA实践 中篇

4、多路复用IO模型 在“上篇”文章中,我们已经提到了使用多线程解决高并发场景的问题所在,这篇文章我们开始 4-1、现实场景 我们试想一下这样的现实场景: 一个餐厅同时有100位客人到店,当...

旋转木马-千里马
2016/03/22
22
0

没有更多内容

加载失败,请刷新页面

加载更多

dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
4分钟前
0
0
mac 下 mysql 8.0.13 安装并记录遇到的问题 以便以后查看

安装 官网mysql 下载地址 安装过程 省去 安装好之后 下载navicat 错误1 链接 遇到 mysql 2003 - Can't connect to MySQL server 错误, 解决方案 重启mysql 服务 #错误2 ERROR 1045: Acces...

杭州-IT攻城狮
昨天
5
0

中国龙-扬科
昨天
1
0
[Spring4.x]基于spring4.x纯注解的Web工程搭建

在前文中已经说明了如何基于 Spring4.x+ 版本开发纯注解的非web项目,链接如下: https://my.oschina.net/morpheusWB/blog/2985600 本文则主要说明,如何在Web项目中,"基于spring纯注解方式...

morpheusWB
昨天
16
0
基础编程题目集-7-13 日K蜡烛图

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开...

niithub
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部