问题:

使用了brpc的长连接,但是为何耗时和短链接一样呢?


  brpc文档里介绍,使用http协议,则默认使用pooled,只要连接数不超过max_connection_pool_size,则都可以使用长连接。

  但是在实际使用中,发现整个请求耗时很长,使用curl结果如下:

curl -s -w %{time_namelookup}"\r\n"%{time_connect}"\r\n"%{time_pretransfer}"\r\n"%{time_starttransfer}"\r\n"%{time_total}"\r\n" -d "" http://xxx.com/abc/123
time_namelookup : 0.000    
time_connect : 0.033   TCP建立连接耗时.
time_pretransfer : 0.033  TCP连接建立完成后,客户端开始传递第一个字节的时间
time_starttransfer : 0.070  服务端响应开始传输第一个字节的时间 (虽然很多资料上说是服务端响应第一个字节的时间,但是根据我多次试验数据我更认为是:客户端收到服务端响应的第一个字节的时间)
time_total : 0.070  整个请求到响应完成的耗时

由此看出:

TCP建立连接,三次握手,耗时1.5RTT,耗时33ms;

数据传输:70-33=37ms,也就是客户端把数据传给服务端(0.5RTT) + 服务端处理(对方说5ms) +服务端把数据传回客户端(0.5RTT) = 37ms;也就是说1RTT = 32ms.

  误区:

  开始一直认为服务端内部有32ms(37-5)不知道哪去了,但是没想到的是我竟然把数据传输的1RTT给忽略了。

因为建立连接需要33ms,传输数据也需要32ms,服务端数据处理需要5ms,如果每次请求建立成功了长连接,则就可以省去TCP建联的33ms,也就是整个请求是37ms,符合预期。

结论:

从线上统计请求好时看,平均耗时70ms,所以可以确定长连接没建立成功。

解决:

既然brpc介绍用pooled连接池是长连接,那会不会是连接超过max_connection_pool_size了,所以很多都是短连接? 于是调得更长,也不行。

netstat -ant|awk '{print $NF}'|sort|uniq -c 分析:

61 CLOSE_WAIT
      1 established)
   2212 ESTABLISHED
      1 FIN_WAIT2
     19 LISTEN
      1 State
    2016 TIME_WAIT

TIME_WAIT有2016个,说明有很多连接主动关闭,也就意味着请求是短链接,频繁连接关闭,那么可以确定,尽管使用了pooled,依然是端连接。

继续分析:发现有个defer_close_second参数,表示连接是立即关闭还是延迟多少秒后关闭。将该参数值从0改为120后,请求耗时从70ms降低到35ms了。

也是奇怪,既然pooled用长连接了,为何还要用defer_close_second来把问题复杂化?

brpc长连接问题的更多相关文章

  1. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  2. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  3. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

  4. Erlang C1500K长连接推送服务-内存

    上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用. 大概分析一下: 1. Erlang 节点 12GB,内部因为有内 ...

  5. Erlang C1500K长连接推送服务-性能

    Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界.毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响 ...

  6. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  7. 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...

  8. LinkedIn的即时消息:在一台机器上支持几十万条长连接

    最近我们介绍了LinkedIn的即时通信,最后提到了分型指标和读回复.为了实现这些功能,我们需要有办法通过长连接来把数据从服务器端推送到手机或网页客户端,而不是许多当代应用所采取的标准的请求-响应模式 ...

  9. (转)HTTP 长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

随机推荐

  1. java基础篇 之 super关键字的理解

    ​ 之前一直认为,super指向的是父类对象.到今天,仔细查询了资料,自己做了实验,确认这个结论是不对的.我们分一下几个点讨论下: super的作用: 第一种:用来访问父类被隐藏的成员变量 第二种:用 ...

  2. search(12)- elastic4s-聚合=桶+度量

    这篇我们介绍一下ES的聚合功能(aggregation).聚合是把索引数据可视化处理成可读有用数据的主要工具.聚合由bucket桶和metrics度量两部分组成. 所谓bucket就是SQL的GROU ...

  3. C++内存管理学习笔记(2)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. python --函数学习之全局变量和局部变量

    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序内访问. 在调用函数的时候,所有在函数内声明的变量名称都被加到作用 ...

  5. Git与GitHub常用操作

    --------------------------基本操作--------------------------clone 拷贝远程仓库commit 本地提交push 远程提交pull 更新本地--- ...

  6. java - >IO流_缓冲流(高效流)

    缓冲流(高效流) 在我们学习字节流与字符流的时候,大家都进行过读取文件中数据的操作,读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办? Java中提高了一套缓冲 ...

  7. 2.C#Panel扩展控件

    1.解决方案下添加新建项目新建类库 2. 在项目下添加新建项选择新建组件类 3.先引用,然后导入两个命名空间 4.因为是扩展控件,把继承自Component改成继承自Panel using Syste ...

  8. Jmeter简单性能测试练习

    项目描述: 被测网站:xqtesting.blog.51cto.com 指标:响应时间以及错误率 场景:线程数20   测试步骤: 测试计划 线程组 http请求 监听器 运行脚本 查看报告 1.添加 ...

  9. Shell脚本关于循环的一些总结

    不管是哪一门计算机语言,循环都是不可绕开的一个话题,Shell 当然也不是例外.下面总结一些 Shell 脚本里常用的循环相关的知识点,新手朋友可以参考. for 循环 Shell 脚本里最简单的循环 ...

  10. Docker 部署Spring Boot 项目并连接mysql、redis容器(记录过程)

    Spring Boot 项目配置 将写好的Spring Boot 项目通过maven 进行package打包获得可执行Jar 再src/main/docker(放哪都行)下编写创建Dockerfile ...