前景提要:此问题不定适用Browser通信方式,主要提供给通信发生异常时解决思路。

Q: request请求创建过程发生延迟

【Scene】:

​ .Net的HttpWebRquest.GetRequestStreamAsync()执行前后偶发延迟(时间尝试2分钟左右),客户端也未捕获通信异常。

【Env】:

​ Platform: .Net

​ Http Version: v1.1

【Analyze】:

1)抓包:

​ Description:通过抓包可以看到一次完整的通信过程:

​ 1)建立三次握手

​ 2)POST通信发送信息

​ 3)响应HTTP 200,获取响应信息

​ 4)四次挥手,关闭连接。

​ 可以看到在第四部客户端和服务端都进行尝试关闭连接的过程中发生了异常,服务端返回的500错误,第二条通信建立第三次握手则就出现了延迟。

A:这是个综合性问题,根本的解决问题,需要客户端和服务端都进行优化和修改。

【Conclusion】:

​ 初步分析,大概由于以下几方面问题影响:

  1. 客户端使用的是http1.1存在队头阻塞问题,则会出现下个请求等待上一个异常通信连接关闭后才能正常运行,连接关闭的需要等待的时为2MSL。

  2. 服务端由于未对异常通信进行及时关闭和销毁,保持了大量的TIME_WAIT和CLOSE_WATI状态,则导致越繁的出现通信异常。

【Solution】:

客户端:

​ 1)取消使用using(request.GetRequestStreamAsync()),使用

try{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.GetRequestStreamAsync();
request.dispose();
}catch(ex){
//再次对request队形进行终止,预测会关闭异常的连接。
//此种方式因未有环境实际测试,实在抱歉,望有尝试此方案的人给予答复是否可行
request.abort();
request=null;
}

​ 因为using(request.GetRequestStreamAsync())方式等效try{}catch(error){}finally{request.dispose()},若request.disponse()发生异常则无法捕捉错误,这也就是抓包中看到的四次挥手发生异常但未有异常日志记录的原因。

其他提供性能方案:

​ a. 使用HttpClient 和指定HTTP 2.0,因为HTTP 2.0可以多路复用可以减少此种方式

​ b. 设置ServicePointManager.DefaultConnectionLimit = 1024; //此数据并不是最优数值,可根据各自环境进行设置。

​ c. 关闭proxy代理:https://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html,可优化首次简历request连接的时间。

服务端:

​ 1)处理TIME_WAIT和CLOSE_WAIT状态:参见:https://www.cnblogs.com/felixzh/p/8351366.html

​ 2)若服务端接收到异常通信时,则需要发送connection:close;来进行主动关闭异常连接

​ 3)设置服务端MSL时间

HttpWebRquest.GetRequestStreamAsync()发生延迟的更多相关文章

  1. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  2. corefx 源码追踪:找到引起 SqlDataReader.ReadAsync 执行延迟的那行代码

    最近遇到一个非常诡异的问题,在一个 ASP.NET Core 2.2 项目中,从 SQL Server 数据库查询 100 条数据记录,会出现 16-22s 左右的延迟.延迟出现在执行 SqlData ...

  3. Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践

    一.说明 本文中的代码类,在生产中使用了很长的时间,曾应用于多个企业多个项目实践中,其中也踩了不少坑,总结了一些适用的业务情景, 重要的事情说三遍: a.本代码类不是万能药,不要在业务情景中滥用! b ...

  4. Quartz任务调度基本使用

    转自:http://www.cnblogs.com/bingoidea/archive/2009/08/05/1539656.html 上一篇:定时器的实现.Java定时器Timer和Quartz介绍 ...

  5. LoadRunner测试结果分析03 转载至zhangzhe的新浪博客

    LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...

  6. MySQL 5.7系列之sys schema(2)

    0.导读 MySQL 5.7引入了sys schema,有了它,我们排查分析一些问题时将更得心应手.sys schema里主要存储的是视图.存储过程.函数等. 视图:用于结果的汇总展示及配置持久化: ...

  7. 解决服务器Active Directory环境里Windows登录性能问题办法

    Windows登录性能因素 当查找登录性能问题的原因时,考虑大量因素很重要.一些因素包括: 域控制器太接近用户 网络连接与可用的带宽 数据中心上的硬件资源(x64 vs.x86.内存等) 应用于用户和 ...

  8. Replication的犄角旮旯(四)--关于事务复制的监控

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  9. What every programmer should know about memory 笔记

    What every programmer should know about memory, Part 1(笔记) 每个程序员都应该了解的内存知识[第一部分] 2.商用硬件现状      现在硬件的 ...

随机推荐

  1. 如何给div、p添加onload事件?

    前提 其实只有 <body>.<frame>.<iframe>.<img>.<link>.<script>.<style& ...

  2. android6.0系统Healthd深入分析

    概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatteryService用以计算电池电量相关状态信 ...

  3. Matplotlib的使用

    目录 1.pyplot基础语法 2.散点图与折线图 3.3D图与等高线图 1.pyplot基础语法 (1)创建画布 figure()创建一个空白画布,可以指定画布的大小figsize和设置分辨率dpi ...

  4. java之java.io.File的相关方法

    java.io.File的使用. IO原理及流的分类. 文件流:FileInputStream.FileOutputStream.FileReader.FileWriter 缓存流:BufferedI ...

  5. Linux之shell详解

    Shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  6. Java之封装与访问权限控制(一)

    目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...

  7. redis的介绍与操作及Django中使用redis缓存

    redis VS mysql的区别 """ redis: 内存数据库(读写快).非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化).关系型(操作数据间关系) ...

  8. WPF炫酷UI及动画

    偶然看见了一张图,感觉挺好看的,花了点时间将他转化成了我代码仓库的一部分.虽然不难但也费时间.其中除了背景是百度的一张底图,其他所有内容均通过WPF的Path.Line.TextBlock.Borde ...

  9. logback日志文件位置动态指定

    logback日志文件位置动态指定 参考:https://stackoverflow.com/questions/19518843/logback-configuration-via-jvm-argu ...

  10. Spring 框架下的 JDBC

    Spring JDBC Spring 对JDBC技术规范做了进一步封装,它又叫Spring JDBCTemplate(jdbc模板技术) 纯JDBC:代码清晰的.效率最高.代码是最烦的.    Spr ...