用 Systemtap 统计 TCP 连接
转自: 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 连接的更多相关文章
- linux 统计TCP 连接各状态总数
netstat -n|awk '/^tcp/ {++s[$NF]} END {for(k in s) print k, s[k]}' 以前经常只是从笔记中复制下, 这次打算 研究下 awk 语法 . ...
- 经典!服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决
开源Linux 专注分享开源技术知识 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路,非常典型,大家可以好好看看,以后遇到这个问题就不会束手无策了. 问题描述 模拟高并发的 ...
- netstat -s TCP连接失败 相关统计 解释
针对问题:TCP连接失败 分析:netstat -s输出中和连接失败相关的参数 202270382 invalid SYN cookies received --- 三次握手ack包,syncooki ...
- 查看 Apache并发请求数及其TCP连接状态
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...
- 查看 并发请求数及其TCP连接状态【转】
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- TCP连接状态详解及TIME_WAIT过多的解决方法
上图对排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻地认识,不能只停留在一知半解之中.下面对这张图的11种状态详细解释一下 ...
- 查看 并发请求数及其TCP连接状态
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 Apache并发请求数及其TCP连接状态【转】
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...
- TCP连接的TIME_WAIT和CLOSE_WAIT 状态解说【转】
相信很多运维工程师遇到过这样一个情形: 用户反馈网站访问巨慢, 网络延迟等问题, 然后就迫切地登录服务器,终端输入命令"netstat -anp | grep TIME_WAIT | wc ...
随机推荐
- document.body.className = document.body.className.replace("siteorigin-panels-before-js","");
document.body.className = document.body.className.replace("siteorigin-panels-before-js",&q ...
- searchView 颜色 icon 设置
public void initSearchViewActions() { searchView.setMaxWidth(Integer.MAX_VALUE); searchView.onAction ...
- 红米note手机连接mac系统
到http://www.android.com/filetransfer/ 下androidfiletransfer.dmg文件,安装好这个软件,然后再连接usb就可以用这个软件管理手机内存卡和s ...
- MySQL 基础 —— 数据类型、各种变量
1. 基本数据类型 char:prod_id char(10),括号内的内容表示字符的长度 decimal:十进制,不带参数为整数(四舍五入) text:文本类型,长度不限 2. 日期和时间处理函数 ...
- Java 工程与 Eclipse 高级用法
0. 显示各种视图(perspective)及工具窗口 [Window]⇒ [Perspective]⇒ [Open perspective]⇒ other(如下图所示): [Window]⇒ [Sh ...
- python re正则表达式模块
模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等 复习一下基本的正则表达式吧 .:匹配除了换行符以为的任意单个字符 *:匹配任意字符,一个,零个,多个都能匹配得到 俗称贪婪模式 +:匹配 ...
- Java:EL表达式
ylbtech-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...
- 框架-Java:Spring Boot
ylbtech-框架-Java:Spring Boot 1.返回顶部 1. Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该 ...
- css实现左边div固定宽度,右边div自适应撑满剩下的宽度
(1)使用float <div class="use-float"> <div></div> <div></div> & ...
- [Shell学习笔记] read命令从键盘或文件中获取标准输入(转载)
转自:http://www.1987.name/151.html read命令是用于从终端或者文件中读取输入的内部命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如果没有 ...