Showing posts with label Event. Show all posts
Showing posts with label Event. Show all posts

Sunday, January 25, 2015

C10K 问题引发的技术变革

C10K 问题

服务器同时支持并发 10K 量级的连接,这些连接可能是保持存活状态的。
解决这一问题,思路主要有两个方面,一个是对于每个连接处理分配一个独立的进程/线程;另一个思路是用同一进程/线程来同时处理若干连接。

每个进程/线程处理一个连接

这一思路最为直接。但是由于申请进程/线程会占用相当可观的系统资源,同时对于多进程/线程的管理会对系统造成压力,因此这种方案不具备良好的可扩展性。
因此,这一思路在服务器资源还没有富裕到足够程度的时候,是不可行的;即便资源足够富裕,效率也不够高。
问题:资源占用过多,可扩展性差。

每个进程/线程同时处理多个连接

传统思路

最简单的方法是循环挨个处理各个连接,每个连接对应一个 socket,当所有 socket 都有数据的时候,这种方法是可行的。
但是当应用读取某个 socket 的文件数据不 ready 的时候,整个应用会阻塞在这里等待该文件句柄,即使别的文件句柄 ready,也无法往下处理。
  • 思路:直接循环处理多个连接。
  • 问题:任一文件句柄的不成功会阻塞住整个应用。

select

要解决上面阻塞的问题,思路很简单,如果我在读取文件句柄之前,先查下它的状态,ready 了就进行处理,不 ready 就不进行处理,这不就解决了这个问题了嘛?
于是有了 select 方案。用一个 fd_set 结构体来告诉内核同时监控多个文件句柄,当其中有文件句柄的状态发生指定变化(例如某句柄由不可用变为可用)或超时,则调用返回。之后应用可以使用 FD_ISSET 来逐个查看是哪个文件句柄的状态发生了变化。
这样做,小规模的连接问题不大,但当连接数很多(文件句柄个数很多)的时候,逐个检查状态就很慢了。因此,select 往往存在管理的句柄上限(FD_SETSIZE)。同时,在使用上,因为只有一个字段记录关注和发生事件,每次调用之前要重新初始化 fd_set 结构体。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  • 思路:有连接请求抵达了再检查处理。
  • 问题:句柄上限+重复初始化+逐个排查所有文件句柄状态效率不高。

poll

poll 主要解决 select 的前两个问题:通过一个 pollfd 数组向内核传递需要关注的事件消除文件句柄上限,同时使用不同字段分别标注关注事件和发生事件,来避免重复初始化。
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • 思路:设计新的数据结构提供使用效率。
  • 问题:逐个排查所有文件句柄状态效率不高。

epoll

既然逐个排查所有文件句柄状态效率不高,很自然的,如果调用返回的时候只给应用提供发生了状态变化(很可能是数据 ready)的文件句柄,进行排查的效率不就高多了么。
epoll 采用了这种设计,适用于大规模的应用场景。
实验表明,当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll;当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级。
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  • 思路:只返回状态变化的文件句柄。
  • 问题:依赖特定平台(Linux)。

libevent

跨平台,封装底层平台的调用,提供统一的 API,但底层在不同平台上自动选择合适的调用。

C10K 到 C10M

随着技术的演进,epoll 已经可以较好的处理 C10K 问题,但是如果要进一步的扩展,例如支持 10M 规模的并发连接,原有的技术就无能为力了。
那么,新的瓶颈在哪里呢?
从前面的演化过程中,我们可以看到,根本的思路是要高效的去阻塞,让 CPU 可以干核心的任务。
当连接很多时,首先需要大量的进程/线程来做事。同时系统中的应用进程/线程们可能大量的都处于 ready 状态,需要系统去不断的进行快速切换,而我们知道系统上下文的切换是有代价的。虽然现在 Linux 系统的调度算法已经设计的很高效了,但对于 10M 这样大规模的场景仍然力有不足。
所以我们面临的瓶颈有两个,一个是进程/线程作为处理单元还是太厚重了;另一个是系统调度的代价太高了。
很自然地,我们会想到,如果有一种更轻量级的进程/线程作为处理单元,而且它们的调度可以做到很快(最好不需要锁),那就完美了。
这样的技术现在在某些语言中已经有了一些实现,它们就是 coroutine(协程),或协作式例程。具体的,Python、Lua 语言中的 coroutine(协程)模型,Go 语言中的 goroutine(Go 程)模型,都是类似的一个概念。实际上,多种语言(甚至 C 语言)都可以实现类似的模型。
它们在实现上都是试图用一组少量的线程来实现多个任务,一旦某个任务阻塞,则可能用同一线程继续运行其他任务,避免大量上下文的切换。每个协程所独占的系统资源往往只有栈部分。而且,各个协程之间的切换,往往是用户通过代码来显式指定的(跟各种 callback 类似),不需要内核参与,可以很方便的实现异步。

