天天看点

从C10K到C10M高性能网络的探索与实践 :内核不是解决方案,而是问题所在

1  千万级并发实现的秘密:内核不是解决方案,而是问题所在

https://www.oschina.net/translate/the-secret-to-10-million-concurrent-connections-the-kernel --2013/05/14

  https://www.csdn.net/article/2013-05-16/2815317-The-Secret-to-10M-Concurrent-Connections

既然我们已经解决了 C10K并发连接问题,应该如何提高水平支持千万级并发连接?你可能会说不可能。不,现在系统已经在用你可能不熟悉甚至激进的方式支持千万级别的并发连接。

要知道它是如何做到的,我们首先要了解Errata Security的CEO Robert Graham,以及他在Shmoocon 2013大会上的“无稽之谈”—— C10M Defending The Internet At Scale。

Robert用一种我以前从未听说的方式来很巧妙地解释了这个问题。他首先介绍了一点有关Unix的历史,Unix的设计初衷并不是一般的服务器操作系统,而是电话网络的控制系统。由于是实际传送数据的电话网络,所以在控制层和数据层之间有明确的界限。问题是我们现在根本不应该使用Unix服务器作为数据层的一部分。正如设计只运行一个应用程序的服务器内核,肯定和设计多用户的服务器内核是不同的。

也就是他所说的——关键要理解内核不是解决办法,内核是问题所在。

这意味着: 

  • 不要让内核执行所有繁重的任务。将数据包处理,内存管理,处理器调度等任务从内核转移到应用程序高效地完成。让Linux只处理控制层,数据层完全交给应用程序来处理。

最终就是要设计这样一个系统,该系统可以处理千万级别的并发连接,它在200个时钟周期内处理数据包,在14万个时钟周期内处理应用程序逻辑。由于一次主存储器访问就要花费300个时钟周期,所以这是最大限度的减少代码和缓存丢失的关键。

面向数据层的系统可以每秒处理1千万个数据包,面向控制层的系统,每秒只能处理1百万个数据包。

这似乎很极端,请记住一句老话:可扩展性是专业化的。为了做好一些事情,你不能把性能问题外包给操作系统来解决,你必须自己做。

现在,让我们学习Robert如何创建一个能够处理千万级别并发连接的系统。 

C10K问题——最近十年 

十年前,工程师处理C10K可扩展性问题时,尽量避免服务器处理超过1万个的并发连接。通过改进操作系统内核以及用事件驱动服务器(如Nginx和Node)代替线程服务器(Apache),这个问题已经被解决。人们用十年的时间从Apache转移到可扩展服务器,在近几年,可扩展服务器的采用率增长得更快了。。。。。。。

2  知乎千万级高性能长连接网关揭秘

  https://zhuanlan.zhihu.com/p/66807833   或   http://www.52im.net/thread-2737-1-1.html

相关文章

  • 《Netty干货分享:京东京麦的生产级TCP网关技术实践总结》
  • 《绝对干货:基于Netty实现海量接入的推送服务技术要点》
  • 《通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理》
  • 《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》
  • 《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》
  • 《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》
  • 《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

3  高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了

 http://www.52im.net/thread-568-1-1.html   

解决C10M问题的思路总结

综上所述,解决C10M问题的关键主要是从下面几个方面入手:

网卡问题:通过内核工作效率不高

解决方案:使用自己的驱动程序并管理它们,使适配器远离操作系统。

CPU问题:使用传统的内核方法来协调你的应用程序是行不通的。

解决方案:Linux管理前两个CPU,你的应用程序管理其余的CPU,中断只发生在你允许的CPU上。

内存问题:内存需要特别关注,以求高效。

解决方案:在系统启动时就分配大部分内存给你管理的大内存页。

以Linux为例,解决的思咯就是将控制层交给Linux,应用程序管理数据。应用程序与内核之间没有交互、没有线程调度、没有系统调用、没有中断,什么都没有。 然而,你有的是在Linux上运行的代码,你可以正常调试,这不是某种怪异的硬件系统,需要特定的工程师。你需要定制的硬件在数据层提升性能,但是必须是在你熟悉的编程和开发环境上进行。

4  Linux高性能服务器设计

 https://yq.aliyun.com/articles/721732?utm_content=g_1000082492#

C10K和C10M

计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,Dan Kegel提出了著名的C10问题:一台服务器上同时处理10000个客户网络连接。10000个网络连接并不会发送请求到服务器,有些连接并不活跃,同一时刻,只有极少的部分连接发送请求。不同的服务类型,每个连接发送请求的频率也不相同,游戏服务器的连接会频繁的发送请求,而Web服务器的连接发送请求的频率就低很多。无论如何,根据经验法则,对于特定的服务类型,连接越多,同一时刻发送请求的连接也越多。

时至今日,C10K问题当然早已解决,不仅如此,一台机器能支撑的连接越来越多,后来提出了C10M问题,在一台机器上支撑1000万的连接,2015年,MigratoryData在单机承载12M的连接,解决了C10M问题。

本文先回顾C10问题的解决方案,再探讨如何构建支撑C10M的应用程序,聊聊其中涉及的各种技术。。。

继续阅读