(俗称C10K问题)
是否对c10k问题的解决方案进行了更现代的评论(最后更新:2006 年 9 月 2 日),特别关注 Linux(epoll、signalfd、eventfd、timerfd..)和 libev 或 libevent 等库?
讨论现代 Linux 服务器上所有已解决和仍未解决的问题的东西?
(俗称C10K问题)
是否对c10k问题的解决方案进行了更现代的评论(最后更新:2006 年 9 月 2 日),特别关注 Linux(epoll、signalfd、eventfd、timerfd..)和 libev 或 libevent 等库?
讨论现代 Linux 服务器上所有已解决和仍未解决的问题的东西?
C10K 问题通常假设您正在尝试优化单个服务器,但正如您引用的文章指出的那样,“硬件不再是瓶颈”。因此,要采取的第一步是确保在混合中加入更多硬件不是最简单和最便宜的。
如果我们有一个 500 美元的盒子每秒为 X 个客户提供服务,那么只需再购买一个 500 美元的盒子就可以使我们的吞吐量翻倍,而不是让一个知道多少小时和金钱的员工狼吞虎咽地试图弄清楚如何挤压更多,效率要高得多从原包装盒中取出。当然,这是假设我们的应用程序是多服务器友好的,我们知道如何进行负载平衡等等......
巧合的是,就在几天前,Programming Reddit 或者 Hacker News 提到了这篇文章:
在Java早期,我的C编程朋友嘲笑我用阻塞线程做socket IO;当时,别无选择。如今,凭借充足的内存和处理器,这似乎是一种可行的策略。
这篇文章的日期是 2008 年,所以它把你的视野提高了几年。
要回答 OP 的问题,您可以说今天的等效文档不是关于优化单个服务器的负载,而是优化整个在线服务的负载。从这个角度来看,组合的数量如此之多,以至于您要查找的不是文档,而是收集此类架构和框架的实时网站。存在这样一个网站,其名称为www.highscalability.com
旁注1:
我反对这样一种信念,即投入更多的硬件是一个长期的解决方案:
与单个服务器的成本相比,工程师“获得”性能的成本可能很高。当你向外扩展时会发生什么?假设您有 100 台服务器。服务器容量提高 10% 可以每月节省 10 台服务器。
即使您只有两台机器,您仍然需要处理性能峰值。在负载下优雅降级的服务和崩溃的服务之间的区别在于有人花时间优化负载场景。
旁注2:
这篇文章的主题有点误导。CK10 文档并没有尝试解决每秒 10k 个客户端的问题。(每秒客户端的数量无关紧要,除非您还定义了工作负载以及有限延迟下的持续吞吐量。我认为 Dan Kegel 在编写该文档时已经意识到了这一点。)。而是将其视为构建并发服务器的方法纲要,以及相同的微基准。也许从那时到现在的变化是,您可以在某个时间点假设该服务适用于提供静态页面的网站。今天,该服务可能是 noSQL 数据存储、缓存、代理或数百个网络基础设施软件之一。
你也可以看看这个系列的文章:
http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3
他展示了大量的性能数据和为了支持 10K 和 1M 连接而必须完成的操作系统配置工作。
似乎一个具有 30GB RAM 的系统可以在某种社交网络类型的模拟上处理 100 万个连接的客户端,使用基于 Erlang 的应用服务器的 libevent 前端。
我推荐阅读 Zed Shaw 的poll, epoll, science, and superpoll
[1]。为什么 epoll 并不总是答案,为什么有时使用 poll 会更好,以及如何两全其美。
看看斯坦福的 RamCloud 项目:https ://ramcloud.atlassian.net/wiki/display/RAM/RAMCloud
他们的目标是 1,000,000 次 RPC 操作/秒/服务器。他们对系统中存在的瓶颈有许多基准和评论,这些瓶颈会阻止他们达到吞吐量目标。
libev 对自己和 libevent 运行了一些基准测试...