转自: 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. list-style样式不显示问题

    <li> display要使用 list-item ,不要使用block,要不然会造成不显示的问题.

  2. 2016/1/17 笔记 1,面向对象编程OOP 2,类 全

    面向对象编程OOP 编程方式的发展 1,面向过程 重用性低 维护工作量大  2,面向对象 重用性高 维护容易 概念 1,对象 Object 一个具体的事物 是类的实例      2,类Class 同一 ...

  3. SpringMVC上传文件后返回文件服务器地址路径

    先写一个表单: <%@ page language="java" contentType="text/html; charset=UTF-8" pageE ...

  4. ExpandableListView的首次加载全部展开,并且点击Group不收缩、

    最近在做Android市场的应用.看到好多市场类的QQ应用宝做的算是最完美的了.在项目中要实现它的下载管理的实现,而界面如下: 反编译得到使用的是ExpandableListView.而怎么首次加载全 ...

  5. Python机器学习算法 — 决策树(Decision Tree)

    决策树 -- 简介         决策树(decision tree)一般都是自上而下的来生成的.每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵 ...

  6. bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2989  Solved: 1557[Submit][Statu ...

  7. Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接

    一:创建Linux虚拟机步骤: 1. 二:设置虚拟机默认属性 三:虚拟机和Xhell建立连接

  8. JS制作一个创意数字时钟

    通过js代码制作一个创意数字时钟 通过JS代码实现创意数字时钟效果如下:由数字化的卡通形象图片取代常规的数字显示当前实时北京时间.具体效果示例: 核心重点: (1)Date方法的初步了解 (2)构建模 ...

  9. Maven之项目搭建与第一个helloworld(多图)

    这次记录第一个搭建一个maven的helloworld的过程. 转载 1.搭建web工程肯定得new 一个 maven工程,假如project中没有直接看到maven工程,那么选择Other,然后在W ...

  10. [Code+#1]大吉大利,晚上吃鸡!

    输入输出样例 输入样例#1: 7 7 1 7 1 2 2 2 4 2 4 6 2 6 7 2 1 3 2 3 5 4 5 7 2 输出样例#1: 6 输入样例#2: 5 5 1 4 1 2 1 1 3 ...