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

所有的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
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出来。
玩得开心!

时间: 2024-10-25 14:07:14

Linux下使用socktop来检测socket的通讯状况的相关文章

c++-linux下C++无线网卡模式转换socket的问题

问题描述 linux下C++无线网卡模式转换socket的问题 linux下C++编程,由网卡模式转换到AP模式,再由AP模式转换到网卡模式时,链接不上. 发现第二次连接的新建的SOCKET(其中socket数值有和第一次的相同的) 只能bind()不能connect().请问大神可能是什么问题? 解决方案 你是客户端为何要bind() 要是你是服务端,又为何用connect()呢?

linux下U盘状态检测

Linux的文件系统是异步的,也就是说写一个文件不是立刻保存到介质(硬盘,U盘等)中,而是存到缓冲区内,等积累到一定程度再一起保存到介质中.如果没有umount就非法拔出U盘,程序是不知道的,fopen,fwrite等函数都依然返回正确,知道操作系统要把写介质的时候,才会提示I/O错误.可是很多数据都会因为这个不及时的错误报告而丢失.    事实上,USB驱动程序在U盘插入和拔出时,都对系统配置文件做了修改.    例如U盘驱动程序会在插入或拔出时往 /proc/scsi/usb-storage

linux下使用speedtest-cli工具检测VPS服务器网络下载速率

一般我们购买到VPS主机之后肯定也需要做一点简单的测试性能,比如检查基本配置是不是我们购买时候商家标注的配置,以及网络节点的Ping速度,以及网络节点的下载文件速度,这些参数的体验在一定程度上也是决定着当前购买VPS服务器的稳定性和性价比. 在这篇文章中老左记录speedtest-cli工具脚本的用法,可以用来检测服务器直接下载节点文件的速度.speedtest-cli,采用python编写命令脚本,通过调用已设置的上下行节点接口来完成速度测试.这里我们一起看看如何使用的. 第一.speedte

socket在windows下和linux下的区别

原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h  2)初始化 windows下需要用WSAStartup WSADATA wsaData;         err = WSAStartup(0x202,&wsaData); if ( err != 0 ) { return 0; } else if ( LOBYTE( wsaData.wVersio

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

php在linux下检测mysql同步状态的方法

 这篇文章主要介绍了php在linux下检测mysql同步状态的方法,是Linux下使用php检测mysql同步状态的实用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php在linux下检测mysql同步状态的方法.分享给大家供大家参考.具体分析如下: 这里通过两个实例来介绍mysql同步状态检测实现方法.代码如下: 代码如下: #!/bin/sh #check MySQL_Slave Status #crontab time 00:10 MYSQL_USER="ro

如何在linux下检测内存泄漏

1.开发背景 在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程中在堆上分配而没有释放的内存信息,其中包括代码文件名.行号以及内存大小.该功能是 MFC Framework 提供的内置机制,封装在其类结构体系内部. 在 linux 或者 unix 下,我们的 C++ 程序缺乏相应的手段来检测内存信息,而只能使用 top 指令观察进程的动态内存总额.而且程序退出时,我们无法获知任何内存泄漏信息.为了更好的辅助在 linu

Windows下与Linux下编写socket程序的区别

[Windows: 头文件的区别] #include<winsock.h>#include<winsock2.h> [Windows: 初始化的区别] WSADATA wsaData;WSAStartup(0x202,&wsaData); [Windows: 声明Socket]  SOCKET类型 [Windows: Socket关闭] closesocket() [Windows: Socket操作错误返回值]  SOCKET_ERROR [Windows: 设置sock

linux socket传送图片-linux下用socket,client向server传送图片

问题描述 linux下用socket,client向server传送图片 可以实现字符串的传输,在向服务器传输图片存盘时,总是无法显示图片.下面代码是服务器和客户端传送图片的部分.求大神指定! 服务器端: unsigned char recPhotoBuff[100]; unsigned char sendPhotoBuff[100]; char recPhotoPath[50]; char recPhotoName[20]; FILE *recPhotoFp; FILE *sendPhotoF