向socket里面写数据时出现errno=11和errno=32的原因

最近用swoole写了一个TCP服务器,作用是监听9501端口发送来的消息,然后处理之后发送到mqtt服务器。在测试性能时,我发现连接mqtt服务器的socket经常会出现errno=11 resource temporarily unavailable(资源暂时不可用)和errno=32 Broken pipe(管道破裂)错误。经过在几天的资料查找,基本上弄清楚了这两个错误出现的原因。

要了解这个问题,首先需要了解一下我们在读写socket时究竟发生了什么,这个可以通过知乎的这篇文章来了解一下:https://zhuanlan.zhihu.com/p/38637493

在测试时,swoole客户端向mqtt服务端发起大量的请求,导致对应socket的write buffer很快就写满了,这时,如果还继续用这个socket发送请求的话,就会出现errno=11(资源暂时不可用错误)。这种情况一般的解决方案就是先等待一会,等到write buffer重新出现空闲空间(应用程序级的解决方案)。另外一种解决方法就是修改linux内核参数,调整write buffer缓冲区的大小

errno=32(管道破裂)则是因为socket被关闭后,客户端还在向这个socket发送数据或者读取这个socket的数据。这种情况一般需要应用程序执行断线重连

参考文章:https://my.oschina.net/shelllife/blog/178090


书山有路勤为径 学海无涯苦作舟