找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[ Ngnix与高并发服务器 ] 【守望者 高并发】C10K/C500K与I/O框架

2014-10-26 22:32| 发布者: watchmen | 查看: 3374 | 收藏

摘要: C10K、C/500K问题C10K 的意思是10000并发请求,C500K意思是500 000并发请求,C10K问题的简单描述就是网络服务并发连接极限为10k的问题。这主要体现在网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完 ...

C10K、C/500K问题
C10K 的意思是10000并发请求,C500K意思是500 000并发请求,C10K问题的简单描述就是网络服务并发连接极限为10k的问题。这主要体现在网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题。随着互联网的迅速发展,越来越多的网络服务开始面临C10K问题。

C10K问题的最大特点是:设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。举个例子:如果没有考虑过C10K问题,一个经典的基于select的程序能在旧服务器上很好处理 1000并发的吞吐量,它在2倍性能新服务器上往往处理不了并发2000的吞吐量。

这是因为在策略不当时,大量操作的消耗和当前连接数n成线性相关。会导致单个任务的资源消耗和当前连接数的关系会是O(n)。而服务程序需要同时对数以万计的socket进行I/O处理,积累下来的资源消耗会相当可观,这显然会导致系统吞吐量不能和机器性能匹配。为解决这个问题,必须改变对连接提供服务的策略。

主要有两方面的策略:
(1)应用软件以何种方式和操作系统合作,获取I/O事件并调度多个socket上的I/O操作;主要有阻塞I/O、非阻塞I/O、异步I/O这3种方案。
(2)应用软件以何种方式处理任务和线程/进程的关系。主要有每任务1进程、每任务1线程、单线程、多任务共享线程池以及一些更复杂的变种方案。

常用的经典策略如下:
(1) Serve oneclient with each thread/process, and use blocking I/O这是小程序和java常用的策略,对于交互式的长连接应用也是常见的选择(比如BBS)。这种策略很能难足高性能程序的需求,好处是实现极其简单,容易嵌入复杂的交互逻辑。Apache、ftpd等都是这种工作模式。
(2)Serve manyclients with single thread, and use nonblocking I/O and readinessnotification.
这是经典模型,datapipe等程序都是如此实现的。优点在于实现较简单,方便移植,也能提供足够的性能;缺点在于无法充分利用多CPU的机器。尤其是程序本身没有复杂的业务逻辑时。例如select与poll。
(3)Serve manyclients with each thread, and use nonblocking I/O and readiness notification对经典模型2的简单改进,缺点是容易在多线程并发上出bug,甚至某些OS不支持多线程操作readiness notification。
(4)Serve manyclients with each thread, and use asynchronous I/O在有AI/O支持的OS上,能提供相当高的性能。不过AI/O编程模型和经典模型差别相当大,基本上很难写出一个框架同时支持AI/O和经典模型,降低了程序的可移植性。在Windows上,这基本上是唯一的可选方案。

常见的IO框架有:
以下所列的为几个包装好的库,它们概要了几中常见的技巧,并且可以使的代码与具体操作系统隔离,从而具有更好的移植性。
ACE, 一个重量级的C++ I/O框架,用面向对象实现了一些I/O策略和其它有用的东西,特别的, 它的Reactor是用OO方式处理非阻塞I/O,而Proactor是用OO方式处理异步I/O的( Inparticular, his Reactor is an OO way of doing nonblocking I/O, and Proactor isan OO way of doing asynchronous I/O).
ASIO 一个C++的I/O框架,逐渐成为Boost库的一部分。it's like ACE updated for theSTL era。
libevent 由Niels Provos用C编写的一个轻量级的I/O框架。它支持kqueue和select,并且支持poll和epoll(翻译此文时已经支持)。该机制有好处当然也有不好的地方。Niels给出了一张图来说明时间和连接数目在处理一个事件上的功能,从图上可以看出kqueue和sys_epoll明显胜出。
Poller 是一个轻量级的C++ I/O框架,它使用任何一种准备就绪API(poll, select,/dev/poll, kqueue, sigio)实现水平触发准备就绪API。以其它不同的API为基准 ,Poller的性能 好得多。该链接文档的下面一部分说明了如何使用这些准备就绪API。
rn 是一个轻量级的C I/O框架,也是继Poller后的第二个框架。该框架可以很容易的被用 于商业应用中,也容易的适用于非C++应用中。它如今已经在几个商业产品中使用。
Matt Welsh在2000年四月关于在构建服务器方面如何平衡工作线程和事件驱动技术的使用写了一篇论文,在该论文中描述了他自己的Sandstorm I/O框架。
Cory Nelson'sScale! library - 一个Windows下的异步套接字,文件和管道的库。


边缘触发(edge trigger)和条件触发(leveltrigger)

