来源:
ChinaUnix博客 作者:
ChinaUnix博客 发布时间:2008-01-01 20:04:00


这周写了几个监控插件,用于向主监控服务器返回性能数据,在采集客户端数据时,我采用的是直接从/proc文档系统中取得数值,用awk分析后返回,在这个过程中对linux的/proc进行了粗略的学习,分主次罗列一下:
1、linux系统中TCP、UDP连接数的疑惑
首先决定不使用netstat获得数据,因为他实在是太费时了,看看:
[root@localhost tmp]# time netstat -an | wc -l
2100
real 0m2.984s
user 0m0.056s
sys 0m2.928s
[root@localhost tmp]# time ./check_conn.sh
CRITICAL CONN 204 ESTABLISHED 1620 TIME_WAIT 143 SYN_RECV 2212 TOTAL|CONN,204,1620,143,2212;
real 0m0.691s
user 0m0.016s
sys 0m0.700s
也就说说,在机器连接数2000多的时候我自己写的脚本效率是netstat的4倍还多!假如机器的TCP连接数多,那么效果更明显。下面周详说明:
没有疑问的是用netstat得到的连接数是系统权威的连接数,比如: netstat -tl | wc -l,但是这个数字经过在几台服务器上测试和/proc/net/tcp里面的行数并不完全一致,经过N多的搜索,其中还联系了李阳老师等等牛们,都没有得到很满意的解释,今天无意间浏览ipv6 howto文档,瞥见一个词“tunnel”,于是根据这个线索继续学习,才终于得到下面的结论:
系统假如不支持IPV6,那么任何的通讯都使用IPV4来处理,这个时候您使用netstat ifconfig等工具都只会看到四位的IPV4地址格式,当然,系统的总TCP连接数和wc -l /proc/net/tcp也惊人的只相差1(废话,tcp文档第一行不应该记入统计,呵呵)。
系统假如支持IPV6,而且又开启了IPV6模块的话,就比较有意思了:
首先 ,来个ifconfig -a ,您应该能够看见如下的东东:
sit0 Link encap:IPv6-in-IPv4
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
暂且不说明,我们继续 lsmod:
[hehe@bj48 ~]$ lsmod
Module Size Used by
md5 8129 1
ipv6 243425 18
iptable_filter 6977 0
ip_tables 22721 1 iptable_filter
OK,IPV6模块被引入了:)
结合IPV6 HOWTO,得到如下结论:
SIT是IPv6-in-IPv4 tunnel interfaces, 这个interfaces(界面或是接口)也称作sitx, sit是"Simple Internet Transition"的缩写. 他能够将IPv6的数据包塞进IPv4, 通过IPv4到达另一个地点.sit0 不能使用在专用的tunnels 上.
在这个情况下,系统既能用V4通讯,又可用V6通讯(过渡时期嘛),那另一个问题就来了,系统怎样决定何时使用何种协议呢?!经过偶的观察,这取决于应用程式,笔者有台爱机,apache1.3.39绑定的是IPV4的地址,SSH绑定的是IPV6地址,所以呢,WEB通讯被记录入/proc/net/tcp SSH通讯被记入了/proc/net/tcp6,小小的例子请看:
[hehe@bj48 ~]$ netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 :::18822 :::* LISTEN
这说明 WEB和SSH绑定的一个V4,一个V6,那么再看看/proc里面的记录:(V6格式的IP被偶处理了一下,以免泄露公司IP,呵呵)
[hehe@bj48 ~]$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 8328 1 f6333b40 3000 0 0 2 -1
[hehe@bj48 ~]$ cat /proc/net/tcp6
sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000000000000000000000000000:4986 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 6312 1 f69719c0 3000 0 0 2 -1
1: 00000000000000000000000000003001A8C0:4986 000000000000000rreereer00000C01A8C0:B597 01 00000000:00000000 02:0000185D 00000000 0 0 1037847 2 f6971500 201 40 1 3 -1
2: 0000000000000fdgsggdggdgdg003001A8C0:4986 00000000000000dgfdgdfgfdg000C01A8C0:B99D 01 00000000:00000000 02:0000E725 00000000 0 0 1044626 4 f6971040 201 40 13 2 -1
分析发现:OA状态(即LISTEN状态)一个在tcp,一个在tcp6,另一个笔者的SSH记录很明显在tcp6里,所以验证了偶的猜测,从另一个IP用ab压力测试一下看看,web的访问的确被记录到了/proc/net/tcp里了,SSH的通讯的确被记录入/proc/net/tcp6里了。
后来看了看netstat 的源码,发现他是使用/proc系统提供的一个API获得参数,但是没有指明是从哪个文档中获得,这个让偶比较郁闷
OK,总结一下:
a.系统总的TCP连接数是/proc/net/tcp tcp6两个文档的加总
b.两个文档分别记录不同的通讯,任何一个新的连接被记录到哪个文档取决于应用程式的支持
2、/proc/stat meminfo net/dev等的分析比较简单,不多说了,浪费唾液:)
3、关于系统优化,在随Linux内核发布的document中我也发现,唯一能够和内核打交道的途径就是/proc/sys下的各个参数,而实际工作中我们也的确是在调节这个目录里的东东来达到性能的扩展,比如最大大开文档数等等,所以说,做一个真正的系统工程师,我需要熟练掌控这个目录!当然了,要熟练掌控这个目录,系统的知识,网络的知识,操作系统的知识都不可或缺,不怕
参考资料:
http://hi.baidu.com/yeetoo/blog/item/87834a0fd8c148286159f36e.html
(sit0设备的领悟,和偶同感)
http://man.chinaunix.net/linux/how/Linux-IPv6-HOWTO.html
(手册性的东东,多看无害)
http://bbs.zdnet.com.cn/thread-43958-1-1.html
(虽然文章老了点,但是很有参考性,很感谢作者)
本文来自ChinaUnix博客,假如查看原文请点:http://blog.chinaunix.net/u/15526/showart_468004.html
|
还没有关于此文章的相关评论!