.netcore使用SocketAsyncEventArgs Pool需要注意!
在.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需要注意!的更多相关文章
- 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 协议报文 一 ...
- SocketAsyncEventArgs使用解说
原文:SocketAsyncEventArgs使用解说 如果在.NET下写过网络通讯的同学应该感觉不陌生了,有很多刚入门的同学很多都认为这东西可以大大提高处理效能还有就是使用上很不适应.其实使用之前最 ...
- 物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线
正所谓天下大势,不跟风不行.你不跨平台,很low嘛.java说:你们能跨嘛,跨给我看看.C#说:不要强人所难嘛.java说:能部署在云上吗?docker?微服务?C#说:不要强人所难嘛.java说:你 ...
- .NETCore 新型 ORM 功能介绍
简介 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+. 定义 IFre ...
- 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)
汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...
- (转)C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信
原文地址:http://freshflower.iteye.com/blog/2285272.http://freshflower.iteye.com/blog/2285286 一)服务器端 说到So ...
- 使用.NetCore在Linux上写TCP listen 重启后无法绑定地址
拥抱.net core的过程中, 将公司的一套java项目改成了.net core 2.0版的. 里面的tcp服务被我用msdn的SocketAsyncEventArgs方式重写了, 然而在测试的过程 ...
- 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
原创性申明 本文作者:小竹zz 博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...
- 数据库表结构文档查看器 基于netcore
前言 日常开发业务代码,新接手一块不熟悉的业务时需要频繁的查看对应业务的数据库表设计文档.相比于直接翻看业务代码,有必要提供一个数据库表结构文档查看器来解决这些繁琐的问题. CML.SqlDoc CM ...
随机推荐
- MongoDB的ORM框架——Morphia
1.引入pom <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morp ...
- 多版本python安装TensorFlow出现的各种事故
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数 ...
- SOAPA来临,SIEM时代终结?
安全信息和事件管理(SIEM)产品及服务负责从大量企业安全控件.主机操作系统.企业应用和企业使用的其他软件中收集安全日志数据,并进行分析和报告.有些SIEM还可以试图阻止它们检测到正在进行的攻击,这可 ...
- 谈谈代码中的this
js中我们常常会遇到this,this的具体指向问题对于很多同学来说是很懵懂的:就想lz刚开始接触时候就是一脸的懵逼,经常被一些题目转的眼花缭乱.那么今天lz就跟大家一起交流一下这个this的指向问题 ...
- Android应用程序如何使用Internet资源?
思路:连接Internet资源-->分析XML资源-->使用Download Manager下载文件 Android的Internet连接模型和用于分析Internet数据源的Java技术 ...
- 用generator改写ajax
function request(url) { // this is where we're hiding the asynchronicity, // away from the main code ...
- Redis sentinel 哨兵模式
一.sentinel介绍 Sentinel作用: 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Maste ...
- 用简单的代码让一组静态图片变成gif动画
比如这组图片: 变成这样的gif动画: 是不是很神奇.... 先看html .样式.很简单,一个div,然后引入图片. <!DOCTYPE html> <html ...
- 获取安卓应用APK包名的方法
应用商店按照符合Android标准的原则进行设计,使用包名(Package Name)作为应用的唯一标识.即:包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名.包名主要用于系统识别应用 ...
- 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...