C10K问题及常见的解决方案

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)

有没有知名的开源框架使用此方案?<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值