在大量短连接的情况下,tcp的accpet经常阻塞问题

191 views
Skip to first unread message

lizp.net

unread,
Jul 2, 2012, 6:22:05 AM7/2/12
to dev4s...@googlegroups.com
应用场景是:大量tcp短连接,查询完毕直接关闭,必须用tcp协议。
问题:发现进行压力测试时,经常阻塞到accept这里,TIME_WAIT大量出现,设置:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
没有TIME_WAIT了,但是还是阻塞,不知道有没有遇到同样问题的朋友?

邢红瑞

unread,
Jul 2, 2012, 8:11:00 AM7/2/12
to dev4s...@googlegroups.com
backlog的设置是多少

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server



--
求职 java架构师或高级工程师

lizp.net

unread,
Jul 2, 2012, 8:53:56 AM7/2/12
to dev4s...@googlegroups.com
backlog设置为100,还是出现这个问题。
进行大量的短连接操作后,accept会阻塞一段时间,然后又工作正常,cpu也很不稳定,阻塞时没有cpu,不阻塞时cpu很高。使用lsof查看该进程,并没有不正常的文件描述符。
实在不理解,还请看到的朋友给予提示,折腾了好几天了,还没有头绪。
预想的情况应该是:accept一直不停的执行,因为客户端一直在尝试建立连接。不应该阻塞住啊。




--
求职 java架构师或高级工程师

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 2, 2012, 8:56:04 AM7/2/12
to dev4s...@googlegroups.com
backlog设置为1000,问题依旧

谈荣辉

unread,
Jul 2, 2012, 10:17:32 AM7/2/12
to dev4s...@googlegroups.com
阻塞到accept 是正常的现象,因为要等待连接,接受连接。  如果有多个连接,需要加入到链表,对连接进行管理。
建议兄台看下  unix网络连接的书,以及网上的很多例子


在 2012年7月2日 下午6:22,lizp.net <lizp...@gmail.com>写道:

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 2, 2012, 9:09:12 PM7/2/12
to dev4s...@googlegroups.com
非常感谢兄台的回复,可是当多个客户端同时向server发送连接请求时,server端的accept就应该没时间等待了吧?测试:一个客户端不停的发送连接建立、关闭,server的cpu很稳定,accept也不阻塞,但是多个客户端accept反而阻塞了?
确定:除了建立连接、关闭连接外没有做其他事情。
还请解惑。

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

richardcao

unread,
Jul 3, 2012, 3:01:29 AM7/3/12
to dev4s...@googlegroups.com
TIME_WAIT���ı��ȹر�socket�ı߽��룬���Կ��Է���������һ��ָ���ͻ�
�ˣ��ÿͻ��˹ر�
accept������ʲô��˼�����Ǻ����ף��Ҹ�������Dz���������socket����Ϊ��
���ˣ��ǵý�
accept��socket����Ϊ������ioctl��������FIONBIO������û��backlog��ʱ
��accept��
���̷��أ�1��������Ϳ���ȥ���������߼��ˡ�

�� 12-7-2 ����6:22, lizp.net �:
> Ӧ�ó����ǣ�����tcp�����ӣ���ѯ���ֱ�ӹرգ�������tcpЭ�顣
> ���⣺���ֽ���ѹ������ʱ����������accept���TIME_WAIT�������֣����ã�
> net.ipv4.tcp_syncookies = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.tcp_fin_timeout = 30
> û��TIME_WAIT�ˣ����ǻ�������֪����û������ͬ����������ѣ�
> --
> �����ܷ������з�����Ӫ
> http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 3, 2012, 5:32:08 AM7/3/12
to dev4s...@googlegroups.com
accept阻塞是什么意思?不是很明白,我个人理解是不是你把这个socket设置为阻
塞了,

是的,我是把accept设置为阻塞了,但是进行大量客户端尝试连接时,server端的accept应该不可能阻塞的,因为客户端在尝试连接啊,这时我进行telnet登录都无法登录,accept无动于衷,这是什么原因啊?

在 2012年7月3日 下午3:01,richardcao <straywi...@gmail.com>写道:
TIME_WAIT是哪边先关闭socket哪边进入,所以可以服务器发送一个指令给客户
端,让客户端关闭
accept阻塞是什么意思?不是很明白,我个人理解是不是你把这个socket设置为阻
塞了,记得将
accept的socket设置为非阻塞ioctl调用设置FIONBIO,这样,没有backlog的时
候,accept会
立刻返回-1,这样你就可以去跑你其他逻辑了。

