首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >支持本地http服务器上的保持活动套接字的问题

支持本地http服务器上的保持活动套接字的问题
EN

Stack Overflow用户
提问于 2011-04-22 10:44:42
回答 5查看 1.7K关注 0票数 11

我目前正在尝试构建一个http服务器。服务器由一个侦听线程使用select(.)进行多线程。以及由线程池管理的四个工作线程。我目前正在管理每秒14k-16k的请求,文档长度为70字节,响应时间为6-10 I3,在核心I3 330米上。但这是没有保持活力和任何我服务的插座,我立即关闭,当工作完成。

编辑:当检测到套接字上的活动时,工作线程处理已分派的“作业”,即。服务请求。在“作业”完成后,如果没有更多的“作业”,我们就睡觉,直到更多的“作业”被分派出去,或者如果已经有可用的作业,我们就开始处理其中的一个作业。

我的问题始于我开始尝试实施维持生命的支持。在激活“保持活动”的情况下,我只管理每秒1.5k-2.2k请求和100个打开的套接字。这个数字增长到12k左右,有1000个打开的插座。在这两种情况下,响应时间大约在60-90ms左右。我觉得这很奇怪,因为我目前的假设是,请求应该上升,而不是下降,响应时间应该有希望下降,但绝对不会上升。

我尝试了几种不同的策略来解决低性能的问题:

  1. 调用选择(.)/pselect(.)使用一个超时值,以便我们可以重新构建FD_SET结构,并侦听阻塞后到达的任何附加套接字,并为任何检测到的套接字活动提供服务。(除了性能低下之外,还存在在阻塞时关闭套接字的问题,从而导致select(.)/pselect(.)2.让一个只接受新连接的侦听线程和一个保持活动的线程通过管道通知在我们阻止和任何新套接字活动之后到达的任何新套接字,并重新构建FD_SET。(这里的附加问题与‘1.’中的问题相同).3。选择(.)/pselect(…)在超时的情况下,在完成新工作时,分离具有活动的套接字的链接列表条目,并在请求被服务后将其添加回。希望重建FD_SET的速度会更快。这样,我们还可以避免尝试侦听任何坏的文件描述符。合并(2.)和(3.)

-。可能还有几个,但他们逃出了我的自动取款机。

“保持活动”套接字存储在一个简单的链接列表中,该列表的add/remove方法被一个pthread_mutex锁包围,负责重建FD_SET的函数也有这个锁。

我怀疑主要的罪魁祸首是互斥锁/解锁,我试着分析这个问题,但无论是gprof还是google,无论是引入极端不稳定,还是明显拒绝收集任何数据(这可能是我不知道如何正确使用这些工具)。但是,删除锁可能会使链接列表处于非正常状态,并可能崩溃或将程序置于无限循环中。我还怀疑select(…)/pselect(.)当我使用它时,我很有信心这不是问题,因为即使没有它,性能也很低。

我不知道该如何处理“保持生存”套接字,我想知道你们是否对如何解决低性能的问题有任何建议,或者对我可以用来支持“保持生存”套接字的任何替代方法提出建议。

  • 如果您需要更多的信息才能正确地回答我的问题,请不要犹豫,我将尽力向您提供必要的信息,并用这些新的信息更新问题。
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-03 18:55:54

当客户端对多个请求使用套接字时,增加的时间将更加明显。如果您只是打开和关闭,但仍然告诉客户端保持活着,那么您有相同的场景,你没有保持活着。但是现在你有了插座的头顶。

但是,如果您对多个请求使用来自同一个客户端的套接字多次,那么您将失去TCP连接开销并以这种方式获得性能。

确保你的客户正确地使用了“保持活动”。并且很可能是获得套接字状态和数据通知的更好方法。可能是轮询设备或排队请求。

http://www.techrepublic.com/article/using-the-select-and-poll-methods/1044098

此页面有一个用于linux处理轮询设备的修补程序。也许对它的工作原理有一定的了解,您可以在应用程序中使用相同的技术,而不是依赖可能没有安装的设备。

票数 0
EN

Stack Overflow用户

发布于 2011-04-22 11:06:41

试着完全摆脱选择。您可以在每个流行的平台上找到某种事件通知:在freebsd()上的kqueue/kevent,在Linux上的epoll等等。这样您就不需要重新构建FD_SET,并且可以随时添加/删除监视的fds。

票数 6
EN

Stack Overflow用户

发布于 2011-04-26 20:20:38

有许多替代办法:

  • 使用进程而不是线程,并通过Unix
  • 每个线程的套接字列表传递文件描述符。您甚至可以直接在worker threads.
  • etc...

上使用accept()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5754631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档