Skip to content

Latest commit

 

History

History
70 lines (54 loc) · 1.81 KB

README.md

File metadata and controls

70 lines (54 loc) · 1.81 KB

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