是时候让 Web 服务器同时处理一万客户端了,你不觉得吗?毕竟,现在的 Web 是一个大地盘了。
并且,计算机也是一样的大。 你可以花 $1200 左右购买一台 1000MHz,2Gb RAM 和一块 1000Mbit/s 以太网卡的机器。我们来看看——在 20000 客户端(是 50KHz,100Kb 和 50Kb/s/客户端)时,它不采取任何更多的马力而是采用 4Kb 的硬盘和为2万客户端中的每个一秒一次的发送它们到网络。(顺便说一句,这是$0.08 每客户端。 那些按 $100/客户端 许可费来收取费用的一些操作系统开始看起来有点沉重!)。所以硬件不再是瓶颈了。
1999年最繁忙的FTP网站: cdrom.com,实际上通过一个千兆的以太网管道同时地处理了 10000 客户端。截至 2001年,同样的速度现在由多个ISP提供,期望它变得越来越受大型商业客户的欢迎。
瘦客户端计算模式显现出回来的风格——这一时刻,在互联网上的服务器正在为数千计的客户端服务。
考虑到这一点,这里有几个关于如何配置操作系统和编写代码以支持数千客户端的注意事项。讨论的中心是围绕类 Unix 操作系统的。因为这是我个人感兴趣的领域。但Windows也包括了一点。
阅读Nick Black写的超级棒的 Fast UNIX Servers 文章.
2003年十月, Felix von Leitner 做了一个超级好的网页,展示了网络的可扩展性,他完成了在各种不同的网络系统请求和操作系统下的benchmark比较。他的一个实验观察结果就是linux2.6的内核确实比2.4的要好,但还有有很多很多好的图表数据可以引起OS开发者的深思(如有兴趣可以看看 Slashdot 的评论;是否真的有遵循Felix的实验结果对benchm的提高进行跟踪的)
如果你还没有读过上述,那么先出去买一本W. Richard Stevens写的 Unix Network Programming : Networking Apis: Sockets and Xti (Volume 1) . 这本书描述了很多编写高性能服务器的I/O策略和误区,甚至还讲解了关于 'thundering herd' 问题。惊群问题
如果你读过了,那么请读这本 Jeff Darcy's notes on high-performance server design.(Cal Henderson写的,对更加倾向于使用一款web 服务器而非开发一款服务器 来构建可扩展web站点的同志,这本书更加有用.)
下面的五种组合应该是最常用的了:
... 将所有网络处理单元设置为非阻塞状态,并使用select() 或 poll()识别哪个网络处理单元有等待数据。这是传统所推崇的。在这种场景,内核会告诉你一个文件描述符是否已经具备,自从上次内核告诉你这个文件描述符以后,你是否对它完成了某种事件。(名词“电平触发”(level triggered)来自于计算机硬件设计领域;它是'边缘触发' (edge triggered)的对立面。Jonathon Lemon在他的BSDCON 2000 关于kqueue()的论文 中引入了这些术语。)
注意:特别重要的是,要记住来自内核的就绪通知只是一个提示;当你准备从文件描述符读的时候,它可能还未准备就绪。这就是为什么当使用就绪通知的时候要使用非阻塞状态如此重要了。
对于单线程来说有很多方法来分辨一组非阻塞socket中哪一个已经准备好I/O了:
参照 Poller_select (cc, h) 做为一个如何使用select()替代其它就绪通知场景例子。
参照 Poller_poll (cc, h, benchmarks) 做为一个如何使用poll()替代其它就绪通知场景的例子。
这一特性悄悄出现在了Solaris7 (see patchid 106541) 但是首先公开出现是在 Solaris 8; 参照Sun的数据,在750个客户端的时候,这种实现仅占poll()开销的10%。
在Linux上/dev/poll有很多种实现,但是没有一种性能与epoll一样好,这些实现从来没有真正完整过。在linux上/dev/poll是不建议的。
参照 Poller_devpoll (cc, h benchmarks ) 做为一个如何使用/dev/poll替代其它就绪通知场景的例子。(注意-这个例子是针对linux /dev/poll的,在Solaris上可能是无法工作的。)
当你使用变更就绪通知时,你必须准备好伪事件,因为一个共同的信号就绪实现时,任何接收数据包,无论是文件描述符都已经是就绪的。
这是“水平触发”就绪通知的对立面。这是有点不宽容的编程错误,因为如果你错过了唯一的事件,连接事件就将永远的卡住。不过,我发现边沿触发就绪通知使使用 OpenSSL 编程非阻塞客户端更容易,所以是值得尝试的。
[Banga, Mogul, Drusha '99] 在1999年描述了这种方案。
评论删除后,数据将无法恢复
评论(15)
引用来自“pangee”的评论
@红薯 可否让这些文章,形成PDF,便于俺们码农平时在地铁上PAD阅读。
引用来自“sincoder”的评论
引用来自“Lax”的评论
c10k已经是上个世纪的经典话题,最近开始讨论c10m了。
引用来自“Lax”的评论
c10k已经是上个世纪的经典话题,最近开始讨论c10m了。