10. C10k 问题
C10k (http://www.kegel.com/c10k.html) 问题是一台主机同时支持 10k 并发连接,此文虽然成文于十多年前,但是对理解 linux 中 Web Server 的发展和设计有非常大的帮助,而且作者(Dan Kegel)提供了一系列的文章和资料可供研读,借助本文我们一起看看作者分析 Web Server 问题的思路。
- 提出问题
作者从现代计算机硬件所能承受的带宽和计算速度来(注:十多年前的计算机)计算支持单个 client 所需要的内存和带宽以及计算周期,从而得出当时的计算机承载 10k 个连接并不是多大的问题,于是作者一步步提出了解决方案。
- 基础知识准备
在理解作者所要讲解的问题之前,作者提供了一本书供读者参考--Unix Network Programming : Networking Apis: Sockets and Xti (Volume 1)
,只有对 socket、IO 模型、线程等操作系统技术有所理解才能更好的理解作者提出的问题。
- 借力开源 IO framework
作者列举和介绍了一些著名的 IO framework,借助这些 IO framework 开发者可以比较容易实现各种夸平台的高性能的 Web Server,作者的意图也很明显:不要重复发明轮子,程序员要善于借力。
- 各种 IO 编程范式在各个平台的实现
作者分析了各种 IO 策略在各个平台的实现以及它们的优缺点,其中包括:
- 使用非阻塞 IO 单线程 level-trigger 模型
- 使用非阻塞 IO 单线程 edge-trigger 模型
- 单线程异步 IO 模型
- 多线程模型
有了这些分析,读者几乎可以说对这些模型的优缺点有了大体的掌握和理解。
- 特定问题特定分析
总是有些问题需要额外关注,作者列举了 linux 的打开文件的问题,Java 的 IO 模型实现问题,这些问题在设计和实现 Web Server 时都需要特别关注。
- 技巧和限制
作者列举在实现高性能的的同时有些技巧需要我们去留意,比如 zero-copy、内存映射技术、无锁编程等等,除此之外一些系统或技术的限制我们也应该去了解,也就是说要充分发挥技术的优势,尽量避免技术的缺陷。
- 如何衡量性能
说了那么多高性能的实用技术,又如何评估呢?作者提供了两个指标:
- 每秒的连接数
尽可能多的传输大文件的 client 存在时 client 的传输速率
开源实现
最后是各种模型范式的开源实现,这些都是非常好的学习资料,几乎囊括了几乎现在所有的高性能服务的实现模型。