Ngx_lua與go高并發(fā)性能對(duì)比
Nginx在處理高并發(fā)能力上非常出色,而go作為新時(shí)代互聯(lián)網(wǎng)語言,在設(shè)計(jì)之初就為實(shí)現(xiàn)高并發(fā)。
ngx_lua由Nginx來處理網(wǎng)絡(luò)事件,并使用協(xié)程來實(shí)現(xiàn)非阻塞,從而實(shí)現(xiàn)高并發(fā)。 go語言級(jí)別提供非阻塞的api,同樣使用協(xié)程來提供高并發(fā)處理。
我們來測(cè)試對(duì)比一下兩者的性能。
ngx_lua:Tengine/1.4.3+luajit+ngx_lua go:go1.0.3
分別實(shí)現(xiàn)512字節(jié)的內(nèi)容的輸出,對(duì)比在不同并發(fā)下的qps。
測(cè)試機(jī)器:
16core Intel(R) Xeon(R) CPU E5520 @ 2.27GHz Linux localhost 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
使用ab進(jìn)行測(cè)試,測(cè)試結(jié)果如下:
從結(jié)果中,可以看出短連接時(shí),兩者qps相差不大,而長(zhǎng)連接時(shí),兩者相差較大。go的cpu占用比ngx_lua要高不少。另外,go在并發(fā)數(shù)增加的情況下,性能依然出色。
相關(guān)測(cè)試代碼。
lua代碼:
ngx.print("aaaaa...512...aaa")
go 代碼:
package main import ( "net/http" "log" "fmt" "runtime" ) func handler512(w http.ResponseWriter, r *http.Request) { w.Header().Set("Connection", "keep-alive") a := []byte("aaaaa...512...aaa") w.Header().Set("Content-Length", fmt.Sprintf("%d", len(a))) w.Write(a) } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) http.HandleFunc("/512b", handler512) log.Fatal(http.ListenAndServe(":8080", nil)) }