参考文献

  • http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/

Friday, May 13, 2011

Interop 2011 Las Vegas 大会


注:2011年5月11日下午,Las Vegas McCarran国际机场候机厅,于老虎机闹腾的音乐声中。
作为IT领域一个比较年轻的会议,Interop的定位却不低,官网自己宣传的定位是“Interop is the leading business technology event with the most comprehensive IT conference and expo available”。跟其他大会类似,分为专题会议和大型会展(Expo)。一般来说,从参与会展的生产商list基本上就能确定大会的影响力。从这个角度,Interop确实称得上是全球IT领域颇具影响力的大会了,基本上叫得出名和叫不出名的IT厂商都有出席。
自06年举行以来,每年至少分别在春季和秋季在Las Vegas和New York举行一次,今年更是夸张,增加了日本的Tokyo和印度的Mumbai,全球范围内要举行4次(喜欢旅游的同学们可不要错过)。Las Vegas这次是今年首次,规模十分惊人,数百家企业参加Expo,专题会议也有近百个,会期从5月8日到12日持续5天,题目更是几乎覆盖了IT技术的所有领域。
从个人参会体验看,云计算/数据中心确实是如日中天,几乎每家都跟这个靠近乎,Expo上更划出了专门的一块作为云计算区(另一块专区是老问题——安全)。不管是业界巨擘如Cisco、Juniper、HP等等,还是一些Startup类公司。讨论的热点也多在数据中心的交换、虚拟化、管理等关键话题上。值得一提的是,NEC、HP、Juniper、IBM等几家都参与进了Openflow Lab,在会上由Big Switch牵头做了展示,关注的人不少,不过感觉好奇的多,懂技术的少(Big Switch这个startup很有意思,有机会单独撰文予以介绍)。
另外,跟前些年参会大家都是人手一台thinkpad不同,今年不少人是一台ipad(当然做技术的还是thinkpad居多,像我过来前犹豫很久还是带着小黑过来了),会展的商家吸引人的花样也多是ipad。我老早就说过,单纯从革命性上来说,iphone远不及ipad,这是真正是找对了需求。商旅人士要求的无非一个是待机长、一个是轻便和随开随用,这点上传统的laptop或cellphone都很难搞定。
最后8g下做key note的几个高管,秃顶的不少呀,至少是前秃,级别高的甚至顶秃,看来确实是要“聪明绝顶”才能做高管了。
其他闲话不再多说,上pic(主要是5月10日拍的)。
IMG_0093
keynote现场。
IMG_0094IMG_0096
Juniper在会上炒作QFabric,但就在当天得知,设计人David Yen跑到Cisco整Nexus去了,Cisco估计乐坏了。
IMG_0097
MS这些年露面不少,甚至网络会议也纷纷掺和。
IMG_0099
云计算专区,IBM、EMC、Intel、MS等都在这个区。
IMG_0098
不知道为何,就是喜欢EMC的这种蓝色style,多来一张。
IMG_0100
EMC俨然虚拟化的领头人,碰上云计算这个千载难逢的好机会更是出尽了风头呀。
IMG_0101IMG_0102
混久了圈子的人,看口号基本就能猜出是哪家公司。IBM这些年无论在啥场合都炒创新和智能。虽然这个理念大家都会用,但被IBM用出来就气象俨然,俨然宗师气派。
IMG_0103IMG_0104
IMG_0105
Juniper的QFabric,简单的说就是一块超大的交换机。我原来讨论数据中心问题的时候曾跟导师开玩笑,说随着技术发展,将来能实现N对N的超级大交换机,能力无限,那么数据中心很多问题都迎刃而解了。本是一句玩笑话,谁知1个月后,就获知了QFabric推出的消息。
IMG_0106
HP带来了自家的一体化的交换、安全、存储解决方案。
IMG_0107
of lab名头颇大,吸引了不少眼球,但炒作的还是基本的of理念。
IMG_0108IMG_0109
of lab演示现场。
IMG_0110IMG_0111IMG_0112
跟Cvm的工程师聊,说隔了两年时间才由16core升级到32core,对于IT产业来说,感觉产品的市场周期有些略长了。不过人家的东西还是蛮好用的。
IMG_0113
IMG_0119
安全专区,老面孔颇多,新面孔也不少。没有看到Plato,不能再听nir同学侃侃神谈,颇为可惜。
IMG_0114IMG_0115IMG_0116IMG_0117
冰雕是吸引观者的老把戏了,不过还是得承认,视觉效果颇佳。
IMG_0149
IMG_0150
参会的国内厂商,除了华赛勉强算上,就是nsfocus(绿盟)了,听说今年在北美有office了。无论如何,走出国门都颇为不易,希望民族企业们先不要急着内斗,能团结起来,先发展起来成熟的市场其实对大家都有好处,最终走向全球领域的大舞台。

