我有一个以多个进程运行的服务器,使用 SO_REUSEPORT 提供并行性。但是,即使服务器进程正在忙于处理,也可以为其分配一个连接,这实际上是单线程请求。这似乎不是 SO_REUSEPORT 的记录行为。
为了排除我的代码,我从https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/tcpserver.c并修改如下:
/*添加了SO_REUSEPORT*/setsockopt(parentfd,SOL_SOCKET,SO_REUSEADDR | SO_REUSEPORT,(const void)&optval,sizeof(int)); ... . /关闭前先睡眠 */ sleep(10); close(childfd);
我在 strace 下运行了 2 个实例(在同一个端口上),并通过 curl 相隔几秒钟访问它们。我发现第二个 curl 连接可能会等待第一个服务器,即使该服务器正在休眠,而另一个服务器正在 accept() 中等待。
这似乎是 SO_REUSEPORT 实现中的一个缺陷(根据几篇文章,其语义应该是“SO_REUSEPORT 实现将连接均匀分布在同一端口上 accept() 中被阻塞的所有线程(或进程)上。”
内核为:Linux 版本 3.14.27-25.47.amzn1.x86_64 (mockbuild@gobi-build-60001) (gcc 版本 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP 2014 年 12 月 17 日星期三 18:36:15 UTC