什么是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. 【英语】Bingo口语笔记(46) - 不可能的表达

  2. 【转】15 个用于 GitHub 的 Chrome 插件

    原文网址:http://webres.wang/15-useful-chrome-extensions-for-github/ 对于 GitHub 你了解多少呢?其实,它是一个基于 Git 托管的 W ...

  3. Word排版成树形结构技巧

    初始文字 A A1 A2 B1 B1 B2 C C1 希望效果 关健设置

  4. MySQL基础之第17章 MySQL日志

    17.1.日志简介 二进制日志错误日志通用查询日志慢查询日志 17.2.二进制日志 二进制日志也叫作变更日志(update log),主要用于记录数据库的变化情况.通过二进制日志可以查询MySQL数据 ...

  5. SQLServer如何快速生成100万条不重复的随机8位数字

    最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2.    控制不重复 3.    ...

  6. Oracle 安装 检查操作系统版本 必须是 5.0 5.1 的解决办法

    打开 oraparam.ini文件 添加红色部分 Windows=5.1,5.2,6.1 最下面添加 [Windows-6.1-required]#Minimum display colours fo ...

  7. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  8. 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)

    人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...

  9. Python伪开发者对于搜狐云景的测评

    Python伪开发者对于搜狐云景的测评 本人是GAE和OpenShift的狂热爱好者,玩过各种国外PaaS.某次想搞个稍微复杂点的Python Web程序,需要比较好的网络传输速度,就试图找前PM(P ...

  10. 使用Maven将Hadoop2.2.0源码编译成Eclipse项目

    编译环境: OS:RHEL 6.3 x64 Maven:3.2.1 Eclipse:Juno SR2 Linux x64 libprotoc:2.5.0 JDK:1.7.0_51 x64 步骤: 1. ...