Github地址:https://github.com/fastos/tcpdive

为什么要开发Tcpdive

在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化。

用户接入网络的方式,除了宽带和光纤之外,还有2G/3G/4G/WiFi,5G也已经在路上了。

作为使用范围最广的传输层协议,TCP诞生于固网时代,在设计之初并没有考虑到上述种种情况,

这导致了它在某些场景下,性能并不是最优的。因此大多数的CDN厂商和一些规模较大的互联网公司都会

进行TCP协议的优化,以提供更好的用户体验,如更快的访问速度,更低的访问失败率,更流畅的视频播放等。

而当我们尝试优化TCP协议时,却面临着不少难点:

  • 可用的工具少。

    和TCP相关的工具,比如tcpdump,netstat和ss,虽然很好用,但是使用场景并不是TCP协议的性能评测,

    能够提供的性能信息实在有限。

  • 依靠个人感觉,进行盲试。

    不知道瓶颈在哪,盲目修改,或者直接套用已有的优化方法。

    盲目修改常导致徒劳无功,直接套用现成的方法,由于大家的应用场景不尽相同,也不一定有效。

  • 测试成本高。

    对TCP协议的性能评测主要采用两种方法。

    一种是通过对上层应用的测试,来评估TCP协议的性能。这种方法的评价指标有限,而且是上层应用相关的。

    另一种是依靠第三方测试服务。这种方式的样本量有限,且成本较高。

  • 无法准确地评价优化效果。

    上述的两种测试方法,都涉及到应用层面,因此测量的不仅仅是TCP协议本身,还参杂了干扰因素。

Tcpdive的设计目标

针对上述问题,我们决定设计一个专门的TCP协议性能评测工具,也就是Tcpdive。

之所以起这个名字,是因为dive有深入研究的意思:)

Tcpdive具有一些特性,实际上也是我们的设计目标:

  • 对TCP协议的性能进行较为全面的刻画,有助于发现瓶颈。

    如此一来,就能找到痛点,不用再盲目地进行优化。

  • 易于部署和使用,无需改动生产环境,使用成本低。

    这一点非常重要,因为不需要修改内核或者应用程序,比较容易推广。

  • 独立于上层应用,能够准确地评价优化效果。

    直接对TCP协议的性能进行刻画,而不依赖于具体的应用。

    因此能够排除上层应用的干扰,量化地评价优化效果。

Tcpdive的基本原理

Tcpdive是基于linux内核的探测点机制,使用systemtap脚本语言和内嵌C代码来实现的。

通过定义几类相互关联的探测点和库函数,来收集和处理运行中内核的数据,以及修改内核的处理逻辑。

为什么要基于systemtap呢?systemtap的神奇之处在于,不修改内核的情况下就能获取内核中的任何信息,

还可以修改内核的处理逻辑。所以虽然被它虐了千百遍,但还是觉得这套探测点机制非常有用。当然它也不是

十全十美的,比如作为一种调试语言,它是够用的,但是把它用作一种开发语言,则会遇到不少问题。通过不

断的尝试,大多数问题最终都获得比较好的解决。

目前Tcpdive已经部署到作为流量入口的负载均衡服务器上,在新浪的线上环境7*24h运行,可以说是比较稳定的。

Tcpdive的主要功能

作为一个TCP协议的性能评测工具,Tcpdive提供了大量的性能指标,从以下维度来对每条TCP连接进行刻画:

  • 传输情况
  • 丢包和重传
  • 拥塞控制
  • HTTP处理

1. 传输情况

使用如下性能指标来描绘一条TCP连接的传输情况,是默认启用的功能。关于每个性能指标的含义可参考Github

2. 丢包和重传

TCP主要使用了两种丢包的检测和重传机制:

  • 快速重传,由重复的ACK触发
  • 超时重传,由定时器触发

当收到一定数量的重复ACK后,TCP会判断有丢包发生了,马上重传丢失的数据包。从发送原始数据包,

到发送重传包,一般在1个RTT以内,所以称为快速重传。如果没有收到足够多的重复ACK,或者快速

重传失败了,就会使用超时重传。在等待RTO时间后,TCP才判断发生了丢包,接着会重传丢失的数据包。

作为快速重传的failover,超时重传会耗费更多的时间。

Tcpdive能够区分快速重传和超时重传,在一条TCP连接的生命周期内,分别统计这两种重传机制的触发次数、

重传的数据包个数、总的等待时间、总的恢复时间、虚假重传的次数。通过这些性能指标,我们能够清楚的描述

丢包和重传对一条TCP连接的影响。这部分功能是可选的,关于每个性能指标的含义可参考Github

3. 拥塞控制

目前Linux内核默认使用的拥塞控制算法为Cubic。

顾名思义,Cubic的拥塞控制窗口的增长曲线是一个条三次曲线,主要由三部分构成:

  • 第一个部是上凸的,拥塞控制窗口快速增长,以接近上次丢包时的大小,称之为查找阶段。
  • 第二部分是平缓的,拥塞控制窗口的增长非常缓慢,基本上保持不变,称之为平稳阶段。
  • 第三部分是下凹的,拥塞控制窗口快速增长,用于探索可用带宽的上限,称之为探索阶段。

Tcpdive通过一些针对Cubic的性能指标,来评测当前TCP协议的拥塞控制性能。这部分功能是可选的,关于每个

性能指标的含义可参考Github

上图中的性能指标,很多都是一条TCP连接生命周期内的平均值。如果我们想更加准确的描绘一条TCP连接的具体波动呢?

这时候另外一种方法就派上用场了,我们称之为Advanced CC。和之前基于连接的性能指标不同,它是基于数据包的,

