在.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. SpringCloud使用Prometheus监控(基于Eureka)

    本文介绍SpringCloud使用Prometheus,基于Eureka服务发现. 1.Prometheus介绍 在之前写过两篇有关Prometheus使用的文章,如下: <SpringBoot ...

  2. Linux 查询服务数据

    1.  htop 可以时时查看 2. free -m 查看缓存

  3. css3_transition: 体验好的过渡效果。附 好看的按钮

    利用css的transition属性详解,上图就是利用transition效果做的一个按钮. transition属性://举例子:transition:all 1s ease;transition: ...

  4. prometheus — nginx-vts-exporter

    参考文档: https://blog.51cto.com/xujpxm/2080146 注: 本文留用自己参考,建议看以上参考文档,更为细致 prometheus 监控 nginx 使用 nginx- ...

  5. 将DataRow拷贝到另一个DataRow

    DataRow dr = dtPadFluid.Rows[gvPadFluid.FocusedRowHandle]; foreach (DataColumn dc in _dr.Table.Colum ...

  6. sqlmap Windows 安装教程

    第一步:下载 python :https://www.python.org/downloads/    (这里有python各种版本,但是一般建议安装3和2.7) sqlmap:https://git ...

  7. unix的发展

    转载http://blog.51cto.com/1193432/1671058

  8. SSIS - 9.文件系统任务

    文件系统任务是用来操作服务器上的文件和目录的.比如,可以新建任务来创建.复制.删除或移动一个文件或一个目录. 一.操作和属性 一个文件系统可以定义如下10种操作. 所有的操作包含Name, Descr ...

  9. DCOS实践分享(3):基于Mesos 和 Docker 企业级移动应用实践分享

    2016年1月24日 8:00—19:00 北京万豪酒店(东城区建国门南大街7号) @Container大会是由国内容器社区DockOne组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强 ...

  10. #Java学习之路——基础阶段(第九篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...