自己動手,開發輕量級,高效能http伺服器。

2022-01-23 10:57:16 字數 4767 閱讀 3111

前言。對於此結果,一開始我也是不相信,經過多次反覆測試,事實卻是如此。此結果並不能說明我寫的伺服器優於asp.net core,只是說明乙個道理:合適的就是最好,高大上的東西並不是最好的。

1 http協議特點

http協議是基於tcp/ip之上的文字交換協議。對於開發者而言,也屬於socket通訊處理範疇。只是http協議是請求應答模式,一次請求處理完成,則立即斷開。http這種特點對sokcet通訊提出幾個要求:

a) 能迅速接受tcp連線請求。tcp是面向連線的,在建立連線時,需要三次握手。這就要求socket處理accept事件要迅速,要能短時間處理大量連線請求。

b) 服務端必須採用非同步通訊模式。對windows而言,底層通訊就要採取iocp,這樣才能應付成千上萬的socket請求。

c) 快速的處理讀取資料。tcp是流傳輸協議,而http傳輸的是文字協議;客戶端向服務端傳送的資料,服務端可能需要讀取多次,服務端需要快速判斷資料是否讀取完畢。

以上幾點只是處理http必須要考慮的問題,如果需要進一步優化,必須根據自身的業務特點來處理。

2 快速接受客戶端的連線請求

採用非同步accept接受客戶端請求。這樣的好處是:可以同時投遞多個連線請求。當有大量客戶端請求時,能快速建立連線。

非同步連線請求**如下:

public

bool

startaccept()

return

true

; }

可以設定同時投遞的個數,比如此值為10。當非同步連線投遞個數小於10時,立馬再次增加投遞。有乙個執行緒專門負責投遞。

_acceptasynccount記錄當前正在投遞的個數,maxacceptinpool表示同時投遞的個數;一旦_acceptasynccount小於maxacceptinpool,立即增加一次投遞。

private

void

dealnewaccept()

}catch

(exception ex)

}

3 快速分析從客戶端收到的資料比如客戶端傳送1m資料到服務端,服務端收到1m資料,需要讀取的次數是不確定的。怎麼樣才能知道資料是否讀取完?

這個細節處理不好,會嚴重影響伺服器的效能。畢竟伺服器要對大量這樣的資料進行分析。

http包頭舉例

分析讀取資料,常規、直觀的處理方式如下:1) 將收到的多個buffer合併成乙個buffer。如果讀取10次才完成,則需要合併9次。

2) 將buffer資料轉成文字。

3) 找到文字中的http包頭結束標識("\r\n\r\n") 。

4) 找到content-length,根據此值判斷是否接收完成。

採用上述處理方法,將嚴重影響處理效能。必須另闢蹊徑,採用更優化的處理方法。

優化後的處理思路

1)多緩衝處理

基本思路是:收到所有的buffer之前,不進行buffer合併。將緩衝存放在listlistbuffer中。通過遍歷listbuffer來查詢http包頭結束標識,來判斷是否接收完成。

類buffermanage負責管理buffer。

public

class

buffermanage

public

bool findbuffer(byte destbuffer, out

intindex)

else

if (flagindex >=destbuffer.length)}}

return

false

; }

public

inttotalbytelength

return

count;}}

public

byte

getallbyte()

public

byte getsubbuffer(int start, int

counttotal)

//複製資料

int dataleft = buffer.length -indexofitem;

int dataneed = counttotal -countcopyed;

if (dataneed >=dataleft)

else

if (countcopyed >=counttotal)

}throw

new exception("

沒有足夠的資料!");

//return result;

} }

類httpreadparse借助buffermanage類,實現對http文字的解析。

4 效能測試採用模擬客戶端持續傳送http請求測試,每個http請求包含兩個。一次http請求大概傳送70k資料。服務端解析資料後,立即傳送應答。

注:所有測試都在本機,客戶端無法模擬大量http請求,只能做簡單壓力測試。

1)本人所寫的伺服器,測試結果如下

每秒可傳送300次請求,每秒傳送資料25m,伺服器cpu占有率為4%。

2)asp.net core 伺服器效能測試

每秒傳送30次請求,伺服器cpu占有率為12%。

測試對比:本人開發的服務端處理速度為asp.net core的10倍,cpu占用為對方的三分之一。asp.net core處理慢,有可能實現了更多的功能;只是這些隱藏的功能,對我們也沒用。

後記: 如果沒有開發經驗,沒有清晰的處理思路,開發乙個高效的http伺服器還有很困難的。本人也一直以來都是採用asp.net core作為http伺服器。因為工作中需要高效的http伺服器,就嘗試寫乙個。不可否認,asp.net core各方面肯定優化的很好;但是,asp.net core 提供的某些功能是多餘的。如果化繁為簡,根據業務特點開發,效能未必不能更優。

CentOS高效能輕量級虛擬機器安裝及配置(KVM)

通過yum安裝 yum install kvm kmod kvm qemu kvm qemu img virt viewer virt manager libvirt libvirt python python virtinst檢視例項 virsh list all啟動例項 virsh start ...

騰訊正式開源高效能超輕量級 PHP 框架 Biny

biny是一款高效能的超輕量級php框架 遵循 mvc 模式,用於快速開發現代 web 應用程式 biny 簡潔優雅,對應用層,資料層,模板渲染層的封裝簡單易懂,能夠快速上手使用 高效能,框架響應時間在1ms以內,單機qps輕鬆上3000 支援跨庫連表,條件復合篩選,查詢pk快取等 同步非同步請求分...

輕量級HTTP伺服器Nginx(安裝篇)

root localhost home tar zxvf pcre 8.02.tar.gz root localhost home cd pcre 8.02 root localhost pcre 8.02 configure root localhost pcre 8.02 make root l...