kHTTPd,一个基于内核的 Web 服务器
Web 服务器已成为当今商业、贸易、娱乐和信息基础设施的重要组成部分。一些网站每天甚至每小时都会受到数百万次的访问。计算机科学研究人员很快开始思考如何使 Web 服务器更快、更高效和更安全,这只是自然而然的事情。
对更高速度的追求引发了操作系统理论研究的一个全新领域,即执行路径分析。本文作者在攻读博士学位期间,深入研究了这一主题,并研究了 Apache 服务器。最有趣的发现之一是,对于静态页面,超过 80% 的指令实际上是在内核空间(保护模式)中执行的。这有一些严重的含义。
首先,正如我们在前三列中学到的,像 Apache 这样的用户程序进入内核空间的唯一方法是执行系统调用。系统调用很昂贵,因为它们涉及复杂的检查和搜索许多内核表。
此外,从用户空间切换回来通常会刷新处理器上的 TLB(转换后备缓冲区)缓存以及一级和二级缓存条目。
因此,Linux 内核开发人员意识到需要一个基于内核的 Web 服务器。这种内核空间的 Web 服务器不会产生在保护模式之间来回切换所涉及的成本。
正是这样一个内核空间的 Web 服务器,名为 kHTTPd,在 Linux 内核版本 2.3.x 和 2.4 中实现。kHTTPd 与其他内核 Web 服务器的不同之处在于,它作为模块(设备驱动程序)在 Linux 内核中运行。
kHTTPd 仅处理静态(基于文件)的网页,并将所有非静态信息的请求传递给常规的用户空间 Web 服务器,例如 Apache 或 Zeus。静态网页虽然服务起来不复杂,但仍然非常重要。这是因为几乎所有图像都是静态的,很大一部分 HTML 页面也是如此。“常规”Web 服务器对于静态页面增加的价值很小;它只是一个“复制文件到网络”的操作。Linux 内核非常擅长这一点;例如,NFS(网络文件系统)守护程序也在内核中运行。
在内核中“加速”服务静态页面的简单情况,使用户空间守护程序可以自由地做他们非常擅长的事情:生成用户特定的动态内容。像 Apache 这样的用户空间 Web 服务器,通常加载了许多功能和许多执行路径,不可能像 kHTTPd 那样快。然而,也有一些 Web 服务器像 kHTTPd 一样简单,但在用户空间中实现,因此即使与 kHTTPd 相比,它们也不是处理器周期的昂贵消费者。
kHTTPd 非常简单;它无法处理动态内容。因此,它将所有针对您通过名为“dynamic”的 sysctl 配置的目录的请求代理到功能齐全的用户空间 Web 服务器,例如 Apache。但这是一个全局性的胜利,因为常见 Web 服务器的大部分传输都是图像,这些图像肯定是静态的。
实际上,kHTTPd 在原理上与普通的 http 守护程序没有太大区别。主要区别在于它绕过了 syscall 层。通常,一个 http 服务器包含如下代码
socket(..) bind(..) listen(..) accept(..)
并且每个调用都必须进入内核,查找作为传递的参数函数的内核结构,将信息返回到用户空间等等。
作为内核守护程序本身,kHTTPd 直接与涉及的内部内核结构和系统调用接口,从而完全避免了用户-内核交互。此外,由于它是内核守护程序,因此避免了 switch_mm 和 TLB 刷新。最后但并非最不重要的一点,它避免了所有进入/退出内核的开销。
kHTTPd 的数据结构不多。它们位于 net/kHTTPd/structure.h 中。
第一个是每个连接的结构。第二个是每个 kHTTPd 线程的结构,通过该结构可以对许多 http_requests 进行排队。
列表 1. /proc/sys/net/khttpd/structure.h
kHTTPd 可以编译为可加载模块,也可以静态链接到内核中。静态链接到内核将提供更好的性能,因为它将被分配到更高效且 TLB 持久的页表映射中。
kHTTPD 的控制通过 /proc 文件系统在 /proc/sys/net/khttpd 下执行。表 1 显示了可以设置的 sysctl 参数,以及每个参数的描述(来自文档)。
电子邮件:mbar@cmp.com
Moshe Bar (mbar@cmp.com) 是一位以色列系统管理员和操作系统研究员,他于 1981 年开始在配备 AT&T Unix Release 6 的 PDP-11 上学习 UNIX。他拥有计算机科学硕士学位。请访问 Moshe 的网站:http://www.moelabs.com/。