goahead2.5频繁点击页面的问题(VxWorks & Linux)
现象:频繁点击页面后,web服务器就没有反应了,过一会,web服务器又恢复正常。
分析:
频繁点击页面后,web服务器就没有反应了,后来发现,在shell下输入netStackSysPoolShow,显示的664大小的网络堆栈为0。想看一下网络状态,输入inetstatShow,没有显示网络状态,不知道什么原因。
开始时:
-> netStackSysPoolShow
type number
--------- ------
FREE : 1138
DATA : 2
HEADER : 0
SOCKET : 0
PCB : 0
RTABLE : 0
HTABLE : 0
ATABLE : 0
SONAME : 0
ZOMBIE : 0
SOOPTS : 0
FTABLE : 0
RIGHTS : 0
IFADDR : 0
CONTROL : 0
OOBDATA : 0
IPMOPTS : 0
IPMADDR : 0
IFMADDR : 0
MRTABLE : 0
TAG : 0
TOTAL : 1140
number of mbufs: 1140
number of times failed to find space: 0
number of times waited for space: 0
number of times drained protocols for space: 0
__________________
CLUSTER POOL TABLE
_______________________________________________________________________________
size clusters free usage minsize maxsize avgsize
-------------------------------------------------------------------------------
20 250 235 32 16 20 16
44 200 182 34 28 36 29
96 100 67 49 48 76 55
172 150 139 21 124 164 149
292 100 80 123 176 256 216
664 50 46 4 384 584 534
1144 30 26 4 1144 1144 1144
-------------------------------------------------------------------------------
value = 80 = 0x50 = 'P'
频繁点击后:
-> netStackSysPoolShow
type number
--------- ------
FREE : 1138
DATA : 2
HEADER : 0
SOCKET : 0
PCB : 0
RTABLE : 0
HTABLE : 0
ATABLE : 0
SONAME : 0
ZOMBIE : 0
SOOPTS : 0
FTABLE : 0
RIGHTS : 0
IFADDR : 0
CONTROL : 0
OOBDATA : 0
IPMOPTS : 0
IPMADDR : 0
IFMADDR : 0
MRTABLE : 0
TAG : 0
TOTAL : 1140
number of mbufs: 1140
number of times failed to find space: 0
number of times waited for space: 0
number of times drained protocols for space: 0
__________________
CLUSTER POOL TABLE
_______________________________________________________________________________
size clusters free usage minsize maxsize avgsize
-------------------------------------------------------------------------------
20 250 234 197 16 20 16
44 200 181 35 28 36 29
96 100 66 50 48 76 55
172 150 138 118 124 164 138
292 100 34 210 176 256 232
664 50 0 86 384 584 615
1144 30 26 4 1144 1144 1144
-------------------------------------------------------------------------------
value = 80 = 0x50 = 'P'
过一段时间后:有恢复正常。
-> netStackSysPoolShow
type number
--------- ------
FREE : 1138
DATA : 2
HEADER : 0
SOCKET : 0
PCB : 0
RTABLE : 0
HTABLE : 0
ATABLE : 0
SONAME : 0
ZOMBIE : 0
SOOPTS : 0
FTABLE : 0
RIGHTS : 0
IFADDR : 0
CONTROL : 0
OOBDATA : 0
IPMOPTS : 0
IPMADDR : 0
IFMADDR : 0
MRTABLE : 0
TAG : 0
TOTAL : 1140
number of mbufs: 1140
number of times failed to find space: 0
number of times waited for space: 0
number of times drained protocols for space: 0
__________________
CLUSTER POOL TABLE
_______________________________________________________________________________
size clusters free usage minsize maxsize avgsize
-------------------------------------------------------------------------------
20 250 234 197 16 20 16
44 200 181 35 28 36 29
96 100 66 50 48 76 55
172 150 138 118 124 164 138
292 100 80 210 176 256 232
664 50 46 86 384 584 615
1144 30 26 4 1144 1144 1144
-------------------------------------------------------------------------------
value = 80 = 0x50 = 'P'
使用命令inetstatShow,什么都看不到:
-> inetstatShow
Active Internet connections (including servers)
PCB Proto Recv-Q Send-Q Local Address Foreign Address (state)
-------- ----- ------ ------ ------------------ ------------------ -------
tcpcb not found
value = -1 = 0xffffffff
->
由于在vxworks下,没法看到tcp链路状态,后来在linux下测试,发现,频繁点击页面,网络状态中会出现很多time_wait状态,这些time_wait过段时间就消息。time_wait消失的时间是1-4分钟,vxworks下大概是1分钟。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32770 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:32771 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.12.254:80 192.168.12.2:2947 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2946 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2945 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2912 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2949 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2948 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2955 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2953 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2958 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2962 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2903 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2965 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2906 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2943 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2911 TIME_WAIT
tcp 0 0 192.168.12.254:80 192.168.12.2:2942 TIME_WAIT
tcp 0 256 192.168.12.254:22 192.168.12.2:1052 ESTABLISHED
[root@localhost root]#
后来看代码,发现,主要是goahead每收到一个请求后,accept会建立一个socket,向浏览器发送完数据后会close掉改socket,这样就会出现time_wait状态,需要2msl长时间才能释放,会占用资源,vxworks下的netstack资源为0,就是time_wait占用的结果,试图寻找解决的方法。使用setsockopt(),SO_LINGER, tLinger.l_onoff = 1; tLinger.l_linger = 0;发现在vxworks下不起作用,netStackSysPoolShow,发现点击页面过快还是为0, 但是,在linux明显看到time_wait减少。
说明SO_LINGER, tLinger.l_onoff = 1; tLinger.l_linger = 0;在linux下起了作用,但在vxworks下不起作用。
解决问题的方法:
1.扩大网络堆栈,延缓问题的发生。
2.修改系统的配置,缩短time_wait的时间。
3.检查是否是底层驱动的问题。之所以这样说,是因为,在网上有人提过这样的问题,但没有在我们设备发现这些打印信息。下面的文档就是网上的评论。