在.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. Java 多文件压缩成一个文件工具类

    简单修改来自博客园勇闯天涯zfc的博客 一.内容 ①使用 Java 将多个文件打包压缩成一个压缩文件: ②主要使用 java.io 下的类 二.源代码:ZIPUtil .java import jav ...

  2. linux 安装mysql5.7版本

    首先准备好mysql5.7.17的安装包,安装包放在  /data/software 目录下 进入到 /usr/local 目录下,解压mysql安装包 命令:   cd /usr/local tar ...

  3. python3 实现对代码文件中注释的翻译

    心血来潮,昨天看见群里讨论一段图片转pdf的代码,直接拿过来发现不能用,原来是因为代码中传的文件对象不对,源码中说传递的是一个文件路径或一个文件对象.他传的是一个文件名,很是尴尬. 想了想,主要原因还 ...

  4. 03SQLALchemy外键约束

    一,配置 1,SQLALchemy的配置单独使用config.py文件2,满足如下要求: #dialect+driver://username:password@host:port/database ...

  5. go语言数据库操作, gorm框架

    type User struct{ ID uint `gorm:"primary_key"` Name string Age int Birthday time.Time AddT ...

  6. modbus tcp数据报文结构

    modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...

  7. 无法在Application Designer中打开PeopleTools对象

    PeopleSoft开发人员经常使用PeopleSoft Application Designer来查看/修改PeopleTools对象,例如字段,记录,页面,组件等.开发人员对Application ...

  8. softmax in pytorch

    背景 在分类中,最常见的设置是一个输入,输出是类数目大小的向量.预测的输入类将是在最后一个网络层中具有最大条目的相应类.在分类任务中,交叉熵损失(交叉熵)是训练这类网络最常见的损失函数.交叉熵损失可以 ...

  9. [zt]C++二维数组讲解、二维数组的声明和初始化

    定义: int *pia = new int[10]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向 ...

  10. sublime设置sublimeREPL-python-run current file 快捷键

    弄了3个小时的快捷键,一直不能成功使用,百度上一堆一样的方法,最后FQ才找到能用的方法,真是服了. 方法: ①首选项->快捷键设置 填写如下内容: [ {"keys": [& ...