Lwan高性能 Web 服務(wù)器
Lwan 是一個高性能和可伸縮的 Web 服務(wù)器軟件,支持 glibc/Linux 平臺。
Lwan 開發(fā)了將近 3 年時間,目前還是個人研究的成果。主要是為了構(gòu)建一個堅固、輕量級高性能的 Web 服務(wù)器。
特點(diǎn):
占用內(nèi)存低 (1萬個空閑連接只占用 ~500KiB)
最小化的內(nèi)存分配和拷貝
最小化的系統(tǒng)調(diào)用
精確的 HTTP 請求解析
使用最高效的方法來處理文件服務(wù)
大于 16k 的文件不需要進(jìn)行核心和用戶層的拷貝
更小的文件使用內(nèi)存映射緩沖向量 I/O 發(fā)送
處理壓縮小文件時考慮Header 開銷
大多數(shù)無等待、多線程設(shè)計
核心代碼只有 7200 行左右
性能:
在一臺使用 i7 處理器的筆記本上可以達(dá)到每秒 32 萬無磁盤訪問的 HTTP 請求。當(dāng)訪問磁盤,測試文件在 16Kb 時可達(dá)到每秒 29 萬個請求;而更大的文件可到每秒 18.5 萬請求。以上測試使用 keep-alive 連接,如果不使用 keep-alive 這個數(shù)字可能降低 6 倍左右。
下圖是不同并發(fā)連接數(shù)測試的每秒請求數(shù):
其中綠線是使用如下示例代碼的 Hello world 擴(kuò)展應(yīng)用,棕色線是 100 字節(jié)的文件。
此外 Lwan 也提供 API 擴(kuò)展,示例代碼:
#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;}評論
圖片
表情
