C10K-C10M进阶(高并发的真正理解)

文章探讨了TCP连接数受到的限制,如文件描述符、端口号和操作系统资源,并介绍了C10K问题,即如何处理大量并发连接。文中指出了同步阻塞I/O模型的局限性,提出了非阻塞IO、IO复用(如select、poll、epoll)等解决方案。文章还提到了C10M问题,并讨论了如何通过优化内核调度、数据包处理和内存管理来进一步提升性能。解决方案包括使用DPDK等技术减少内核干预,以及利用协程和非阻塞模型提高并发处理能力。

1、一台计算机可以连接的TCP受什么限制?
能打开文件描述符的限制。默认是1024,可以修改。
端口号的限制,65535,因为TCP头部16位的端口号,其中1024以上可以用。如果是客户端,最多可以打开6万多的文件。如果是服务器,还要乘以ip数量。
但是,最终TCP连接数量还是会收到内存、操作系统等限制,不过现在达到数十万应该没问题。

C10K问题
早期网站100人就很多了,后来web1.0时代,人变多了,但也只是简单下载html浏览网页。但是到2.0时代,用户几何增长,而且不仅仅是简单浏览,有复杂的交互。所以网站同一时间的并发TCP连接很可能已经过亿。最初的服务器都是基于进程/线程模型的(典型的就是apache多线程),新到来一个TCP连接,就需要分配1个进程(或者线程)。而进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是C10K就要创建1万个进程,那么单机而言操作系统是无法承受的。

特点: 性能和连接数及机器性能的关系往往是非线性的。它在 2 倍性能新服务器上往往处理不了并发 2倍的吞吐量。这是因为在策略不当时,大量操作的消耗和当前连接数 n 成线性相关。会导致单个任务的资源消耗和当前连接数的关系会是 O(n)
连接数越多,那么单个连接消耗的时间越长。

**本质:**操作系统的问题。同步阻塞I/O模型。创建的进程线程多了,数据拷贝频繁(磁盘文件-page cache-用户-内核socket缓冲区-网卡), 进程/线程上下文切换消耗大, 导致操作系统崩溃,榨干了CPU资源,这就是C10K问题的本质!
(线程切换和线程数量有关,因为要线性查找可以用的空闲线程,所以要epoll来使线程切换和线程数量无关)

解决方案: 非阻塞IO+IO复用机制
给每个连接分配一个进程,不现实的;
也就是等有数据到才分配线程去处理,避免无意义的上下文切换。

select使用fd_set,检查是否发生事件。缺点是fd_set大小限制,拷贝开销和逐个检查以及重复初

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值