每秒处理32万请求的高性能Web服务器:Lwan

jopen 10年前

Lwan 是一个高性能和可伸缩的 Web 服务器软件,支持 glibc/Linux 平台。

Lwan 开发了将近 3 年时间,目前还是个人研究的成果。主要是为了构建一个坚固、轻量级高性能的 Web 服务器。

  • 占用内存低 (1万个空闲连接只占用 ~500KiB)

  • 最小化的内存分配和拷贝

  • 最小化的系统调用

  • 精确的 HTTP 请求解析

  • Static file serving uses the most efficient way according to file size
    • No copies between kernel and userland for files larger than 16KiB
    • Smaller files are sent using vectored I/O
    • Header overhead is considered before considering deflate compression
  • Mostly wait-free multi-threaded design
    • One thread accepts connections, one I/O thread per logical CPU handles them
    • Hand-crafted coroutines makes asynchronous I/O a breeze in C
    • Linux only, as it relies on epoll()
    • Purpose-built I/O loop
  • Efficient loading cache used for
    • Directory listing
    • File information (size, last modified date, MIME type, etc)
    • Compressed files
  • 核心只有 7200 行左右C语言代码

性能:

在一台使用 i7 处理器的笔记本上可以达到每秒 32 万无磁盘访问的 HTTP 请求。当访问磁盘,测试文件在 16Kb 时可达到每秒 29 万个请求;而更大的文件可到每秒 18.5 万请求。以上测试使用 keep-alive 连接,如果不使用 keep-alive 这个数字可能降低 6 倍左右。

下图是不同并发连接数测试的每秒请求数:

每秒处理32万请求的高性能Web服务器:Lwan

其中绿线是使用如下示例代码的 Hello world 扩展应用,棕色线是 100 字节的文件。

此外 Lwan 也提供 API 扩展,示例代码:

#include "lwan.h"static lwan_http_status_thello_world(lwan_request_t *request,              lwan_response_t *response, void *data){      static const char message[] = "Hello, World!";         response->mime_type = "text/plain";      strbuf_set_static(response->buffer, message, sizeof(message) - 1);         return HTTP_OK;}intmain(void){      const lwan_url_map_t default_map[] = {          { .prefix = "/", .callback = hello_world },          { .prefix = NULL }      };      lwan_t l;         lwan_init(&l);      lwan_set_url_map(&l, default_map);      lwan_main_loop(&l);      lwan_shutdown(&l);         return 0;}

项目主页:http://www.open-open.com/lib/view/home/1413163132968