于 12-7-2 下午6:22, lizp.net 写道:
> 应用场景是:大量tcp短连接,查询完毕直接关闭,必须用tcp协议。
> 问题:发现进行压力测试时,经常阻塞到accept这里,TIME_WAIT大量出现,设置:
> net.ipv4.tcp_syncookies = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.tcp_fin_timeout = 30
> 没有TIME_WAIT了,但是还是阻塞,不知道有没有遇到同样问题的朋友?

qiaojie

unread,
Jul 3, 2012, 5:54:09 AM7/3/12
to dev4s...@googlegroups.com
检查一下系统的防火墙设置

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

richardcao

unread,
Jul 3, 2012, 8:42:17 PM7/3/12
to dev4s...@googlegroups.com
�ͻ��������ٿ�Ҳ����������ܵĿ죬������accept���������Dz����ǵģ���Ӧ����
epoll,kevent���ֵط����ã�������ÿ��ѭ�����sleep��
���⣬���˵������accept�ĵط�����ס��Ȼ����telnet��û���κη�Ӧ��һֱ����
accept����Ļ����Ǿ�Ҫ�����������ˣ�Ӧ���Ǹ�û�����ϲŶԡ�
�� 12-7-3 ����5:32, lizp.net �:
accept������ʲô��˼�����Ǻ����ף��Ҹ�������Dz���������socket����Ϊ��
���ˣ�

�ǵģ����ǰ�accept����Ϊ�����ˣ����ǽ��д����ͻ��˳�������ʱ��server�˵�acceptӦ�ò���������ģ���Ϊ�ͻ� ���ڳ������Ӱ�����ʱ�ҽ���telnet��¼���޷���¼��accept�޶����ԣ�����ʲôԭ�򰡣�

�� 2012��7��3�� ����3:01��richardcao <straywi...@gmail.com>д ����
TIME_WAIT�� �ı��ȹر�socket�ı߽��룬���Կ��Է���������һ��ָ���ͻ�
�ˣ��ÿͻ��˹ر�
accept������ʲô��˼�����Ǻ����ף��Ҹ�������Dz���������socket����Ϊ��
���ˣ��ǵý�
accept��socket����Ϊ������ioctl��������FIONBIO������û��backlog��ʱ
��accept��
���̷��أ�1��������Ϳ���ȥ���������߼��ˡ�

�� 12-7-2 ����6:22, lizp.net �:
> Ӧ�ó����ǣ�����tcp�����ӣ���ѯ���ֱ�ӹرգ�������tcpЭ�顣
> ���⣺���ֽ���ѹ������ʱ����������accept���TIME_WAIT�������֣����ã�
> net.ipv4.tcp_syncookies = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.tcp_fin_timeout = 30
> û��TIME_WAIT�ˣ����ǻ�������֪����û������ͬ����������ѣ�
> --
> �����ܷ������з�����Ӫ
> http://groups.google.com/group/dev4server

--
�����ܷ������з�����Ӫ
 http://groups.google.com/group/dev4server

谈荣辉

unread,
Jul 3, 2012, 9:55:26 PM7/3/12
to dev4s...@googlegroups.com
 用其他电脑和Ip试试。  或者根本就没有连上,不要纠结这个问题。


在 2012年7月4日 上午8:42,richardcao <straywi...@gmail.com>写道:
客户端连接再快也不如你程序跑的快,所以在accept设置阻塞是不明智的,你应该在
epoll,kevent这种地方设置,或者是每次循环最后sleep。
另外,你的说法是你accept的地方阻塞住,然后你telnet后都没有任何反应,一直处于
accept阻塞的话,那就要检查你的网络了,应该是根本没连接上才对。
于 12-7-3 下午5:32, lizp.net 写道:
accept阻塞是什么意思?不是很明白,我个人理解是不是你把这个socket设置为阻
塞了,

是的,我是把accept设置为阻塞了,但是进行大量客户端尝试连接时,server端的accept应该不可能阻塞的,因为客户 端在尝试连接啊,这时我进行telnet登录都无法登录,accept无动于衷,这是什么原因啊?

在 2012年7月3日 下午3:01,richardcao <straywi...@gmail.com>写 道:
TIME_WAIT是 哪边先关闭socket哪边进入,所以可以服务器发送一个指令给客户

端,让客户端关闭
accept阻塞是什么意思?不是很明白,我个人理解是不是你把这个socket设置为阻
塞了,记得将
accept的socket设置为非阻塞ioctl调用设置FIONBIO,这样,没有backlog的时
候,accept会
立刻返回-1,这样你就可以去跑你其他逻辑了。

