Skip to content
Kernel module for tcp state statistics
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore
Makefile
README.md
tcpstat.c

README.md

tcpstat

tcpstat是一个内核模块,用于统计系统TCP状态。 模块通过proc伪文件系统,提供一个节点/proc/tcpstat,内容为系统当前所有TCP连接的状态统计。 例子如下:

ESTABLISHED : 5
SYN_SENT    : 0
SYN_RECV    : 0
FIN_WAIT1   : 0
FIN_WAIT2   : 0
TIME_WAIT   : 1
CLOSE       : 0
CLOSE_WAIT  : 0
LAST_ACK    : 0
LISTEN      : 14
CLOSING     : 0

用法

  1. 需要先编译;
$ cd tcpstat
$ make
  1. 挂载到内核;
$ sudo insmod tcpstat.ko
  1. 用起来!
$ cat /proc/tcpstat
ESTABLISHED : 5
SYN_SENT    : 0
SYN_RECV    : 0
FIN_WAIT1   : 0
FIN_WAIT2   : 0
TIME_WAIT   : 1
CLOSE       : 0
CLOSE_WAIT  : 0
LAST_ACK    : 0
LISTEN      : 14
CLOSING     : 0

异议

有人会问,统计TCP状态,遍历/proc/net/tcp/proc/net/tcp6不行吗?搞那么复杂?

是的,一般情况下遍历上述两个文件,也是可以得到统计结果的。 然而,在连接数达到百万级的系统上,会发生什么事情呢——光读出这两个文件的内容就好几十秒甚至上百秒! 更别说,做文本处理以及统计了!/proc/net/tcp的实现方式注定了效率很低很低。

tcpstat就不同了,直接在内核空间遍历TCP连接(哈希表)进行统计,避免了大量文本生成和数据拷贝。 因此,很快很快~

兼容性

本模块为内核3.16.0设计,并没有考虑其他版本内核的差异性。 由于内核用于维护TCP连接的哈希表实现时有调整,需要在其他版本内核应用,请先验证兼容性。 如需移植,请参考内核源码做对应调整,修改幅度应该不大。

需要移植的童鞋请关注内核这几个地方的变化:include/net/tcp.hinclude/net/inet_hashtables.hinclude/linux/list.hnet/ipv4/tcp_ipv4.c

You can’t perform that action at this time.