高效能 Web 伺服器 Lwan

edithfang發表於2014-10-14
Lwan 開發了將近 3 年時間,目前還是個人研究的成果。主要是為了構建一個堅固、輕量級高效能的 Web 伺服器。

特點:
  • 佔用記憶體低 (1萬個空閒連線只佔用 ~500KiB)
  • 最小化的記憶體分配和拷貝
  • 最小化的系統呼叫
  • 精確的 HTTP 請求解析
  • 使用最高效的方法來處理檔案服務
    • 大於 16k 的檔案不需要進行核心和使用者層的拷貝
    • 更小的檔案使用記憶體對映緩衝向量 I/O 傳送
    • 處理壓縮小檔案時考慮Header 開銷
  • 大多數無等待、多執行緒設計
  • 核心程式碼只有 7200 行左右
效能:

在一臺使用 i7 處理器的筆記本上可以達到每秒 32 萬無磁碟訪問的 HTTP 請求。當訪問磁碟,測試檔案在 16Kb 時可達到每秒 29 萬個請求;而更大的檔案可到每秒 18.5 萬請求。以上測試使用 keep-alive 連線,如果不使用 keep-alive 這個數字可能降低 6 倍左右。

下圖是不同併發連線數測試的每秒請求數:



其中綠線是使用如下示例程式碼的 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;}
相關閱讀
評論(1)

相關文章