网络编程中的C10K问题总结

标签: 技术文章 | 发表时间:2015-05-21 09:03 | 作者:admin
出处:http://www.mworkbox.com/wp
第一件秘密武器:epoll/IOCP/kqueue新模型       传统的web服务器采用同步socket处理,即每一线程服务于一个客户(apache就是这样),或者是使用传统的select/poll模型。在连接数小的情况,性能也不会很差,但随着连接数的上升,性能会直线下降,超过一定数量时,会导致服务器无法提供服务。这就是著名的C10K问题。现代化的web服务器都采用效率更高的模型,linux下面是epoll,windows下面是IOCP,bsd系统的是kqueue. kangle新版也采用这种模型,连接数上升,性能只是会下降一点,基本上很稳定的提供服务。      第二件秘密武器: 非阻塞socket       即使采用了新模型也能更好的处理服务了,但为什么还要非阻塞socket呢?我们知道,对于发送数据(调用send),大多数的情况下是不会阻塞的,因为数据是直接放到socket的缓冲里面,只有缓冲满了的情况下会阻塞。问题就是我们已经使用了新模型可以检测到该socket能发的时候才发啊?和阻塞有什么关系呢?这就是关键了,因为新模型只能保证发送一次数据不会阻塞,你无法检测一次发送多条数据,这个很关键,因为你的数据不可能完整的,如http头和http body可能要分多次包发送。如果一检测只能发一次,效率会受些影响,如果我们用非阻塞socket,一次检测我们可以一直发送数据,多次调用send, 直到发完,或者检测到EAGAIN错误。这样节省epoll/kqueue系统调用次数,效率大大提升。      第三件秘密武器: writev代替write/send       上次我们已经优化了一次检测可以多次发送数据,节省了epoll/kqueue调用了,但还不够,够贪的吧,能不能做到一次检测,一次发送多条数据,这就是用writev,而不用传统的write/send调用了。大家可以man writev可以看到这个函数的帮助。我们可以在调用前构建多条数据数组,又节省几次write/send调用。IOCP的WSASend函数也是可以实现相同的功能。      第四件秘密武器: TCP_CORK/TCP_NOPUSH       下面我们从socket身上再下功夫,我们可以利用linux特有的TCP_CORK和bsd下面的TCP_NOPUSH功能。http协议层我们可以知道一次请求会发送多少数据给用户,但下面的tcp/ip层无法理解http协议,tcp/ip会按照它的算法,决定是否会合并一些小包发送。能否让 tcp/ip也能"理解"http协议?嗯,这就是第三件秘密武器了,TCP_CORK/TCP_NOPUSH,我们可以在开始发送http头前设置一下,设置一下socket的TCP_CORK/TCP_NOPUSH,相当于在数据流上加一个塞子,这样数据是不会发送到对方,我们再发送http其它数据,等这些数据全部发送完了,我们再把塞子拔掉,取消TCP_CORK/TCP_NOPUSH。节省带宽。至于TCP_CORK和TCP_NOPUSH的详细用法,大家可以搜索一下其它文档。 以上内容来源:http://bbs.tianya.cn/m/post-it-614856-1.shtml 个人在网络编程中总结: 1.线程个数要适中,最好采用线程池方式。 2.内存池自己管理 3.互斥锁越少越好, 即时要用,要采用读写分开的方式(双链表或双队列,一个用于读,一个用于写,读队列无数据再抢占写入队列,写队列可以积累数个包再一次性压入写队列),尽量减少lock的次数。

相关 [网络 编程 c10k] 推荐:

网络编程中的C10K问题总结

- - 三棵杏软件工作室
第一件秘密武器:epoll/IOCP/kqueue新模型       传统的web服务器采用同步socket处理,即每一线程服务于一个客户(apache就是这样),或者是使用传统的select/poll模型. 在连接数小的情况,性能也不会很差,但随着连接数的上升,性能会直线下降,超过一定数量时,会导致服务器无法提供服务.

从 C10K 到 C500K

- Michael - DBA Notes
这个已经过时了,现在大家已经开始说 C500K. 国外的 Urban Airship 公司的工程师在其官方网志上发文章介绍他们在产品环境中做到 50 万并发客户端,Java + Pure NIO 的实现,最近又有文章介绍针对 Linux Kernel 调优的经验:Linux Kernel Tuning for C500k.

[转载]The C10K problem翻译

- jin - 新浪开发者博客
如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗. 毕竟如今的网络是个big place了. 现在的计算机也很强大了,你只需要花大概$1200就可以买一个1000MHz的处理器,2G的内存, 1000Mbit/sec的网卡的机器. 让我们来看看–20000个客户,每个为50KHz,100Kbyes和 50Kbit/sec,那么没有什么比为这两万个客户端的每个每秒从硬盘读取4千字节然后发送到网络上 去更消耗资源的了.

epoll网络编程实例

- - CSDN博客推荐文章
       在前面已经经过了PPC、TPC、select之类( TPC就是使用进程处理data,TPC就是使用线程处理 ),前面两个的缺点大家应该都是知道的是吧,对于select( 其实poll和他差不多 ),缺点是能同时连接的fd是在是不多,在linux中一般是1024/2048,对于很大的服务器来说是不够的.

Memcached的服务设计与启动过程——C10K系列

- - 行业应用 - ITeye博客
C10k要解决的问题,是10K个连接. LINUX下,使用EPOLL可实现异步非阻塞(注:阻塞的一定是同步的,阻塞是调用方自己阻塞自己(等待事件)). 非阻塞:是指调用方不会阻塞自己,如被调用方有数据就返回,无数据就返回EAGAIN,调用方根据EAGAIN决定自己的策略. 因此非阻塞,和异步没有任何关联.

从C10K问题来看常见的中小型服务器I/O模型

- - CSDN博客推荐文章
关于C10问题的经典描述可以查看这个网页  http://www.kegel.com/c10k.html. 具体来说就是服务器如何处理10k个客户端的并发连接,即 concurrent 10,000 connection . 如果在很早以前互联网还不普及的时候,一个服务器很少会同时出现有10k的连接,但是现在互联网高速发展,这种规模的连接可能随处可见,所以如何来解决C10k的问题对于服务提供者来说是一个最先需要解决的问题.

高性能网络编程5--IO复用与并发编程

- - CSDN博客云计算推荐文章
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接. 同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发. 服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽.

谈一谈网络编程学习经验(06-08更新)

- Leo - C++博客-首页原创精华区
PDF 版下载:https://github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf. 本文谈一谈我在学习网络编程方面的一些个人经验. “网络编程”这个术语的范围很广,本文指用Sockets API开发基于TCP/IP的网络应用程序,具体定义见“网络编程的各种任务角色”一节.