Wednesday, February 16, 2011

RSA2011会展观记

相信IT安全领域的人对于RSA大会都不陌生。自1991年首次举行以来,RSA大会影响越来越大,规模也越来越大,现在已经成为IT安全领域名副其实的最吸引人的大会。近几年RSA会议的举办地点都是在旧金山湾区,吸引了大批来自世界各地的安全提供商、学者、爱好者参加。今年的举办地点是旧金山的Moscone中心,恰逢其20周年,会议长达5天(2.14~2.18)。感兴趣的读者可以从RSA网站上了解到具体的日程信息。

自1995年开始,RSA大会每年都有一个主题,今年的主题是“The Adventure of Alice&Bob”,安全的味道颇为浓厚。包括Cisco、Juniper、Palo Alto Networks等数百家知名企业均参与了会展。尤为值得一提的是,国内的NSFocus(绿盟)、TopSec(天融信)和新兴的HillStone(山石)等公司也分别携产品参展,吸引了不少目光(这才是民族的骄傲,年轻人的榜样)。总体来看,云计算的痕迹到处可见,Facebook跟Twitter很受安全厂商重视。另外,网关类安全产品在提到性能时基本上都是100G以上。

除了在大厅中进行的会展之外,还有几十个专门的技术类讲座。几乎设计所有安全热点问题,包括云、P2P、加密等等。

下面是在展会现场拍到的一些场面。

一直忙忙碌碌的Registration Desk。

 

IMG_0009

IMG_0015

Cisco跟Juniper今年看起来十分低调,位置极佳,但不是那么热闹。

 

IMG_0011

IMG_0004

Paloalto Networks位置也不错,关于NGFW的讲解十分风趣,吸引了大量的人气。

 

IMG_0023

绿盟准备很充分。

 

IMG_0010

山石团队,干劲十足的小伙子们。

 

IMG_0017

别具一格的中关村联盟。中国人走的很不容易啊。

 

IMG_0012

IMG_0021

EMC跟VMware“心有灵犀”地大炒云跟虚拟化。

 

IMG_0024

CVM也吸引了大批眼光。

 

IMG_0029

IMG_0032

美女助阵是大多数展台的统一伎俩。

 

IMG_0031

IMG_0036

吸引眼光的另一伎俩是抽奖——奖品不约而同的都是IPad。

 

IMG_0034

电视台现场搭了直播棚。

 

下面是部分其他参展企业的情形。

IMG_0016IMG_0018IMG_0019IMG_0026IMG_0027IMG_0030

IMG_0035IMG_0037

IMG_0013IMG_0014

IMG_0008IMG_0020