转自: https://mp.weixin.qq.com/s?__biz=MzIxMjAzMDA1MQ==&mid=2648946009&idx=1&sn=3a0be2fe4f098de819f7dc05b79c593f&chksm=8f5b5255b82cdb43fa8714aed8c351306596492396467bf85d8e14ee476e944e5e58bb0ba724#rd

问题

做压力测试的时候希望可以在服务器上采样,能获得当前服务器的TCP连接数、连接耗费时间的最大值、最小值、均值。

传统解决思路

TCP连接采样最直接的方式是通过netstat统计ESTABLISHED状态的TCP连接数。一般压力测试工具会提供一份报告说明发送请求的最大值、最小值、均值。

  • netstat原理是读取/proc/net/tcp给出当前服务器的TCP状态,当“列表”很长的时候它就要花费更多时间完成解析。采样到的数据不及时,而且nestat会消耗非常大的CPU,影响测试结果;

  • 压力测试工具报告的请求耗费时间的最大值、最小值、均值包含了网络延时。压力测试工具会同时开启N个并发访问服务器,对于网络来说是有大量的数据包同时产生,很可能受限于测试机或者服务器的带宽,根本没有送到服务器或者是测试机来不及处理产生了延时;

另辟蹊径

最好的办法是通过内核Hook拦截某些关键的TCP函数,比如能找到类似tcp_connect、tcp_close的函数。遗憾的是TCP建立连接比较容易找到(无非是accept、tcp_v4_connect之类的),但是关闭部分却没有相应的函数。这个问题折腾了我不少时间,最后我借鉴了nestat的思路——通过TCP的状态判断。

至于Hook内核基本上没什么难度,祭出大杀器Systemtap就行了。

Systemtap是世界上最牛B的Linux内核调试工具(没有之一),如果你之前听说过DTrace那么可以把它理解为DTrace for Linux。使用它通过简单的几行代码我们就可以Hook到内核中的任何函数,不但可以“截获”参数甚至可以修改参数

我定义了一个全局数组connection,当TCP状态是ESTABLISHED时我会把时间戳放到以客户端IP地址+端口为Key的关联数组中,当TCP状态是CLOSE、CLOSE_WAIT时根据IP地址和端口取出时间戳,计算出耗费的毫秒数放入累加变量spend_time中。为了统计当前并发数,程序中每隔1秒钟,修改report关联数组。

最后在程序结束的时候输出所有请求耗费时间的最大值、最小值和均值。

测试结果

通过ab简单的模拟一下效果,设置并发度300,总的请求数量是10000。

结果显示ab记录发送了10000次而实际上服务器多收到146次,这部分请求应该是ab认为失败其实已经成功的。服务器的峰值是179,远远没有达到300的并发度。

附上systemtap脚本地址

https://gist.github.com/fireflyc/cf82f27ebbfe1ff61c4f789b8b1b0d25

后记

这篇文章的目的其实是想让大家学习用systemtap。网上关于它的教程很多,所以再写一篇“教程”也不可能好到哪里去。所以介绍一个之前写过的一个脚本,希望能够抛砖引玉。

欢迎关注公众账号了解更多信息“写程序的康德——思考、批判、理性”

用 Systemtap 统计 TCP 连接的更多相关文章

  1. linux 统计TCP 连接各状态总数

    netstat  -n|awk '/^tcp/ {++s[$NF]} END {for(k in s) print k, s[k]}' 以前经常只是从笔记中复制下, 这次打算 研究下 awk 语法 . ...

  2. 经典!服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决

    开源Linux 专注分享开源技术知识 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路,非常典型,大家可以好好看看,以后遇到这个问题就不会束手无策了. 问题描述 模拟高并发的 ...

  3. netstat -s TCP连接失败 相关统计 解释

    针对问题:TCP连接失败 分析:netstat -s输出中和连接失败相关的参数 202270382 invalid SYN cookies received --- 三次握手ack包,syncooki ...

  4. 查看 Apache并发请求数及其TCP连接状态

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...

  5. 查看 并发请求数及其TCP连接状态【转】

    服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  6. TCP连接状态详解及TIME_WAIT过多的解决方法

    上图对排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻地认识,不能只停留在一知半解之中.下面对这张图的11种状态详细解释一下 ...

  7. 查看 并发请求数及其TCP连接状态

    服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  8. 查看 Apache并发请求数及其TCP连接状态【转】

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...

  9. TCP连接的TIME_WAIT和CLOSE_WAIT 状态解说【转】

    相信很多运维工程师遇到过这样一个情形: 用户反馈网站访问巨慢, 网络延迟等问题, 然后就迫切地登录服务器,终端输入命令"netstat -anp | grep TIME_WAIT | wc ...

随机推荐

  1. grep 并列查询 效率 且 或

    find / | grep -v python | grep -v xl_ | grep -v xiaole |grep redis [root@hadoop3 ~]# find / | grep - ...

  2. NPOI设置Excel中的单元格识别为日期

    只有月/日/年的格式,才能显示为Date 其他的,都是显示为Custom

  3. Spring 框架学习 —— 容器

    容器是 Spring 框架的核心.Spring 容器使用 DI(依赖注入)机制管理构成应用的组件(类),所谓 DI,也即是其能够创建相互协作的组件(类)之间的关联(依赖). 1. 应用上下文(Appl ...

  4. 洛谷 P1573 栈的操作

    题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,-,n.每一个栈只支持一种操作:弹出并压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操 ...

  5. SPOJ BEADS 最小字符串表示

    SPOJ BEADS 给一个字符串(环) 问从哪个字符开始,字典序最小. 可以脑补到很多线性的解法,不过以下这个是最简单的,代码非常简单,就不解释了. #include<iostream> ...

  6. 框架-Java:Spring Boot

    ylbtech-框架-Java:Spring Boot 1.返回顶部 1. Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该 ...

  7. vue 目录结构介绍

    1 初始目录如下: 2 目录结构介绍 bulid:最终帆布的代码存放位置 config:配置目录,包括端口号等 node_modules:npm加载的项目依赖模块 src:z这里是我们要开发的目录,基 ...

  8. 如何给mysql用户分配权限+增、删、改、查mysql用户

    在mysql中用户权限是一个很重析 参数,因为台mysql服务器中会有大量的用户,每个用户的权限需要不一样的,下面我来介绍如何给mysql用户分配权限吧,有需要了解的朋友可参考. 1,Mysql下创建 ...

  9. 25.EXTJS 主页面的jsp

    1. /** * @author sux * @time 2011-1-11 * @desc main page */ var mainPage = Ext.extend(Ext.Viewport,{ ...

  10. 22.Extjs Panel中显示多行工具栏(tbar)

    转自:http://blog.sina.com.cn/s/blog_454fbf740100t0xj.html 在应用程序的制作中,我们经常性的会用到工具栏,在Extjs中Panel中提供了tbar和 ...