2024年6月12日发(作者:)

元素控制台源代码网络性能内存应用程序安全性能评测

一,C10K问题

随着互联网的蓬勃发展,尤其是2000年前后,互联网人数井喷,C10K问题也就应

运而生,即,如何在一台物理机上同时服务10000个用户(Concurrent 10 * 1000)。

二,操作系统层面

C10K问题要求在一台主机上至少同时支持1万个连接,需要文件句柄,系统内存,

网络带宽达到什么程度呢?

1,文件句柄:每个客户连接,代表一个文件描述符,一旦文件描述符不够用时,新

的连接就会被放弃,报错“Socket/File: Can’t open too many files”。虽然在默认情

况下,单进程打开的文件句柄数是有限制的(ulimit -n -> 1024),但可以通过修改

/etc/文件的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,这在现在标配的万兆网卡上,也不是问题;

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,所有连接相互隔

离。实现简单,效率不高,资源利用率高。