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