Nginx在处理高并发能力上非常出色,而go作为新时代互联网语言,在设计之初就为实现高并发。
ngx_lua由Nginx来处理网络事件,并使用协程来实现非阻塞,从而实现高并发。 go语言级别提供非阻塞的api,同样使用协程来提供高并发处理。
我们来测试对比一下两者的性能。
ngx_lua:Tengine/1.4.3+luajit+ngx_lua
go:go1.0.3
- 1.
- 2.
分别实现512字节的内容的输出,对比在不同并发下的qps。
测试机器:
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
- 1.
- 2.
使用ab进行测试,测试结果如下:
从结果中,可以看出短连接时,两者qps相差不大,而长连接时,两者相差较大。go的cpu占用比ngx_lua要高不少。另外,go在并发数增加的情况下,性能依然出色。
相关测试代码。
lua代码:
ngx.print("aaaaa...512...aaa")
- 1.
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))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.