我们现在已经搞定了 C10K并发连接问题 ,升级一下,如何支持千万级的并发连接?你可能说,这不可能。你说错了,现在的系统可以支持千万级的并发连接,只不过所使用的那些激进的技术,并不为人所熟悉。 要了解这是如何做到的,我们得求助于Errata Security的CEO Robert Graham,看一下他在 Shmoocon 2013 的绝对奇思妙想的演讲,题目是 C10M Defending The Internet At Scale。 Robert以一种我以前从来没有听说过的才华横溢的方式来搭建处理这个问题的架构。他的开场是一些历史,关于Unix最初为什么不是设计成一个通用的服务器的OS,而是为电话网络的控制系统设计的。真正传输数据的是电话网络,因而控制层和数据层有非常清晰的区分。问题是,我们现在用的Unix服务器还是数据层的一部分,虽然并不应当是这样的。如果一台服务器只有一个应用程序,为这样的系统设计内核,与设计一个多用户系统的内核的区别是非常大的。 | ![]() LinuxQueen
|
这也是为什么他说重要的是要理解:
这意味着:
结果就是成为一个用200个时钟周期处理数据包,14万个时钟周期来处理应用程序逻辑,可以处理1000万并发连接的系统。而作为重要的内存访问花费300个时钟周期,这是尽可能减少编码和缓存的设计方法的关键。 用一个面向数据层的系统你可以每秒处理1000万个数据包。用一个面向控制层的系统每秒你只能获得1百万个数据包。 如果这貌似有点极端,记住一句老话:可扩展性是专业化。要做些牛X的事儿,你不能局限于操作系的性能。你必须自己去做。 现在,让我们学习Robert是怎样创作一个能处理1000万并发连接的系统…… | ![]() DYOS
|
C10K的问题——过去十年十年前,工程师在处理C10K可扩展性问题时,都尽可能的避免服务器处理超过10,000个的并发连接。通过修正操作系统内核以及用事件驱动型服务器(如Nginx和Node)替代线程式的服务器(如Apache)这个问题已经解决。从Apache转移到可扩展的服务器上,人们用了十年的时间。在过去的几年中,(我们看到)可扩展服务器的采用率在大幅增长。 Apache的问题
| ![]() 裴宝亮
|
C10M问题 —— 下一个十年在不久的将来,服务器将需要处理数百万的并发连接。由于IPV6普及,连接到每一个服务器的潜在可能连接数目将达到数百万,所以我们需要进入下一个可扩张性阶段。 示例应用程序将会用到这类可扩张性方案:IDS/IPS,因为他们是连接到一台服务器的主干。另一个例子:DNS根服务器、TOR节点、Nmap互联网络、视频流、银行业务、NAT载体、网络语音电话业务PBX、负载均衡器、web缓存、防火墙、邮件接收、垃圾邮件过滤。 通常人们认为互联网规模问题是个人计算机而不是服务器,因为他们销售的是硬件+软件。你买的设备连接到你的数据中心。这些设备可能包含英特尔主板或网络处理器和用于加密的芯片、数据包检测,等等。 2013年2月40gpbs、32核、256gigs RAM X86在新蛋的售价为$5000。这种配置的服务器能够处理10K以上的连接。如果不能,这不是底层的硬件问题,那是因为你选错了软件。这样的硬件能够轻而易举的支持千万的并发连接。 | ![]() dexterman
|
10,000,000个并发连接挑战意味着什么1. 10,000,000个并发连接 2. 每秒1,000,000个连接——每个连接大约持续10秒 3. 10千兆比特/每秒——快速连接到互联网。 4. 10,000,000包/每秒——预期当前服务器处理50,000包/每秒,这将导致更高的级别。服务器能够用来处理每秒100,000个中断和每个包引发的中断。 5. 10微秒延迟——可扩张的服务器也许能够处理这样的增长,但是延迟将会很突出。 6. 10微秒上下跳动——限制最大延迟 7. 10个一致的CPU内核——软件应该扩张到更多内核。典型的软件只是简单的扩张到四个内核。服务器能够扩张到更多的内核,所以软件需要被重写以支持在拥有更多内核的机器上运行。 | ![]() dexterman
|
我们学的是Unix而不是网络编程(Network Programming)
| ![]() 裴宝亮
|
你怎么编写软件使其可伸缩?你怎么改变你的软件使其可伸缩?有大量的经验规则都是假设硬件能处理多少。我们需要真实的执行性能。 要进入下一个等级,我们需要解决的问题是:
| ![]() DYOS
|
精简包-编写自己的定制驱动来绕过堆栈
| ![]() DYOS
|
多核的可扩展性多核的可扩展性和多线程可扩展性是不一样的。 我们熟知的idea处理器不在渐渐变快,但是我们却拥有越来越多的idea处理器。 大多数代码并不能扩展到4核。当我们添加更多的核心时并不是性能不变,而是我们添加更多的核心时越来越慢。因为我们编写的代码不好。我们期望软件和核心成线性的关系。我们想要的是添加更多的核心就更快。 多线程编程不是多核编程
| ![]() DYOS
|
内存的可扩展性
| ![]() 裴宝亮
|
总结
(仅)把控制层留给Linux,与数据层毫无瓜葛。由应用程序管理数据层。应用程序与内核间没有交互。没有线程调度,没有系统调用,没有中断,什么都没有。 然而,你拥有的是在Linux上运行的代码,并且可以正常调试,它并不是某些需要特殊定制的怪异的硬件系统。你得到了定制硬件的性能,就像你期待的那样,只是需要用你熟悉的编程(语言)和开发环境。 |