欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux下使用socktop来检测socket的通讯状况

程序员文章站 2022-11-06 15:47:11
这篇文章主要介绍了Linux下使用socktop来检测socket的通讯状况的方法,socktop为systemtap中所集成的工具,需要的朋友可以参考下... 15-10-21...

所有的socket通讯都是通过socket接口来的,任何family的通讯包括unix域套接都要走的,所以只要截获了socket 读写的几个syscall 就可以了解unix域套接字的发送和接受情况。
 
systemtap发行版本提供了个工具socktop, 位于 /usr/share/doc/systemtap/examples/network/socktop, 是个非常方便的工具, 干这个事情最合适了。

安装


为了部署 systemtap,需要安装以下两个 rpm 包:

复制代码
代码如下:

systemtap
systemtap-runtime

以 root 权限,运行以下命令安装:

复制代码
代码如下:

yum install systemtap systemtap-runtime

注:在使用 systemtap 前,需要安装内核信息包,可以运行以下命令安装:

复制代码
代码如下:

stap-prep

如果安装失败,请手动安装,手动安装步骤请见手动安装内核信息包。

注:我在我的主机上运行 stap-prep 的报错信息如下

复制代码
代码如下:

[root@test ~]# stap-prep

need to install the following packages:
kernel-devel-2.6.18-308.el5.x86_64
kernel-debuginfo-2.6.18-308.el5.x86_64
traceback (most recent call last):
  file "/usr/bin/yumdownloader", line 19, in <module>
    import yum
importerror: no module named yum
problem downloading rpm(s) kernel-devel-2.6.18-308.el5.x86_64 kernel-debuginfo-2.6.18-308.el5.x86_64
手动安装必需的内核信息包

需要的内核信息包包含你内核中匹配以下字段 -devel, -debuginfo, 和 -debuginfo-common 的包。如下:

复制代码
代码如下:

kernel-debuginfo
kernel-debuginfo-common
kernel-devel

需要安装和你内核对应版本的包,运行命令

复制代码
代码如下:

uname -r
2.6.18-308.el5

可以指定你的内核是 2.6.18-308.el5,因此你需要的包如下:

复制代码
代码如下:

kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
kernel-devel-2.6.18-308.el5.x86_64.rpm
kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm

重要!!!!注意:这三个包必须与你的内核版本匹配,不能你懂的。
下载这三个 rpm 包,到 http://rpm.pbone.net 这个网站去下载。或者最简单的在 google 搜索包名。

下载 kernel-debuginfo-2.6.18-308.el5.x86_64.rpm:

wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5client/en/os/x86_64/debuginfo/kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
下载 kernel-devel-2.6.18-308.el5.x86_64.rpm:

wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5client/en/os/x86_64/debuginfo/kernel-devel-2.6.18-308.el5.x86_64.rpm
下载 kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm:

wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5client/en/os/x86_64/debuginfo/kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm
分别安装这三个包:

复制代码
代码如下:

rpm -ivh kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm
rpm -ivh kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
rmp -ivh kernel-devel-2.6.18-308.el5.x86_64.rpm

初始化测试

为了测试 stap 是否安装正确,需要运行以下命令测试:

复制代码
代码如下:

stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

socket读写查看器socktop

socktop源码里面的版权和简单的功能介绍:

使用帮助

复制代码
代码如下:

$ /usr/share/doc/systemtap/examples/network/socktop -h

usage: socktop [-d] [-i interval] [-n num] [-p protocol]... [-f family]...

 [-t stype]... [-n pname]... [-p pid]... [-u username]... [-h]

  -d           # print network device traffic (default: off)

 -i interval  # interval in seconds between printing (default: 5)

 -n num       # number of top processes and devices to print (default: 10)

 -f family    # this protocol family only (default: all)

-p protocol  # this protocol only (default: all)

-t stype     # this socket type only (default: all)

-n pname     # this process name only (default: all)

-p pid       # this process id only (default: all)

-u username  # this user only (default: all)

-c count     # number of iteration

-m mod_name  # generate instrumentation (but do not run)

 -h           # print this help text

protocol families:

    local, inet, inet6, ipx, netlink, x25, ax25, atmpvc, appletalk, packet

protocols:

    tcp, udp, sctp, ip, fc, ... (see /etc/protocols for complete list)

socket types:

    stream, dgram, raw, rdm, seqpacket, dccp, packet

 
上面的使用写的很明白了,我们要过滤的是unix套接字, 每5秒报告下情况, 还顺手把网络设备的流量打出来。
 
复制代码
代码如下:

$sudo /usr/share/doc/systemtap/examples/network/socktop -f local -i 5 -d


======================= thu mar 31 21:23:03 2011 ========================

------------------------------- processes -------------------------------

pid   uid     #send   #recv send_kb recv_kb prot family   command      


24821 50453       1       0       0       0 ip   local    crond        

3840  0           0       2       0       0 ip   local    syslog-ng    


-------------------------------- devices --------------------------------

dev             #xmit         #recv         xmit_kb         recv_kb

eth0              457           250             102              38

bond0             457             0             102               0

lo                 24            24               2               2

eth1                0            10               0               0

=========================================================================

 
我们很清楚的看到了,crond在发,syslog-ng在收。
 
如果你想知道报文的内容的话,可以改改脚本把报文也dump出来。
 
玩得开心!