是否对 10000 个客户端/秒问题的解决方案进行了现代审查

Posted

技术标签:

【中文标题】是否对 10000 个客户端/秒问题的解决方案进行了现代审查【英文标题】:Is there any modern review of solutions to the 10000 client/sec problem 【发布时间】:2010-06-28 01:27:30 【问题描述】:

(俗称C10K问题)

对于c10k 问题(最后更新时间:2006 年 9 月 2 日)的解决方案是否有更现代的评论,特别关注 Linux(epoll、signalfd、eventfd、timerfd..)和 libev 或 libevent 等库?

讨论现代 Linux 服务器上所有已解决和仍未解决的问题?

【问题讨论】:

这对我来说似乎不是一个编程问题。 @Gabe:你认为某些 IT 人员会理解 [a] 同步 I/O 和 API 风格之间的区别吗? Longpoke:他要求的是文档搜索,而不是编程建议。 虽然我同意 Gabe 关于此查询的性质,但根本问题 与编程相关并且 很有趣。但是,仅从链接文档的长度来看,它可能“需要扩展讨论”才能回答。最后,@damjan.mk,最好能告诉我们“c10k”是什么意思(即能够在 Web 环境中从一台机器同时为至少 10,000 个客户端提供服务)。我现在正在投票,但是... 请不要关闭这个问题。 IMO 它是完全相关的,我过去一直在寻找它的答案。不过运气不好:-) 【参考方案1】:

C10K 问题通常假设您正在尝试优化单个服务器,但正如您引用的文章指出的那样,“硬件不再是瓶颈”。因此,要采取的第一步是确保在混合中加入更多硬件不是最简单和最便宜的。

如果我们有一个 500 美元的盒子每秒为 X 个客户提供服务,那么只需再购买一个 500 美元的盒子就可以使我们的吞吐量翻倍,而不是让一个知道多少小时和金钱的员工狼吞虎咽地试图弄清楚如何从原来的盒子里挤出更多的东西。当然,这是假设我们的应用程序是多服务器友好的,我们知道如何进行负载平衡等等......

【讨论】:

如果有人想编写一个高性能库来节省您和其他数千人的钱怎么办? @jweyrich:我不会羡慕那个写作任务,因为你可能会不断追赶新的 o/s-server-hardware 版本 4 你支持的配置,同时与 o 竞争/s-server-hardware 版本你不支持。确定“最佳”或“最快”的客户端/服务器/事务/带宽基准的范围将是巨大的,并且因客户而异。员工可以在短短几个小时内在“高性能库”搜索/评估上花费 500 美元的薪水和开销,但仍然没有经过验证的解决方案。说服人们不要只买另一个便宜的盒子是一个艰难的卖点...... 这是一种糟糕的浪费精力的做事方式。我们现在不应该在环境成本大幅上涨(连同电价)的情况下这样做。 Twitter 处理大约 800KB/s 的传入推文,需要 100,000 台服务器来处理它,这只是这种想法的疯狂结果。【参考方案2】:

巧合的是,就在几天前,Programming Reddit 或者 Hacker News 提到了这篇文章:

Thousands of Threads and Blocking IO

在Java的早期,我的C编程朋友嘲笑我用阻塞线程做socket IO;当时,别无选择。如今,凭借充足的内存和处理器,这似乎是一种可行的策略。

这篇文章的日期是 2008 年,所以它把你的视野提高了几年。

【讨论】:

我相信您的硬件供应商很高兴。 我更关心让 damjan.mk 开心。但请不要误解我的评论:这种方法在普通商店购买的 PC 上运行良好,现在很难找到少于双核 CPU 和 2G 内存的 PC。 我认为演示文稿的重点是您可以使用数千个线程,并且不再需要更强大的硬件。您的应用程序将成为 I/O 或 CPU 密集型独立于异步或线程 I/O 之间的选择。【参考方案3】:

要回答 OP 的问题,您可以说今天的等效文档不是关于优化单个服务器的负载,而是优化整个在线服务的负载。从这个角度来看,组合的数量如此之多,以至于您要查找的不是文档,而是收集此类架构和框架的实时网站。有这样一个网站,叫www.highscalability.com

