提出问题
作者从现代计算机硬件所能承受的带宽和计算速度来(注:十多年前的计算机)计算支持单个 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、TCP 数据发送的问题等等,除此之外一些系统或技术的限制我们也应该去了解,也就是说要充分发挥技术的优势,尽量避免技术的缺陷。
如何衡量性能
说了那么多高性能的实用技术,又如何评估呢?作者提供了两个指标:
每秒的连接数
尽可能多的传输大文件的 client 存在时 client 的传输速率
开源实现
最后是各种模型范式的开源实现,这些都是非常好的学习资料,几乎囊括了几乎现在所有的高性能服务的实现模型。
总结
当下的计算机硬件可以非常轻松的获得 c10k 的性能,拿 nginx 来举例 2核4g 的配置可以轻松获得数万的并发连接,当我们解决了 c10k 的问题之后,下一步应该向 c10m 迈进。
领取专属 10元无门槛券
私享最新 技术干货