在.net中做网络通讯往往都会用到SocketAsyncEventArgs,为了得到更好的性能配合Pool复用SocketAsyncEventArgs可以得到一个更好的效果,但在dotnet core在linux下这一块的处理好像存在严重的问题!经过多天的测试,终于在Linux下Debug到这一情况,实时调试输出接收的数据并不是当前请求的数据,而是之前另一请求的数据…… 接下来一下问题的实际情况!

问题的初现

前段时间有一个用户说FastHttpApi跑了一段时间后就出现请求混乱的情况,用户反映测试都正常,一发布上线在集群环境下运行一段时间后就会出现这情况……然后自己也根据相应的集群情况搭了个测试环境压测了一段时间也没出现这情况。本以为是用户集群路由转发的一些特性引起的异常就放下了这问题继续完成新功能版本。

再次发现问题并确认

当组件的接口集群调用体功能完成后,开始做接口混合调用并发测试,这个时候出现一些怪异的情况,当前请求返回的数据并不是当前请求数据内容,而是来源于其他请求的数据内容!后来在测试的过程中同时用浏览器访问相关接口,这个时候问题再一次出现,浏览器得到响应的数据并不是请求响应的数据,而是测试接口那边的数据。后来关闭压力测试,单独用浏览器访问还是有异常,打开日志发现浏览器请求的数据到服务端接收得到的数据竟然是之前测试请求的数据!这样的问题相当尴尬……因为接收数据是由‘’SocketAsyncEventArgs‘’来处理,我一直不相信问题出在SocketAsyncEventArgs身上;最终迫于没办法的情况只能调试Linux运行的代码,通过VS2017调试linux下dotnet core程序 最后把所有涉及请求的测试都关闭,单独由浏览器请求,这个时候得到的请求我都感到惊讶! 

从结果看接收的数据并不是浏览器发出请求的数据,而是之前测试程序请求的内容,数据显示User-Agent都不是浏览器的内容。

调整实现

按理这样的问题不应该出现,因为早期MSDN也是推荐使用SocketAsyncEventArgs Pool的方式来复用SocketAsyncEventArgs提高性能。asp.net core核心的网络模块也是用这个的,如果有问题应该早就发现并解决掉!查看KestrelHttpServer 代码后才发现并没有使用SocketAsyncEventArgs Pool,每个连接都是单独的SocketAsyncEventArgs 并没有通过Pool共享,对应用的一次绑定的Buffer已经改由Pipe统一管理,每次收发都重新设置一下Buffer属性。 为了快速地解决这一问题,放弃了原有SocketAsyncEventArgs Pool的使用方式,改用KestrelHttpServer方式进行组件改造,这种方式通过了两天的混合并发测试暂没有出现之前的情况,估计之前的问题是由SocketAsyncEventArgs共享复用导致的;则于无法判断最终向corefx团队提了:issue,https://github.com/dotnet/corefx/issues/33794 这问题应该是存在的,因为碰到这一情况还有其他人。

总结

这问题发现到排查花了一个多星期的时间……到底是SocketAsyncEventArgs 的bug还是使用上不对导致的还没搞清楚,已经把相关问题描述和测试出现问题的程序提交给corefx团队,希望尽快能搞清楚具体原因。通过这一次问题总结出一个问题,在做网络测试的时候需要做更多的混合验证测试,特别针对这一问题,由于数据都是符合当前协议的,所以并不会有什么异常出现。但导致数据混乱这种问题比异常来得更严重和影响面更大。

.netcore使用SocketAsyncEventArgs Pool需要注意!的更多相关文章

  1. c#版 mqtt 3.1.1 client 实现

    c# 版 mqtt 3.1.1 client http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html 上面为 3.1.1 协议报文 一 ...

  2. SocketAsyncEventArgs使用解说

    原文:SocketAsyncEventArgs使用解说 如果在.NET下写过网络通讯的同学应该感觉不陌生了,有很多刚入门的同学很多都认为这东西可以大大提高处理效能还有就是使用上很不适应.其实使用之前最 ...

  3. 物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线

    正所谓天下大势,不跟风不行.你不跨平台,很low嘛.java说:你们能跨嘛,跨给我看看.C#说:不要强人所难嘛.java说:能部署在云上吗?docker?微服务?C#说:不要强人所难嘛.java说:你 ...

  4. .NETCore 新型 ORM 功能介绍

    简介 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+. 定义 IFre ...

  5. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

  6. (转)C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信

    原文地址:http://freshflower.iteye.com/blog/2285272.http://freshflower.iteye.com/blog/2285286 一)服务器端 说到So ...

  7. 使用.NetCore在Linux上写TCP listen 重启后无法绑定地址

    拥抱.net core的过程中, 将公司的一套java项目改成了.net core 2.0版的. 里面的tcp服务被我用msdn的SocketAsyncEventArgs方式重写了, 然而在测试的过程 ...

  8. 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...

  9. 数据库表结构文档查看器 基于netcore

    前言 日常开发业务代码,新接手一块不熟悉的业务时需要频繁的查看对应业务的数据库表设计文档.相比于直接翻看业务代码,有必要提供一个数据库表结构文档查看器来解决这些繁琐的问题. CML.SqlDoc CM ...

随机推荐

  1. 用DFS求连通块(种子填充)

    [问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...

  2. 七牛云音频转码准备工作之如何创建音视频处理私有队列pipeline

    如何创建音视频处理私有队列 最近更新时间:2017-08-28 15:54:45 在七牛进行音视频处理,推荐使用私有队列(pipeline). 创建私有队列方法如下: 第一步 登录七牛开发者平台 ht ...

  3. Flume+Kafka+Storm+Hbase+HDSF+Poi整合

    Flume+Kafka+Storm+Hbase+HDSF+Poi整合 需求: 针对一个网站,我们需要根据用户的行为记录日志信息,分析对我们有用的数据. 举例:这个网站www.hongten.com(当 ...

  4. 性能之ab简单使用

    ab是apache自带的性能测试工具,他所有关注的请求返回的状态码(2XX),不关心后续处理过程,所以测试时间很小,严重依赖CPU颗粒数 一.进入ab存放的目录执行./ab.其中/ab [option ...

  5. vue Error: No PostCSS Config found in

    最近在做一个vue的移动端的项目,遇到一个问题,我本地的项目运行正常,可是上传到github上的一启动就报错,就是标题上的错误,找了很久,刚开始以为是某个css没有配置,就把本地的复制过去还是报错,无 ...

  6. Http_4个新的http状态码:428、429、431、511

    1.428 Precondition Required (要求先决条件) 先决条件是客户端发送 HTTP 请求时,必须要满足的一些预设条件.一个好的例子就是 If-None-Match 头,经常用在 ...

  7. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

    实验十四  Swing图形界面组件 理论部分: 不使用布局管理器 有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上.下面是将一 个组件定位到某个绝对定位的步骤: 1)将布局管理器 ...

  8. vue调用 Highcharts 实现多个数据可视化展示

    一创建一个 options.js 代码为: export const option1 = { bar: { title: { text: '珠海猪场' // 指定图表标题 }, credits: { ...

  9. App间相互跳转及图片分享

    A-app: Info--URL Types--URL Schemes:A-app(一个标识,允许别的app调用本App) info.plist 添加白名单: LSApplicationQueries ...

  10. (BUG记录)记一次与其他系统交互协作时造成的锁表问题

    最近两日做公司电信某计费项目时,接收一个银行对账的任务,在完成对账后.电信和银行两方金额一致时需要进行充值.冲正操作保持金额一致.冲正服务是JAVA统一调用Tuxedo服务,这个服务已经是一个稳定可用 ...