旁注1:

我反对这样一种观点,即投入更多硬件是一个长期的解决方案:

与单个服务器的成本相比,工程师“获得”性能的成本可能很高。当你向外扩展时会发生什么?假设您有 100 台服务器。服务器容量提高 10% 可以每月为您节省 10 台服务器。

即使您只有两台机器,您仍然需要处理性能峰值。在负载下优雅降级的服务和崩溃的服务之间的区别在于有人花时间优化负载场景。

旁注2:

这篇文章的主题有点误导。 CK10 文档并没有尝试解决每秒 10k 个客户端的问题。 (每秒客户端的数量无关紧要,除非您还定义了工作负载以及有限延迟下的持续吞吐量。我认为 Dan Kegel 在编写该文档时已经意识到了这一点。)。而是将其视为构建并发服务器的方法纲要,以及相同的微基准。也许从那时到现在的变化是,您可以在某个时间点假设该服务是针对提供静态页面的网站的。今天,该服务可能是 noSQL 数据存储、缓存、代理或数百个网络基础设施软件之一。

【讨论】:

我同意你的观点,但你需要为性能工程师更新你的盈亏平衡点。一个合理的服务器(8 核,7 GB RAM)在 Amazon 的 EC2 上的成本为每小时 0.68 美元。削减 10 台服务器每年只能为您节省 6 万美元。这不会让你成为一名性能工程师。【参考方案4】:

你也可以看看这个系列文章:

http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3

他展示了相当多的性能数据以及为了支持 10K 和 1M 连接他必须完成的操作系统配置工作。

使用基于 Erlang 的应用服务器的 libevent 前端,一个具有 30GB RAM 的系统似乎可以在某种社交网络类型的模拟中处理 100 万个连接的客户端。

【讨论】:

【参考方案5】:

libev 对自己和 libevent 运行一些基准测试...

【讨论】:

【参考方案6】:

我建议阅读 Zed Shaw 的 poll, epoll, science, and superpoll[1]。为什么 epoll 并不总是答案,为什么有时使用 poll 会更好,以及如何实现两全其美。

[1]http://sheddingbikes.com/posts/1280829388.html

【讨论】:

我现在无法确认他的结果,但我相信这是真的,因为每次调用 poll 都需要在用户和内核空间之间传输更多数据(您感兴趣的所有事件) .当更多这些事件处于活动状态并且发生更多新事件(读取更高负载)时,应该开始补偿。我应该说我不喜欢“superpoll”方法,因为它添加了许多不必要的系统调用,因为它不是内核实现。无论如何,这篇文章给了我很好的见解。 +1。 @jweyrich:你看到了吗? sheddingbikes.com/posts/1280882826.html他提供了完整的 C 代码,以及他的测试的 R 环境,可能有助于您自己进行实验 好的,谢谢。当我有空的时候我会测试它。更多信息:sheddingbikes.com/posts/1281174543.html【参考方案7】:

看看斯坦福的 RamCloud 项目:https://ramcloud.atlassian.net/wiki/display/RAM/RAMCloud

他们的目标是 1,000,000 次 RPC 操作/秒/服务器。他们对系统中存在的阻碍他们达到吞吐量目标的瓶颈有许多基准和评论。

【讨论】:

他们应该将目标更改为 1。还是有更多人试图访问它? :-( 我不关注。你想说什么?我是说 1M 服务请求与客户端数量无关。 我的意思是您发布的链接我无法访问。它是否响应您的请求?此处超时。 哦,哈哈...是的,现在是斯坦福大学的暑假时间。没有系统管理员:P

以上是关于是否对 10000 个客户端/秒问题的解决方案进行了现代审查的主要内容,如果未能解决你的问题,请参考以下文章

前 10000 个素数的最有效代码?

OpenCL AMD S10000 双 GPU 执行

API 或 SDK 仅对数字(1 到 10000 之间)进行语音识别?

redis解决商品秒杀问题

对 .NET 桌面客户端进行负载测试

redis13-----配置文件