没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Linux性能优化实战 首页
|
35 | 基础篇:C10K 和 C1000K 回顾
2019-02-11 倪朋飞
讲述:冯永吉
时长 16:37 大小 15.23M
你好,我是倪朋飞。
前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux
网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输
层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解
耦了网络协议的复杂性。
基于 TCP/IP 模型,我们还梳理了 Linux 网络收发流程和相应的性能指标。在应用程序通
过套接字接口发送或者接收网络包时,这些网络包都要经过协议栈的逐层处理。我们通常
用带宽、吞吐、延迟、PPS 等来衡量网络性能。
今天,我们主要来回顾下经典的 C10K 和 C1000K 问题,以更好理解 Linux 网络的工作原
理,并进一步分析,如何做到单机支持 C10M。
最新一手资源
更新通知
加微信
sucl2015
资料整理不易 仅供个人学习 请勿倒卖
注意,C10K 和 C1000K 的首字母 C 是 Client 的缩写。C10K 就是单机同时处理 1 万个请
求(并发连接 1 万)的问题,而 C1000K 也就是单机支持处理 100 万个请求(并发连接
100 万)的问题。
C10K
C10K 问题最早由 Dan Kegel 在 1999 年提出。那时的服务器还只是 32 位系统,运行着
Linux 2.2 版本(后来又升级到了 2.4 和 2.6,而 2.6 才支持 x86_64),只配置了很少的
内存(2GB)和千兆网卡。
怎么在这样的系统中支持并发 1 万的请求呢?
从资源上来说,对 2GB 内存和千兆网卡的服务器来说,同时处理 10000 个请求,只要每
个请求处理占用不到 200KB(2GB/10000)的内存和 100Kbit (1000Mbit/10000)的
网络带宽就可以。所以,物理资源是足够的,接下来自然是软件的问题,特别是网络的
I/O 模型问题。
说到 I/O 的模型,我在文件系统的原理中,曾经介绍过文件 I/O,其实网络 I/O 模型也类
似。在 C10K 以前,Linux 中网络处理都用同步阻塞的方式,也就是每个请求都分配一个
进程或者线程。请求数只有 100 个时,这种方式自然没问题,但增加到 10000 个请求
时,10000 个进程或线程的调度、上下文切换乃至它们占用的内存,都会成为瓶颈。
既然每个请求分配一个线程的方式不合适,那么,为了支持 10000 个并发请求,这里就有
两个问题需要我们解决。
第一,怎样在一个线程内处理多个请求,也就是要在一个线程内响应多个网络 I/O。以前
的同步阻塞方式下,一个线程只能处理一个请求,到这里不再适用,是不是可以用非阻塞
I/O 或者异步 I/O 来处理多个网络请求呢?
第二,怎么更节省资源地处理客户请求,也就是要用更少的线程来服务这些请求。是不是
可以继续用原来的 100 个或者更少的线程,来服务现在的 10000 个请求呢?
当然,事实上,现在 C10K 的问题早就解决了,在继续学习下面的内容前,你可以先自己
思考一下这两个问题。结合前面学过的内容,你是不是已经有了解决思路呢?
I/O 模型优化
异步、非阻塞 I/O 的解决思路,你应该听说过,其实就是我们在网络编程中经常用到的
I/O 多路复用(I/O Multiplexing)。I/O 多路复用是什么意思呢?
别急,详细了解前,我先来讲两种 I/O 事件通知的方式:水平触发和边缘触发,它们常用
在套接字接口的文件描述符中。
接下来,我们再回过头来看 I/O 多路复用的方法。这里其实有很多实现方法,我带你来逐
个分析一下。
第一种,使用非阻塞 I/O 和水平触发通知,比如使用 select 或者 poll。
根据刚才水平触发的原理,select 和 poll 需要从文件描述符列表中,找出哪些可以执行
I/O ,然后进行真正的网络 I/O 读写。由于 I/O 是非阻塞的,一个线程中就可以同时监控
一批套接字的文件描述符,这样就达到了单线程处理多请求的目的。
所以,这种方式的最大优点,是对应用程序比较友好,它的 API 非常简单。
但是,应用软件使用 select 和 poll 时,需要对这些文件描述符列表进行轮询,这样,请
求数多的时候就会比较耗时。并且,select 和 poll 还有一些其他的限制。
select 使用固定长度的位相量,表示文件描述符的集合,因此会有最大描述符数量的限
制。比如,在 32 位系统中,默认限制是 1024。并且,在 select 内部,检查套接字状态
是用轮询的方法,再加上应用软件使用时的轮询,就变成了一个 O(n^2) 的关系。
而 poll 改进了 select 的表示方法,换成了一个没有固定长度的数组,这样就没有了最大
描述符数量的限制(当然还会受到系统文件描述符限制)。但应用程序在使用 poll 时,同
样需要对文件描述符列表进行轮询,这样,处理耗时跟描述符数量就是 O(N) 的关系。
水平触发:只要文件描述符可以非阻塞地执行 I/O ,就会触发通知。也就是说,应用程
序可以随时检查文件描述符的状态,然后再根据状态,进行 I/O 操作。
边缘触发:只有在文件描述符的状态发生改变(也就是 I/O 请求达到)时,才发送一次
通知。这时候,应用程序需要尽可能多地执行 I/O,直到无法继续读写,才可以停止。
如果 I/O 没执行完,或者因为某种原因没来得及处理,那么这次通知也就丢失了。
最新一手资源
更新通知
加微信
sucl2015
资料整理不易 仅供个人学习 请勿倒卖
剩余16页未读,继续阅读
资源评论
zh222333
- 粉丝: 22
- 资源: 296
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功