普通程序员也要懂 C10K 吧

题图:by globe_visuals from Instagram

做性能调优的、做运维的、设计架构的工程师,大部分对 C10K 都很了解,何况现在早已不是单机 C10K 的问题了,而是 C100K 或 C1000K。不过平时做业务逻辑和前端交互的工程师可能还不清楚这是个什么东东。

今天简单说说 C10K 的问题,其实是个引子,你们都知道,关于这样的问题,极客时间迟早会做个课嘛。

在做技术规划和架构设计的时候,我们常说,不要做过度设计,如果只有1万用户,先别去操百万用户的心。淘宝那么大,也是从 LAMP 发展起来的,没人能预见到淘宝会发展到这样一个规模,一旦发展起来,业务的爆发性增长会驱动技术的迅速发展,在业务规模还不及格的时候,不要为技术的未来担心。

这个思路在业务领域不会有太大的问题,因为需求的变化实在是太快了,需要时时去应对和迭代。但在底层技术的发展上,我们就有可能遭到「短视」的报复,比如:这个数据长度不会超过16位吧,这个程序不可能用到 2000 年吧。于是就有了千年虫的问题,也有了 C10K 的问题。

为什么会这样呢?因为计算机的上古单机时代,少有程序员高瞻远瞩的预测到互联网时代的来临,也不会想到一台服务器会创建那么多的进程,即使在互联网初期,一台服务器能有100个在线用户已经是了不得的事情。甚至,他们在设计 Unix 的 PID 的时候,采用了有符号的16位整数,这就导致一台计算机上能够创建出来的进程无法超过 32767 个,计算机自己也得运行一些后台进程,这样应用软件进程数就更少了能够创建的。

这个问题随着技术的发展很快就解决了,现在大部分的个人电脑操作系统可以创建 64 位进程,由于数据类型所带来的进程数上限消失了,但是我们依然不能无限制的创建进程,因为随着并发连接数的上升会占用系统大量的内存,同样会造成系统的不可用。

为了解决这个问题,程序员们发明了虚拟内存(Virtual Memory)。虚拟内存技术支持程序访问比物理内存大得多的内存空间,也使得多个程序共享内存更加高效。物理内存由 RAM 芯片提供,虚拟内存则依靠透明的使用磁盘空间,使程序运行起来好像有了更大的内存空间。

但是问题依然存在,进程和线程的创建都需要消耗一定的内存,每创建一个栈空间,都会产生内存开销,当内存使用超过物理内存的时候,一部分数据就会持久化到磁盘上,随之而来的就是性能的大幅度下降。这道理就像银行挤兑,无论是多么良性的资产,遇到挤兑一样玩完。

为什么现代互联网出现了这么大的连接需求呢?因为业务驱动和技术发展嘛。除了普通的网页浏览和表单提交,即时通信和实时互动交流越来越成为主流需求,keep-alive 技术也能让浏览器产生长连接,实时在线的客户端越来越多,如果不能解决 C10K 问题,将导致服务商需要购买大量的服务器,而每一台服务器都不能做到物尽其用,即使你有了更好的 CPU 和更大的内存。

当然,现在我们早已经突破了 C10K 这个瓶颈,具体的思路就是通过单个进程或线程服务于多个客户端请求,通过异步编程和事件触发机制替换轮训,IO 采用非阻塞的方式,减少不必要的性能损耗,等等。

底层的相关技术包括 epoll、kqueue、libevent 等,应用层面的解决方案包括 OpenResty、Golang、Node.js 等,比如 OpenResty 的介绍中是这么说的:

OpenResty 通过汇聚各种设计精良的 Nginx 模块,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 C10K 乃至 C1000K 以上单机并发连接的高性能 Web 应用系统。

这些都依赖于谁呢,OpenResty 不是说了嘛:Nginx。所以我们上线了一个 Nginx 的视频课程。学习不能停:)

Nginx 天生就适合在 Linux 服务器上处理百万、千万级的并发连接,而优秀的架构使得它少有重构,生态圈内的第三方模块得以具备长久的生命力,而这些模块又进一步赋能 Nginx,使 Nginx 适用于更多的场景,甚至渗透到 LVS 的领域与 F5 这样的硬件产品竞争。OpenResty 或者 Tengine 这样的第三方模块群,进一步发展出了新生态,使 Nginx 的应用开始向应用防火墙、CDN 等领域扩展。

Nginx 并不是个小众的技术,无论是大公司还是创业公司都在广泛使用,不过,大部分开发者都是会用,而不是善用。就好比你有一把屠龙刀,却拿它来砍柴。打个比方,高并发导致多个请求过来,有些开发者会用最繁杂的程序来配置转发,却不知其中还有更轻便更有技巧性的设置。这种情况的发生,时常会让自己开发效率极低,且显得笨拙。

于是我们邀请了《深入理解 Nginx:模块开发与架构解析》一书的作者陶辉来讲解 Nginx。视频课程共100讲,作者会结合他多年的 Nginx 研发经验,从 HTTP 应用层的视角、分布式集群的视角、硬件及操作系统内核优化的视角为大家解读 Nginx 的核心知识。内容涉及 Nginx 的常用知识点、常用模块和源代码知识,在 Nginx 的设计方法论下从请求的处理流程中为大家解读,帮助大家从 Nginx 的初级使用者成长为高阶使用者。

这次的是视频课程一共 100 讲,原价129元,恰逢双十一临近,促销价格压到了68元,持续十天。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181105B1E53U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券