异数OS TCP协议栈测试(三)--长连接篇
异数OS TCP协议栈测试(三)--长连接篇
本文来自异数OS社区
异数OS-织梦师(消息中间件)群: 476260389
异数OS TCP长连接技术简介
说起长连接,则首先要谈对C10K的理解与认识,异数OS认为传统系统中C10K问题主要如下:
1. 传统OS 线程切换代价很大,线程资源有限(500以上可用性降低),这使得多线程阻塞IO性能达到1W时,线程切换将占满系统负载,应用并发session数量则被系统线程数量约束,但多线程阻塞IO这种模式对应用逻辑设计而言却是天然简单友好靠谱的,而异数OS线程切换能力为80M, 1亿线程4G内存,也不会降低太多线程切换能力以及IO能力, 所以使用这种方案。
2. 为了避免线程切换以及线程资源不够带来的问题,主流操作系统使用队列技术(iocp epoll)来批量成倍提升IO性能,每次线程切换完成10个甚至数百个IO操作或者event推送,使用异步技术来让单个线程管理多个session的能力,所以表面上看提高了并发容量,但这类技术却大大降低了并发质量反而造成了更严重的C10K问题,使用这一技术,每个链接必须要提供中间传输缓存,链接多了后,IO需求大时,队列会很长,延迟会很高,加重了系统负担,由于这类技术都是非阻塞异步IO,不能较好的阻塞session应用逻辑,因此无法为每链接做可靠的业务流程控制以及QOS控制,链接多了,就会有饿死的链接,出现大量错误IO,相对多线程阻塞IO模式,雪崩问题更加严重。
3. TCP协议栈没有为海量链接做优化,其常见的流控拥塞算法都只针对链接自身的IO性能,并不考虑上层应用实际需求,以及其他链接的IO需求,在这种情况下TCP检查网络拥塞的算法将没有任何意义,实际测试发现如果每链接IO不做控制,1000链接都很难上去,正确的做法是将拥塞控制算法提高到系统层以及应用层由系统QOS任务调度以及应用需求共同来实现。
4. 协议栈中间缓存太多,拷贝动作较多,传统OS每链接协议栈需要4K以上内存,实做一个1000W链接的系统一般要60G内存起步,这直接增加了系统负载,降低了系统可用性。
5. 协议栈IO性能不足,由于传统操作系统IO性能约束,实做的协议栈只能提供10-40W的IO性能,并且不能多核扩充,IO过载时会,协议栈会出现无响应丢包现象,丢包后协议栈性能需求会更高,能提供的IO性能会大大降低,如果应用不能适应这种IO性能变化,将会制造更多的中间缓存,导致雪崩,在这样的情况下,做1000W链接的应用可用性会受到极大的限制,比如微信使用这一类技术就只能用于心跳链接活跃检查。
一些号称实做了C10M的技术方案从本质上没有解决上述问题,仅仅靠硬件技术堆硬件配置来表面实现,但实际上却没有任何可用性。
异数OS TCP长连接技术演变
2015年,异数OS考虑开始使用海量线程同步阻塞IO的方案来解决iocp不能做QOS,队列过长的问题,异数OS使用任务调度来控制每链接的IO提交性能需求,并智能感知雪崩情况的发生,动态控制IO性能以及应用提交的中间缓存规模,从而减少了中间缓存开销,降低了海量并发下iocp队列深度,降低对宿主操作系统的负载压力,从而实现了1000W链接12W的消息推送性能。
2017年,由于发现宿主操作系统协议栈的能力约束,异数OS决定抛弃宿主操作系统协议栈,以及IO技术,开始自主研发TCP协议栈,实做0中间缓存,1次中间拷贝的技术,从而达到每链接300字节占用,并发容量相对异数OS 2015,提高15倍,IO性能提升100倍,且可以多核扩充,大大提高了海量并发环境的系统可用性。
测试目标
TCP 长链接IO性能测试,Client Server都采用单线程半双工模式,创建600W客户端(本机测试相当于1200W链接),链接服务端后做循环ECHO,测试ECHO IO性能,IO延迟,每链接性能稳定性。
基本测试环境
VMware 12
异数OS宿主操作系统 debian 8 64位
CPU : NUC i3 2.6G 双核
内存:5GB
相关参数
1. 带包头200字节负载,不带crc checksum, 无丢包,无硬件延迟情况。
2. TCP协议栈使用均衡IO调度策略。
测试方案一 (单核)
在同一个CPU核上创建Server,600W个Client, 以太层使用异数OS软件交换机本地核定向转发。
启动前期:
启动后期(2个多小时后):
总计ECHO IOPS 为2.3M ,软件交换机包交换能力9Mpps,由于Client占用60%的负载,软件交换机占用20%负载,所以预计真实环境中最大可达到6.0M左右的ECHO能力,IO延迟方面,在系统启动阶段由于大量链接的建立,每链接IO需求不稳定,系统QOS IO均衡并没有显著的发生作用,平均延迟达到了2秒,一些链接任然有饥饿现象,出现上百秒才响应的情况,在稳定链接后期,每链接IO需求稳定后,IO延迟下降,饥饿现象得到缓解,但还是有10s延迟的链接出现。
总结
由于只使用了TCP协议栈的任务均衡调度控制方案,因此每链接IO质量在应用负载不均的情况下还是不能得到及早的控制,这个问题后面会由应用系统的QOS来解决,比如mqtt等专业的APP QOS控制,下面是几种主流系统的海量链接平台能力性能对比,数据来自官网以及第三方测试,可比性可能不高,但也可做参考估算,读者如有其他海量并发的技术测试也欢迎提供
对比项目 |
异数OS 2018 |
异数OS 2015+Win7 |
异数OS 2015+Win10 |
360push |
|
CPU占用数量 |
1 |
16 |
16 |
24 |
12 |
内存占用 |
4G |
64G |
64G |
256G |
128G |
实现的链接数 |
1200W |
1000W |
300W |
100W |
300W |
使用的技术平台 |
寄宿Linux下+异数自主协议栈 |
寄宿win下+iocp |
寄宿win下+iocp |
Go+epoll |
Erlang+epoll |
测试内容 |
ECHO 推拉 |
仅推 |
仅推 |
仅推 |
仅推 |
推送性能 |
4.5M |
12W |
40W |
2W |
12W |
折算的IO性能 |
9M |
12W |
40W |
2W |
12W |
已知问题 |
缺乏经费支持 |
缺乏经费支持 |
缺乏经费支持 |
容易宕机,要反复重启 |
特制应用平台,不同用。 |
异数OS TCP协议栈测试(三)--长连接篇的更多相关文章
- 异数OS TCP协议栈测试(五)--关于QOS与延迟
. 异数OS TCP协议栈测试(五)–关于QOS与延迟 ##本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 6524 ...
- 异数OS TCP协议栈测试(四)--网卡适配篇
异数OS TCP协议栈测试(四)–网卡适配篇 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455784 异 ...
- 异数OS TCP协议栈测试(二)--短连接篇
异数OS TCP协议栈测试(二)--短连接篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 测试目标 TCP 短链接IO性能测试,Client Se ...
- 异数OS TCP协议栈测试(一)--数据传输篇
异数OS TCP协议栈测试(一)--数据传输篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 测试目标 数据传输IO性能测试,主要是建立连接后测试收 ...
- 异数OS国产CPU平台移植项目需求分析
异数OS国产CPU平台移植项目需求分析 目录 异数OS国产CPU平台移植项目需求分析 项目立项背景 项目需求分析 异数OS性能指标简介 1.TCP协议栈性能测试 2.异数OS-织梦师-水母 消息队列性 ...
- 异数OS 织梦师-水桶(三)-- RAM共享存储方案
. 异数OS 织梦师-水桶(三)– RAM共享存储方案 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455 ...
- 国产CPU 申威1621 异数OS基础组件理论性能测试报告
国产CPU 申威1621 异数OS基础组件理论性能测试报告 文章目录 国产CPU 申威1621 异数OS基础组件理论性能测试报告 前言 测试平台 测试项目 SW1621 异数OS 容器虚拟交换机模拟性 ...
- 异数OS 织梦师-纤手(二)-- LPC RPC篇
异数OS 织梦师-纤手(二)– LPC RPC篇 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455784 ...
- 异数OS 织梦师-Xnign(四)-- 挑战100倍速Nginx,脚踩F5硬件负载均衡
. 异数OS 织梦师-Xnign(四)– 挑战100倍速Nginx,脚踩F5硬件负载均衡 本文来自异数OS社区 github: https://github.com/yds086/HereticOS ...
随机推荐
- js 中日期2013-08-30或2019-08-24 12:30:00 转换成时间戳,和2019-08-29T02:15:08.000+0000转化为2019-08-29T02:15:08
js 中日期2019-08-24 或2019-08-24 12:30:00 转换成时间戳 首先将它转成date日期类型,然后获取毫秒形式时间戳 let date=new Date("2019 ...
- WNMP nginx+php5+mysql测试环境安装(Windows7)(二)
3. 安装Zend Optimizer Zend Optimizer对那些在被最终执行之前由Run-Time Complier产生的代码进行优化,提高PHP应用程序的执行速度.一般情况下,执行使用Ze ...
- 什么是激励函数 (Activation Function)
relu sigmoid tanh 激励函数. 可以创立自己的激励函数解决自己的问题,只要保证这些激励函数是可以微分的. 只有两三层的神经网络,随便使用哪个激励函数都可以. 多层的不能随便选择,涉及梯 ...
- 0005 表格table
第01阶段.前端基础.表格 表格 table 目标: 理解: 能说出表格用来做什么的 表格的基本结构组成 应用: 能够熟练写出n行n列的表格 能简单的合并单元格 表格作用: 存在即是合理的. 表格 ...
- 【题解】JXOI2018游戏(组合数)
[题解]JXOI2018游戏(组合数) 题目大意 对于\([l,r]\)中的数,你有一种操作,就是删除一个数及其所有倍数.问你删除所有数的所有方案的步数之和. 由于这里是简化题意,有一个东西没有提到: ...
- 使用Django进行后端开发
目录 更换pip源 搭建虚拟环境 项目目录设置 项目相关配置 更换pip源 更换pip源 搭建虚拟环境 搭建虚拟开发环境 项目目录设置 项目目录设置 项目相关配置 项目相关配置
- 20行Python代码爬取王者荣耀全英雄皮肤
引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...
- 7.netty内存管理-ByteBuf
ByteBuf ByteBuf是什么 ByteBuf重要API read.write.set.skipBytes mark和reset duplicate.slice.copy retain.rele ...
- Redis实战 | 持久化、主从复制特性和故障处理思路
前言 前面两篇我们了解了Redis的安装.Redis最常用的5种数据类型.本篇总结下Redis的持久化.主从复制特性,以及Redis服务挂了之后的一些处理思路. 前期回顾传送门: Linux下安装Re ...
- docker练习-容器和服务
使用定义容器 Dockerfile Dockerfile定义容器内环境中发生的事情.对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界, ...