于 12-7-2 下午6:22, lizp.net 写道:
> 应用场景是:大量tcp短连接,查询完毕直接关闭,必须用tcp协议。
> 问题:发现进行压力测试时,经常阻塞到accept这里,TIME_WAIT大量出现,设置:
> net.ipv4.tcp_syncookies = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.tcp_fin_timeout = 30
> 没有TIME_WAIT了,但是还是阻塞,不知道有没有遇到同样问题的朋友?
> --
> 高性能服务器研发与运营
> http://groups.google.com/group/dev4server

--
高性能服务器研发与运营
 http://groups.google.com/group/dev4server

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 4, 2012, 7:37:16 AM7/4/12
to dev4s...@googlegroups.com
试了,还是不行,最后通过tcpdump抓包,发现阻塞时是因为3次握手没有完成,即客户端发送SYN_SEND,但服务端没有响应,客户端只能再次重发,但是在重发过程中,服务端却不进行ack的回复,accept也没有响应,这是怎么回事?

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 4, 2012, 7:38:33 AM7/4/12
to dev4s...@googlegroups.com
什么情况下,客户端发送SYN_SENT,服务端监听建立了,但是不发送ack?还请高手释疑。

zy

unread,
Jul 4, 2012, 8:28:57 AM7/4/12
to dev4s...@googlegroups.com
协议栈满了,可以看看服务器是不是很多处于FIN状态的TCP连接?

发自我的小米手机

"lizp.net" <lizp...@gmail.com>编写:
--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

xchenjun

unread,
Jul 4, 2012, 8:40:04 AM7/4/12
to dev4s...@googlegroups.com

你确认服务端收到了SYN?

AckTCP栈负责发的,握手没有建立,TCP栈自然不会通知应用层来拿连接.

看看TCP状态转换图吧,然后分析一下服务端的连接状态,tcpdump什么的..

 

发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代表 lizp.net
发送时间: 201274 19:39
收件人: dev4s...@googlegroups.com
主题: Re: 在大量短连接的情况下,tcpaccpet经常阻塞问题

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 4, 2012, 9:22:30 AM7/4/12
to dev4s...@googlegroups.com
不确定,但是客户端和服务端在一台机器上,而且端口也打开监听着,为什么返回ack呢?而且accept在阻塞着,没有进行大量的处理,cpu也不占用。也没有其他什么FIN状态,郁闷。。。

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

xchenjun

unread,
Jul 4, 2012, 10:31:17 AM7/4/12
to dev4s...@googlegroups.com

-----

什么情况下,客户端发送SYN_SENT,服务端监听建立了,但是不发送ack?还请高手释疑。

-----

可不是监听建立了就一定会发送ACK.

监听套接字的连接队列满了,就不会理会客户端来的SYN,另一方面,客户端发了SYN收不到服务端的ACK就会重发SYN,若干次重试还不成功,connect最终返回超时.

这个过程也是是TCP栈处理的.

 

发送时间: 201274 21:23
收件人: dev4s...@googlegroups.com
主题: Re: 答复: 在大量短连接的情况下,tcpaccpet经常阻塞问题

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 4, 2012, 9:08:43 PM7/4/12
to dev4s...@googlegroups.com
可问题是:accept也在阻塞啊,是不是说明监听套接字的连接队列 并没有满?或者说队列中都没有数据?如果没有数据,那三次握手就应该很快完成啊

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

qiaojie

unread,
Jul 4, 2012, 10:40:01 PM7/4/12
to dev4s...@googlegroups.com

防火墙把大量连接请求当作洪水攻击给过滤了,检查一下系统的防火墙设置。

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 4, 2012, 11:34:51 PM7/4/12
to dev4s...@googlegroups.com
达人!果然是防火墙的原因,平时没开,上次不知到被谁重启了机器后,自动打开了。

非常感谢!对热情帮我分析的朋友表示感谢!

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

谈荣辉

unread,
Jul 5, 2012, 1:19:33 AM7/5/12
to dev4s...@googlegroups.com
非常感谢你,让我意识到,只有对问题,的契而不舍,才能解决问题。


--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

lizp.net

unread,
Jul 5, 2012, 2:25:55 AM7/5/12
to dev4s...@googlegroups.com
共勉!

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

Phoenix Yang

unread,
Dec 9, 2012, 9:40:30 PM12/9/12
to dev4s...@googlegroups.com
这个是操作系统的问题。大量连接快速关闭打开,关闭就会出现这种现象。因为操作系统需要时间是否关闭的连接。解决方法,WIN修改注册表,LINUX修改配置文件,的广播套接字时间。具体,自己去查下。好多年前搞过。



--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

Reply all
Reply to author
Forward
0 new messages