|
本帖最后由 pony 于 2016-3-23 21:46 编辑
先讲了一段Unix的历史,Unix系统最开始并不是设计成通用的服务器操作系统,而是设计成电话网络中的控制系统。电话网络中,控制面与数据面有明显的区分,数据传输是在电话网络中进行的。问题就在于我们现在把Unix服务器当成是用户面的部分来使用,这是不应该的。如果我们设计内核时是为了让每台服务器运行一个应用程序,那会与现在的多用户内核有巨大得差别。
所以,关键是在于明白:
内核并不是解决方法,内核是问题所在。
意思是:
不要让内核做所有繁重的工作。将数据包处理,内存管理和线程调度等从内核中移出来,放到应用程序里,使其处理得更加高效。让Linux内核处理控制面,应用程序处理数据面。
这样,系统在处理上千万的并发连接时,200个时钟周期用于数据包处理,1400个时钟周期用于程序逻辑。由于内存访问要使用300个时钟周期,使用减少代码和减少cache丢失的方法进行设计也是关键所在。
一个专门的数据面处理系统,可以处理每秒1千万的数据包。而一个控制面的处理系统,每秒只能处理1百万的数据包。
如果这看起来很极端,那么记住一句老话:可扩展性是一门技术活。为了做出成功的系统,千万别把性能“外包”给操作系统。你必须亲自去完成。
现在,然我们看一下如何构建一个具备支持千万级别并发连接能力的系统……
C10K 问题 – 上一个十年
十年前,工程师们解决了C10K(concurrent 10,000)可扩展性问题。他们通过为内核打补丁、从多线程服务器(如Apache)迁移到事件驱动服务器(如Nginx和Node)。人们从Apache到可扩展服务器迁移了10年。在最近几年,我们看到了人们更快的采用可扩展服务器。
Apache的问题
Apache的问题在于,随着连接的增多,性能愈发下降。
关键点:性能与可扩展性是正交的。这两个是不同的概念。当人们讨论扩展时他们常常会说到性能,但是这两者间有着明显的区别。
对于只持续几秒的短连接,我们称之为快事务(quick transaction),如果你能够处理1000TPS(Transaction Per Second),那么你的服务器只能支持1000的并发连接。
如果事务的时长改为10秒,现在在1000TPS的情况下你能够支持10,000的连接。Apache的性能会急剧下降,即使这可能会触发了DoS攻击的检测。通过大量的下载就能使Apache宕机。
如果你能够每秒处理5000连接,而你要怎么做才能够每秒处理10,000连接呢?假设你升级了硬件而且使处理器快了两倍。会发生什么?你能够获得两倍的性能,但是你不能获得两倍的扩展。也许你只能够处理每秒6000的连接。如果持续升级硬件,你会得到同样的结果。性能与可扩展性是不一样的。
问题在于Apache会创建一个CGI进程然后杀掉他。这导致了其不可扩展。
为什么?服务器不能处理10,000个并发连接是由于内核使用O(n)算法。
内核中两个基本问题:
1) 连接数=线程数/进程数。一个数据包进来,内核要遍历所有10,000个进程找到处理这个数据包的进程。
2) 连接数=select数/poll数。同样的可扩展问题,每一个数据包都要遍历sockets列表。
解决方法:为内核打上补丁,使其查找时间为常数。
1) 现在无论线程数量多少,线程的切换时间是常数。
2) 使用epoll()/IOCompeltionPort 可扩展的系统调用能够在常数时间查找socket。
线程调度仍不能够扩展,所以服务器使用epoll的异步编程模型,在Node和Nginx中都体现了。即使一台较慢的服务器,增加连接数时性能不会急剧下降。10,000的连接,笔记本都能比16核的服务器快。
C10M问题 -- 下一个十年
在不远的未来,服务器将需要处理百万级别的并发连接。随着IPv6的普及,我们要开始下一个阶段的扩展,使得服务器支持的连接数达到百万。
需要这样的可扩展性应用包括:IDS/IPS,因为他们连接到服务器的骨干。其他应用如DNS根服务器,TOR节点,因特网的Nmap,视频流,金融,NAT,Voip交换机,负载均衡服务器,web缓存,防火墙,邮件接收服务,垃圾邮件过滤等。
其他遇到扩展问题的人包括设备供应商,因为他们销售软硬一体的设备。你购买这些设备直接放置到数据中心里使用。这些设备可能会有一块专门用于加密,数据包解析等的Intel主板或者网络处理器。
假设在网上一台40gbps,32核,256G内存的X86服务器的价格只要5000美金。这样的服务器能够处理超过10,000的连接。如果不行的话,是因为你软件设计不好,并不是硬件的问题。这样的硬件可以很轻易扩展到千万的并发连接。
千万并发连接的挑战意味着什么:
1. 一千万并发连接数
2. 每秒一百万连接数 —— 每个连接持续时间大概是10秒
3. 每秒100亿比特 —— 因特网的快速链接
4. 每秒1千万个数据包 —— 预计,当前服务器每秒处理50,000个数据包,这将要提高一个层次。每个数据包会触发一次中断,而之前服务器每秒能处理100,000个中断。
5. 10毫秒的时延 —— 可扩展的服务器或许能够解决得了扩展问题,但是时延并不行。
6. 10毫秒的抖动 —— 限制最大时延
7. 10个CPU —— 软件将要扩展到多核的服务器。大多数软件只可以轻易扩展到4个核,由于服务器要扩展到更多核的服务器,所以软件也要重写做相应的支持。
|
|