通过记录5种不同类型的关键点,来描绘一条连接的具体波动。关于关键点的定义可参考Github

(下图是手绘的,Tcpdive目前不支持自动画图… )

4. HTTP处理

HTTP是一个基于请求和响应的协议,通常是客户端先发送一个请求,然后服务器返回一个响应(暂不考虑HTTP/2)。

Tcpdive能够在TCP层面上,对每个HTTP request和response进行监测,因而独立于具体的HTTP应用。

Tcpdive支持Per request级别的刻画,支持HTTP Keep-Alive,这部分功能是可选的。

在服务器端,把每个HTTP请求所花费的时间划分为三部分:等待请求的到来,服务器的处理时间,响应的传输时间。

对于每对HTTP request/response,都提供了如下性能指标:

当进行TCP协议优化时,我们关注的是响应文件的传输时间。值得注意的是,从传统的Web服务器中,是无法获取这

部分时间的,因为应用层只负责把响应数据交给TCP层,至于TCP层什么时候才把数据传完,应用程序并不知情。

至于其它两部分时间,作为干扰因素,是要剔除掉的。通过这一功能,Tcpdive可以准确的评价优化效果,并且做到了

独立于上层的具体应用。

Tcpdive的使用

如果你看到这里,说明对Tcpdive还是比较感兴趣的,赶紧用起来吧:)

关于Tcpdive的使用方法,在Github项目的README中写的比较详细,使用方法也不复杂,这里就不再赘述了。

Tcpdive的性能

关于Tcpdive的性能消耗,我们分别在实验室环境、新浪的线上环境进行了评测,具体可看Github项目的README

TCP协议的性能评测工具 — Tcpdive开源啦的更多相关文章

  1. loadrunner测试TCP协议服务器性能

    loadrunner测试TCP协议服务器性能 . 性能loadrunner测试c 最近对服务器的性能感兴趣,于是开始研究了一阵子loadrunner如何做采用TCP协议交互的服务器的性能测试,对loa ...

  2. C和指针 第十八章 性能评测工具gprof

    linux平台下的gprof评测工具可以对程序进行分析,需要在编译时加上-pg选项,如上一章的二叉树代码: gcc -pg main.c ArrayBinaryTree.h ArrayBinaryTr ...

  3. Linux性能评测工具之一:gprof篇

    这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并把相关的资料作一个汇总,以便以后信手拈来! 1 简介 改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数 ...

  4. Linux性能评测工具之一:gprof篇介绍

    转:http://blog.csdn.net/stanjiang2010/article/details/5655143 这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并 ...

  5. 转:Linux性能评测工具之一:gprof篇

    1 简介 改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数消耗掉了大部分执行时间,这通常都不是非常明显的.GNU 编译器工具包所提供了一种剖析工具 GNU profiler(gpr ...

  6. 转 WEB前端性能分析--工具篇

    在线网站类: WebPageTest 说明: 在线的站点性能评测网站,地址http://www.webpagetest.org/ 补充: 其实这网站也是个开源项目,所以支持自己搭建一个内部的测试站点 ...

  7. TCP 协议快被淘汰了,UDP 协议才是新世代的未来?

    TCP 协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过 TCP 协议传输,然而 TCP 在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折 ...

  8. ethr 微软开源的tcp udp http 网络性能测试工具

    ethr 是微软开源的tcp udp http 网络性能测试工具包包含的server 以及 client 我们可以远程测试 同时对于https icmp 的支持也在开发中,tcp 协议支持连接.带宽. ...

  9. 简述tcp协议对http性能的影响及优化

    当网站服务器并发连接达到一定程度时,你可能需要考虑服务器系统中tcp协议设置对http服务器的影响. tcp相关延时主要包括: 1.tcp连接时建立握手: 2.tcp慢启动拥塞控制: 3.数据聚集的N ...

随机推荐

  1. Leetcode 804. Unique Morse Code Words 莫尔斯电码重复问题

    参考:https://blog.csdn.net/yuweiming70/article/details/79684433 题目描述: International Morse Code defines ...

  2. python 网路爬虫(二) 爬取淘宝里的手机报价并以价格排序

    今天要写的是之前写过的一个程序,然后把它整理下,巩固下知识点,并对之前的代码进行一些改进. 今天要爬取的是淘宝里的关于手机的报价的信息,并按照自己想要价格来筛选. 要是有什么问题希望大佬能指出我的错误 ...

  3. STL rope

    rope的部分简单操作 函数 功能 push_back(x) 在末尾添加x insert(pos,x) 在pos插入x erase(pos,x) 从pos开始删除x个 replace(pos,x) 从 ...

  4. BZOJ4711 小奇挖矿

    Description [题目背景] 小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓 库并把矿石运到各个仓库里. [问题描述] 喵星系有n个星球, ...

  5. LGTB 与序列

    LGTB 有一个长度为N 的序列A,现在他想构造一个新的长度为N 的序列B,使得B 中的任意两个数都 互质. 并且他要使ai与bi对应项之差最小 请输出最小值 输入 第一行包含一个数N 代表序列初始长 ...

  6. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  7. [BZOJ]3671 随机数生成器(Noi2014)

    洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...

  8. 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...

  9. MFC程序设计小结

    由于毕业设计要用到MFC,因此本人这段时间开始学习MFC编程,边学边做,现将一些重要的知识点总结如下: 创建一个MFC程序,操作步骤很简单,要点就是选择MFC AppWizard(exe).单文档或者 ...

  10. 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 这个文档说明了如何在 Mac OS X 上安装 TensorFlow. 注意:从 1.2 版本开始,在 Mac OS X 上 TensorFlow ...