Archive

Posts Tagged ‘empty_out_q’

gen_tcp调用进程收到{empty_out_q, Port}消息奇怪行为分析

September 7th, 2011 4 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: gen_tcp调用进程收到{empty_out_q, Port}消息奇怪行为分析

今天有同学在gmail里面问了一个Erlang的问题,问题描述的非常好, 如下:

问题的背景是:

1、我开发了一个服务端程序,接收客户端的连接。同一时刻会有多个客户端来连接,连接后,接收客户端请求后,再发送响应消息,然后客户端主动断连。

2、服务端监听的socket属性设置如下:

[binary, {packet, raw},
{ip, IPAddr}, {backlog, 10000},
{active, false}, {reuseaddr, true},
{nodelay, false}, {delay_send, true},
{recbuf, 128 * 1024}, {sndbuf, 64 * 1024}]

3、服务器accept监听socket,接收客户端请求,发送响应消息分别是在3个不同的进程中进行。接收请求和发送响应的进程都是重复使用的,每次重新使用的时候传入一个新accept的socket。

问题的现象是:

1、单个用户发起呼叫的时候,流程是成功的,服务器能正常响应。但是多个用户一起呼,批量跑的时候,跑一段时间后,部分客户端会发现不能接收到服务器返回的响应。从抓包来看,客户端的请求是发送到服务器端了。

2、服务器这边发送响应的进程会收到一条{empty_out_q, #Port<0.25876>}这样的消息,而这条消息并不是我开发的代码产生的。

问题是:

1、为什么发消息的进程会收到{empty_out_q, #Port<0.25876>}这样的消息?

2、收到empty_out_q消息,是不是就说明调用gen_tcp:send发送失败?

3、是不是说设置了delay_send的属性,所以即使send失败,也是异步的,在调用send的时候会马上返回ok,但是后面真的发送失败后,则系统会给调用send方法的进程发送一条{empty_out_q, #Port<0.25876>}这样的消息。

这个问题非常有意思。 Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.