C10K问题及常见的解决方案
瓶颈分析
文件句柄
linux系统默认支持的文件描述符大小是1024,可通过ulimit -n
查看.我的wsl中默认是1048576.
系统内存
通过如下shell代码,可查询一个socket连接对应的缓冲区大小,单位byte
xyf@Xiong-New:~$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
xyf@Xiong-New:~$ cat /proc/sys/net/ipv4/tcp_rmem
4096 131072 6291456
相当于
xyf@Xiong-New:~$ cat /proc/sys/net/ipv4/tcp_wmem
4KB 16KB 4MB
xyf@Xiong-New:~$ cat /proc/sys/net/ipv4/tcp_rmem
4KB 128KB 6MB
三个值分别代表最小分配值、默认分配值和最大分配值, 按默认分配值计算,10K个连接需要1.4GB内存.
网络带宽
假设 1 万个连接,每个连接每秒传输大约 1KB 的数据,那么带宽需要 10000 x 1KB/s x8 = 80Mbps.
要想解决 C10K 问题,就需要从两个层面上来统筹考虑。
- 第一个层面,应用程序如何和操作系统配合,感知 I/O 事件发生,并调度处理在上万个套接字上的 I/O 操作?前面讲过的阻塞 I/O、非阻塞 I/O 讨论的就是这方面的问题。
- 第二个层面,应用程序如何分配进程、线程资源来服务上万个连接?这在接下来会详细讨论。
阻塞io+多进程
来一个连接, 服务器主进程就创建一个子进程进行客户端连接的处理, 此方法开销非常大, 但实现起来比较简单.
do{
accept connections
fork for conneced connection fd
process_run(fd)
}while(true)
有没有知名的开源框架使用此方案?<