在哪里可以找到不同网络架构的基准?
我正在玩插座/线程/叉子,我想知道什么是最好的。我认为必须有一个地方,有人已经详细说明了套接字服务的不同架构的所有优点和缺点,列出了运行代码的基准。
最终我想用我自己的代码运行这些不同的配置,看看哪种情况在不同情况下运行得最好。
我与之交谈的很多人说我应该使用单线程选择。但是当你在线程中存储状态信息以保持代码简单时,我会看到线程的参数。编写自己的状态结构与使用经过验证的线程体系结构的折衷标记是什么。
我也被告知forking很糟糕......但是当你在一台机器上需要12000个连接时,每个进程限制都无法提升打开文件,分叉也是一种选择!当你有一个需要重启的过程时,分叉也是一个很好的稳定选择,它不会打扰其他过程。
抱歉,这是我较长的问题之一......所以很多变量都是空的。
谢谢, Chenz
答案 0 :(得分:0)
回答这个问题非常困难,因为这很大程度上取决于您的服务实际上在做什么。是否必须查询数据库?从文件系统中读取文件?执行复杂的计算?去和其他一些服务谈谈?此外,客户端连接的寿命有多长?可能的连接与其他连接有一些语义交互,还是它们都被视为彼此独立?您是否想要考虑以后在多个服务器上对服务进行负载均衡? (如果是这样,你现在可以考虑一下,以便从一开始就设计出任何必要的帮助。)
正如您所暗示的那样,服务机器可能具有与各种技术相互作用的限制,引导您走向一个或另一个答案。您有每进程文件描述符限制,但请记住,您可能还有一个固定大小的进程表!无论如何,你期望有多少并发客户?
如果您的服务不断崩溃并且您需要继续重新启动它,或者您认为您想要一个多进程模型以便连接彼此隔离,那么您可能做错了。在这种情况下,稳定性非常重要,这意味着良好的实践和记忆卫生,无论是一般情况还是面对基于网络的攻击。</ p>
记住历史... fork()在Unix世界中很便宜,但在Windows上产生相对昂贵的新进程。 OTOH,Windows线程是轻量级的,而线程一直与Unix有点陌生,而且最近才变得普遍。
答案 1 :(得分:0)
编辑:这是我正在寻找的链接,这是一篇回答你问题的全文。 http://www.kegel.com/c10k.html
所有三种模型都设计了Web服务器(fork,thread,select)。人们喜欢对Web服务器进行基准测试。
http://www.lighttpd.net/benchmark
Libevent有一些关于如何选择select()与线程模型的基准和链接,通常支持使用libevent模型。 http://monkey.org/~provos/libevent/