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大小限制,拷贝开销和逐个检查以及重复初

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

被折叠的 条评论
为什么被折叠?