边缘触发是指每当状态变化时发生一个io事件,条件触发是只要满足条件就发生一个io事件。举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发和条件触发都会产生一个read readynotification通知应用程序可读。应用程序读了50个字节,然后重新调用api等待io事件。这时条件触发的api会因为还有50个字节可读从而立即返回用户一个read readynotification。而边缘触发的api会因为可读这个状态没有发生变化而陷入长期等待。

推荐阅读

[守望者   java初中级视频]22_javaNIO,AIO编程
[守望者 java初中级视频]22_javaNIO,
内容简介:本课程介绍阻塞,非阻塞,同步和异步的基本概念,介绍javaNIO,AIO
[守望者 算法视频]01_数据存储(链表与数组)
[守望者 算法视频]01_数据存储(链表与
本章重点介绍数据的在计算机的存储方式 :连续存储(数组)与链式存储,同时
[守望者   java初中级视频]00_java初中级课程学习导航
[守望者 java初中级视频]00_java初中
内容简介:全面贾少这套视频课程学习需要具备的理论基础,以及适合的学习人群
[守望者 算法视频]08_数据查找_hash算法
[守望者 算法视频]08_数据查找_hash算
守望者:普通逐个查找O(n),组织方式可以无序的数组或者普通链表。已经排序的
[守望者 linux视频]01_开发工具与开发平台
[守望者 linux视频]01_开发工具与开发
本课主要介绍gcc,gdb等系列开发工具,开始编写程序之旅。要求理解Linux开发平
[守望者 linux视频]02 进程内存管理与valgrind的使用
[守望者 linux视频]02 进程内存管理与v
本课主要介绍Linux可执行文件与进程内存结构, Linux进程结构及内存申请与释放
[守望者 C和指针]11_高级指针_C_面向对象
[守望者 C和指针]11_高级指针_C_面向对
(1) 彻底解决指针、取地址后的类型问题。(2) 回调函数示例。
[守望者 算法视频]02_数据逻辑组织_线性关联_栈与队列
[守望者 算法视频]02_数据逻辑组织_线
数组与链表是数据存储的基本方法。栈与队列是两种特殊的数据成员管理方式。栈
[守望者  java初中级视频]01_java环境搭建
[守望者 java初中级视频]01_java环境
内容介绍:学习如何搭建一个java的开发环境,配置JAVA_HOME,Classpath,path等
[守望者 算法视频]07_数据查找_普通查找与二分查找
[守望者 算法视频]07_数据查找_普通查
守望者:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
[守望者 算法视频]03_数据逻辑组织_树_二叉树
[守望者 算法视频]03_数据逻辑组织_树_
树是为了解决链表查找时是线性特点,树采用一分为多的方式,例如二叉树采用一
[守望者  java初中级视频]02_java语法基础
[守望者 java初中级视频]02_java语法
内容简介:介绍java语法的基础,包括常量,变量,作用域,以及常用运算符,对
[守望者 C和指针] 01_C语言快速上手
[守望者 C和指针] 01_C语言快速上手
01C程序设计快速上手课程基础 前导课程:熟悉使用Windows,熟悉编程工具(VS
[守望者 Linux 视频]09_执行单元_进程异步_信号
[守望者 Linux 视频]09_执行单元_进程
本章重点介绍Linux系统下信号的基本原理,异步与同步区别,信号的产生,安装
[守望者 算法视频]05_数据逻辑组织__红黑树
[守望者 算法视频]05_数据逻辑组织__红
守望者:1972年 由Rudolf Bayer发明的,他称之为“对称二叉B树”,它现代的名

行业聚焦  面试交流  职位推荐  开发视频   技术交流  腾讯微博  新浪微博

友情链接:课课家教育  阿里云  鲜果  W3Cfuns前端网  中国企业家  环球企业家  投资界  传媒梦工场  MSN中文网  Android开发者社区  cnbeta  投资中国网  又拍云存储  美通说传播  IT茶馆  网商在线  商业评论网  TechOrange  IT时代周刊  3W创新传媒  开源中国社区  二维工坊  Iconfans  推酷  智能电视网  FreeBuf黑客与极客  财经网  DoNews  凤凰财经  新财富  eoe移动开发者社区  i黑马  网易科技  新浪科技  搜狐IT  创业家  创业邦  腾讯财经  福布斯中文网  天下网商  TechWeb  雷锋网  新浪创业  和讯科技  品途O2O  极客公园  艾瑞网  抽屉新热榜  卖家网  人民网通信频道  拉勾网  创新派  简单云主机  

手机版|黑名单|守望者在线 在线教育 linux 高级程序设计 C/C++ 大数据 ( 蜀ICP备14029946号

成都守望者科技有限公司 © 2013-2016 All Rights Reserved