什么是C10K问题

1W个客户端连接上一个server,客户不定时的发送请求。

I/O策略
软件架构
1.单线程解决多重I/O调用
    不要使用阻塞/同步的调用,如果非要这么做,那就采用多进程或者多线程来并发处理。
    使用非阻塞的调用和就绪通知策略,当下一个I/O可用时通知调用者。适用于套接字I/O,而不是磁盘I/O.
    使用异步的调用和通知策略,当下一个I/O可用时通知调用者,适用于磁盘I/O和套接字I/O。
2.如何控制服务每个客户端的代码
    每一个client对应一个服务端进程,每一个进程保存client的一个状态机。
I/O方案
1.每个线程处理多个客户端请求,使用非阻塞I/O和水平触发通知策略(同步非阻塞轮询)
    水平触发通知策略
    当I/O触发可读写的时候,如果调用者没有及时处理,下一次检查I/O状态的时候仍然会通知调用者。
    垂直触发通知策略
    当I/O触发可读写的时候,如果调用者没有及时处理,下一次检查I/O状态的时候就不再通知调用者,和水平触发通知策略不同的是,只有在I/O状态由不可用变为可用的时候才会通知调用者。
    设置文件描述符为非阻塞,告诉epoll想要关注哪些事件,内核将会检测哪些fd可用并通知调用者,不管调用者做了什么,只要fd是可用的,就一直通知调用者。
    瓶颈:如果要读的页不在core中,那从磁盘中read和sendfile是一个重要的瓶颈。对内存映射文件和磁盘文件句柄设置非阻塞模式是没有什么意义的,当服务器第一次需要进行磁盘I/O时将会阻塞,所有的client请求都必须等待。
2.每个线程处理多个客户端请求,使用非阻塞I/O和就绪改变通知
    就绪改变通知,你交给内核一个文件句柄,当文件描述符从不就绪改变成就绪时,内核会通知你。在文件描述符从就绪状态改变为非就绪状态之前不会再发送通知,也就是说,想要再次触发通知,除非你做了某些操作使文件描述符进入非就绪状态,比如在send、recv、accept收到了EWOULDBLOCK错误。
    当使用就绪改变通知的时候,必须准备好应对闲杂事件,因为一个通用的实现是当收到任何包的时候都会通知,而不是当文件描述符就绪的时候才通知。
    使用就绪改变通知会减少编程错误的容忍度,如果你漏处理了一个连接上的任意一个事件,连接上的所有消息都被阻塞。
3.每个线程处理多个客户端请求,使用异步I/O
    目前还不是很流行,可能是比较少的操作系统支持异步I/O,也可能是使用异步I/O需要重构现有的代码。异步I/O把一个signal和value关联到每一个I/O操作上,signal和value被实时的入队和发送到用户进程。LINUX目前有aio的实现。
    使用异步I/O也无法避免打开磁盘文件的阻塞过程,一个好的建议是在另外的线程打开磁盘文件。
4.每个server线程处理一个client
    缺点是每个线程要保持一定的线程堆栈开销,如果启动数百个线程,开销还是相当可观的。
5.把server代码编译到内核中
其他的一些手段
zero-copy
    sendfile API实现了网络的zero-copy
原文

C10K problem的更多相关文章

  1. The C10K problem

    原文链接:http://www.kegel.com/c10k.html It's time for web servers to handle ten thousand clients simulta ...

  2. (转)The C10K problem翻译

    The C10K problem 如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗?毕竟如今的网络是个big place了. 现在的计算机也很强大了,你只需要花大概$1200就可以买一个 ...

  3. 网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000

    The C10K problem翻译 (C10K = connection 10 kilo 问题).k 表示 kilo,即 1000 比如:kilometer(千米), kilogram(千克). 如 ...

  4. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  5. C10K问题渣翻译

    The C10K problem [Help save the best Linux news source on the web -- subscribe to Linux Weekly News! ...

  6. C10K问题和Libevent库介绍

    http://blog.chinaunix.net/uid-20761674-id-75056.html 一.C10K的问题 C10K的问题在上个世纪90年代就被提出来了.大概的意思是当用户数超过1万 ...

  7. c10k C10M

    高性能网络编程(二):上一个10年,著名的C10K并发连接问题     阅读(22369) | 评论(9)收藏10 淘帖1 赞4   JackJiang Lv.9    1 年前 | |只看大图 1. ...

  8. C10K并发连接_转

    转载:http://blog.csdn.net/wangtaomtk/article/details/51811011 1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小 ...

  9. C10K问题摘要

    本文的内容是下面几篇文章阅读后的内容摘要: http://www.kegel.com/c10k.html (英文版) http://www.oschina.net/translate/c10k (中文 ...

随机推荐

  1. Android EventBus源码解析

    项目地址 :https://github.com/greenrobot/EventBus 这个项目个人感觉就是为了解决回调事件过多的,比方说A函数在做完以后 要调用b类的c函数,那我们通常的做法就是 ...

  2. RequireJS入门指导 (转)

    最近在百度实习做的一个项目用到了 Require JS 这个库,之前从来没有了解过,经过一番大概的搜索后找到一篇非常不错的文章,看完后能够让你对 Require JS 的运行机制.使用方法以及为什么使 ...

  3. C#操作Excel,对Sheet插入次序的控制 (有待完善)

    C#对Excel文件的操作,插入工作表(Worksheet)的方法是 Workbook.Worksheets.Add().通常情况下,我们在EXCEL的工作薄中,使用菜单操作:插入一个新的工作表,那么 ...

  4. IOS中UIScrollView的详细使用

    UIScrollView 是可以滚动的View 要想让UIScrollView可以滚动,必须设置UIScrollView的contentSize contentSize : 表示UIScrollVie ...

  5. java 创建线程

    一.继承Thread类 为创建一个线程,最简单的方法就是从Thread类继承.这个类包含了创建和运行线程所需的一切东西.Thread类最重要的方法是run(),但为了使用run(),必须对其进行重写. ...

  6. SparkR grammer

    They are different between local R and sparkR: sparkR 跑通的函数: http://blog.csdn.net/wa2003/article/det ...

  7. JavaScript高级程序设计(第三版)第三章 基本概念

    3.3 变量 在使用var声明但未对其加以初始化时,这个变量的值就是undefinded. var message; //这个变量声明之后默认取得了undefinded值 //下面这个变量并没有声明 ...

  8. Java的平台无关性

    转载自:http://www.cnblogs.com/Y/archive/2011/03/22/JavaVM_Learning_Chapter2_Platform_Independence.html ...

  9. Slideout吐槽

    前言: 今天有点事,只尝试做一个侧边栏.SlideOut一个侧边栏,对着github,ReadMe看,并尝试着写了.还不错,关键是当与bootstrap一起时,什么效果都没了, 这是什么情况,明天想再 ...

  10. Github在windows7环境下使用入门

    1.下载并安装 下载和安装一般都没什么问题,网上的链接一大堆,不过还是在此给一个安装的地址和安装的参考吧. 当然,安装完成后要保证git能使用,必须配置github 2.配置github 首先是要创建 ...