我目前正在尝试构建一个http服务器。服务器由一个侦听线程使用select(.)进行多线程。以及由线程池管理的四个工作线程。我目前正在管理每秒14k-16k的请求,文档长度为70字节,响应时间为6-10 I3,在核心I3 330米上。但这是没有保持活力和任何我服务的插座,我立即关闭,当工作完成。
编辑:当检测到套接字上的活动时,工作线程处理已分派的“作业”,即。服务请求。在“作业”完成后,如果没有更多的“作业”,我们就睡觉,直到更多的“作业”被分派出去,或者如果已经有可用的作业,我们就开始处理其中的一个作业。
我的问题始于我开始尝试实施维持生命的支持。在激活“保持活动”的情况下,我只管理每秒1.5k-2.2k请求和100个打开的套接字。这个数字增长到12k左右,有1000个打开的插座。在这两种情况下,响应时间大约在60-90ms左右。我觉得这很奇怪,因为我目前的假设是,请求应该上升,而不是下降,响应时间应该有希望下降,但绝对不会上升。
我尝试了几种不同的策略来解决低性能的问题:
-。可能还有几个,但他们逃出了我的自动取款机。
“保持活动”套接字存储在一个简单的链接列表中,该列表的add/remove方法被一个pthread_mutex锁包围,负责重建FD_SET的函数也有这个锁。
我怀疑主要的罪魁祸首是互斥锁/解锁,我试着分析这个问题,但无论是gprof还是google,无论是引入极端不稳定,还是明显拒绝收集任何数据(这可能是我不知道如何正确使用这些工具)。但是,删除锁可能会使链接列表处于非正常状态,并可能崩溃或将程序置于无限循环中。我还怀疑select(…)/pselect(.)当我使用它时,我很有信心这不是问题,因为即使没有它,性能也很低。
我不知道该如何处理“保持生存”套接字,我想知道你们是否对如何解决低性能的问题有任何建议,或者对我可以用来支持“保持生存”套接字的任何替代方法提出建议。
发布于 2011-05-03 18:55:54
当客户端对多个请求使用套接字时,增加的时间将更加明显。如果您只是打开和关闭,但仍然告诉客户端保持活着,那么您有相同的场景,你没有保持活着。但是现在你有了插座的头顶。
但是,如果您对多个请求使用来自同一个客户端的套接字多次,那么您将失去TCP连接开销并以这种方式获得性能。
确保你的客户正确地使用了“保持活动”。并且很可能是获得套接字状态和数据通知的更好方法。可能是轮询设备或排队请求。
http://www.techrepublic.com/article/using-the-select-and-poll-methods/1044098
此页面有一个用于linux处理轮询设备的修补程序。也许对它的工作原理有一定的了解,您可以在应用程序中使用相同的技术,而不是依赖可能没有安装的设备。
发布于 2011-04-22 11:06:41
试着完全摆脱选择。您可以在每个流行的平台上找到某种事件通知:在freebsd()上的kqueue/kevent,在Linux上的epoll等等。这样您就不需要重新构建FD_SET,并且可以随时添加/删除监视的fds。
发布于 2011-04-26 20:20:38
有许多替代办法:
上使用accept()
。
https://stackoverflow.com/questions/5754631
复制相似问题