什么是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. Dataguard后台进程解析

    Log Transport Service   主节点上,日志传输服务主要使用如下几个进程: 1.LGWR     LGWR搜集事务日志,并且更新联机日志.在同步模式下,LGWR直接将redo信息直接 ...

  2. 【转】使用oschina的git服务器

    原文网址:http://blog.csdn.net/zengraoli/article/details/24975551 1.概要 其实oschina的git服务器与github的差不多,不过既然是中 ...

  3. RequireJS 2.0 正式发布(转)

    RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升级到了2.0 ...

  4. GenericRepository

    public interface IGenericRepository<TEntity> where TEntity : class { IQueryable<TEntity> ...

  5. struts 中 s:iterator 使用注意事项

    后台定义类 public class Course_pj { private String _id; private String _courseid; private String _course_ ...

  6. linux下的加减运算

    命令: echo rep 如果你有些编程方面的概念,最有意思的是用gdb,它可以进行进制转换,浮点数运算,数据类型占用字节数等等,很方便. (gdb) p 2+5$21 = 7(gdb) p 2/5$ ...

  7. Linux中用stat命令查看文件时3个时间点解析

    有些时候,我们需要在Linux中使用stat命令来查看文件的详细信息.另外联想下,ls -l命令显示的是什么时间,touch命令修改文件的时间戳,修改的又是什么时间?在这里我们一起来试验下. 首先,我 ...

  8. 把php.exe加入系统环境变量-使用命令行可快速执行PHP命令

    有时候在执行长时间运行的脚本程序的时候,浏览器是架不住的.我们就可以使用CMD命令行或者LINUX命令行执行PHP程序 1.把PHP.EXE加入到环境变量,不用每次都进入到PHP的目录 ①  右击我的 ...

  9. LoadRunner参数数组

    参数数组提供了对一类参数集中存放的机制,其中LR内置的几个函数有:lr_paramarr_idx().lr_paramarr_len().lr_paramarr_random() 同时参数数组必须满足 ...

  10. 将war包布署在本地tomcat上

    1.把war包解压到..webapps目录下 2. 修改server.xml文件,在host节点中添加 <Context docBase="C:\Users\bai\Desktop\s ...