.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 ...
随机推荐
- Pytorch: cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorMa
更换了数据集, 在计算交叉熵损失时出现错误 : cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/ ...
- 字节跳动19春招研发第一次在线笔试-A卷
结果:凉. 说明 此博客仅为笔试记录所用,如涉及版权或保密问题,请联系我及时删除. 联系方式:georgehu716@qq.com 1. 找零 时间限制:C/C++ 1秒,其他语言 2秒 空间限制:C ...
- python爬取珞珈1号卫星数据
首先登录珞珈一号数据系统查询想要的数据 利用浏览器审查元素获取包含下载信息的源码 将最右侧的table相关的网页源码copy到剪切板备用 利用python下载数据 ## utf-8 import re ...
- Catalan 数列的性质及其应用(转载)
转自:http://lanqi.org/skills/10939/ 卡特兰数 — 计数的映射方法的伟大胜利 发表于2015年11月8日由意琦行 卡特兰(Catalan)数来源于卡特兰解决凸$n+2$边 ...
- tf.contrib.slim add_arg_scope
上一篇文章中我们介绍了arg_scope函数,它在每一层嵌套中update当前字典中参数形成新的字典,并入栈.那么这些参数是怎么作用到代码块中的函数的呢?比如说如下情况: with slim.arg_ ...
- Springboot中关于跨域问题的一种解决方法
前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...
- Flutter
2015年, Google 内部开始测试另一种高性能的编程方式,那就 Google 的 Sky 项目.Sky 项目使用网页开发语言Dart开发原生Android 应用,强调应用的运行速度和与 Web ...
- SSIS - 10.执行过程任务
一.创建批处理文件 在SSIS包中,执行过程任务可以用来运行应用程序或批处理文件.它执行时用到的输入.输出和参数可以在任务编辑器中进行设置. 在使用执行过程任务之前,我们需要先创建一个批处理文件,实现 ...
- gc笔记(转)
GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...
- Devexpress Ribbon 动态生成菜单
/// <summary> /// 动态加载菜单 /// </summary> private void GetMenuBind() { //根据登录用户角色菜单动态创建 // ...