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.
Recent Comments