元素控制台源代码网络性能内存应用程序安全性能评测
一,C10K问题
随着互联网的蓬勃发展,尤其是2000年前后,互联网人数井喷,C10K问题也就应运而生,即,如何在一台物理机上同时服务10000个用户(Concurrent 10 * 1000)。
二,操作系统层面
C10K问题要求在一台主机上至少同时支持1万个连接,需要文件句柄,系统内存,网络带宽达到什么程度呢?
1,文件句柄:每个客户连接,代表一个文件描述符,一旦文件描述符不够用时,新的连接就会被放弃,报错“Socket/File: Can’t open too many files”。虽然在默认情况下,单进程打开的文件句柄数是有限制的(ulimit -n -> 1024),但可以通过修改/f文件的file-max,ip_conntrack_max等参数为10000,使单进程能打开的文件描述符超过10000;
2,系统内存:每个TCP连接,除了占有一个文件描述符外,还需要占用一定的发送缓冲区和
接收缓冲区的内存,可以使用/proc/sys/net/ipv4/tcp_wmem和tcp_rmem来查看(最小分配值(4k/4k),默认分配值(16k/87k)和最大分配值(4m/6m)),按默认分配值计算,合并上应用层也需要一个收发数据的业务层buffer(比如:20k),则C10K要求单服务器至少需要(16+87+20)k*10000=1.23G的内存,这在现代计算机上也不是大问题;
3,网络带宽:假设1万个连接,每个连接上每秒传输10k的数据,带宽需要10k*8bit/k*1000=800Mbps,这在现在标配的万兆网卡上,也不是问题;4k电影源代码
4,系统结论:虽然在2000年左右,C10K问题在系统资源上,可能也有瓶颈,但在现在而言是可以解决的,因此,C10K的瓶颈自然就落到了程序设计层面。
三,程序设计层面
网路编程中,涉及到频繁的用户态和内核态的数据拷贝,一旦设计不好,在高并发下,性能很容易出现指数级下降,因此,在程序设计上,需要考虑2方面的问题:
1,应用程序如何和操作系统配合,感知IO事件发生,调度处理上万个socket上的IO操作?这在前面已有详细描述。即,阻塞IO,非阻塞IO,IO多路复用讨论的IO模型就是解决这方面
的问题;
2,应用程序如何分配进程和线程资源,使其可以服务上万个连接?下面详细讨论。
四,C10K解决方案
任何一个网络程序,均包含read:从套接字读,decode:从网络流解码,compute:业务逻辑,encode:编码成网络流,send:通过套接字发送,共计5步,有以下5种编程模型来尝试解决C10K问题。
1,阻塞IO+进程
每个连接fork一个子进程处理,由子进程处理该连接上的所有IO,所有连接相互隔离。实现简单,效率不高,资源利用率高。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。