谁是最快的Go Web框架

标签: Go | 发表时间:2016-04-06 06:14 | 作者:
出处:http://colobu.com/

前几天我写了一篇文章: 超全的Go Http路由框架性能比较,利用Julien Schmidt实现的 benchmark测试框架对几乎所有的go web框架的路由功能进行了比较。我本来以为对Go web框架的性能考察就告以段落了,直到我写了一段简单的代码测试Irsi,用来模拟实际产品中的处理,才发现了Julien Schmidt测试框架的问题。

这段代码是这样的:

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     
package main
import (
"fmt"
"os"
"strconv"
"time"
"github.com/kataras/iris"
)
func main() {
api := iris.New()
api.Get("/rest/hello", func(c *iris.Context) {
sleepTime, _ := strconv.Atoi(os.Args[1])
if sleepTime > 0 {
time.Sleep(time.Duration(sleepTime) * time.Millisecond)
}
c.Text("Hello world")
})
api.Listen(":8080")
}

当我将实际业务的处理时间模拟为10毫秒的时候,使用100并发进行测试:
wrk -t16 -c100 -d30s http://127.0.0.1:8080/rest/hello,Iris吞吐率才达到97 requests/second。详细介绍可以看我的文章: iris 真的是最快的Golang 路由框架吗?

虽然Iris的作者很快做了修改,临时解决了这个问题,但是也促使我重新审视Julien Schmidt测试框架,也促使我实现了一个测试Go web framework benchmak的框架: Go web framework benchmark

重新审视Julien Schmidt测试框架

如果查看Julien Schmidt测试框架的测试结果以及实现,可以看到他测试的只是web框架的 路由功能,包括路径中参数的解析, 并不是测试一个完整的web框架的处理(接受连接、路由、Handler处理)。

他利用Go的benchmark测试框架的方法,实现了N多的Benchmark方法,通过手工创建一个http.Request,传递给router进行路由处理。

并且,他的Handler的业务非常的简单,有的handler里面没有任何业务逻辑,只是空的方法体,有的只是将参数写回到Response中。这并不能反映实际的产品的业务处理。

在实际的业务中,Handler必然要包含一定的业务处理,也出处理的时间可能从几毫秒到上百毫秒不等,一些业务逻辑处理起来还非常的慢,比如:

  • 从一个网络连接中读取数据
  • 写数据到硬盘中
  • 访问数据库
  • 访问缓存服务器
  • 调用其它服务,等待服务结果的返回
  • ……

如果加上这些业务逻辑的处理时间,各个web框架benchmark是否还如路由功能的benchmark一样呢?

因为路由的处理时间在整个web框架中的处理时间所占的比例比较小,所以实际的web框架的benchmark有可能和路由的benchmark关系不大。即使路由的性能最好,如果handler的处理没有很好的处理的化,也可能整体的性能也不会特别出色。

如果想实现一个高性能的路由器,一定要尽量避免在路由处理时分配新的对象,高性能的路由器都实现了零分配,如httprouter、Iris等。

很多web框架的Handler处理和Go的缺省实现一样,还是在连接所在的goroutine中执行,也有的框架实现了goroutine池,由一个goroutine池来处理连接和handler,避免太多的goroutine分配和回收,性能可能会好一些。

实现一个Go web framework benchmark库

所以,有必要实现一个新的测试框架(库),完整测试web框架的性能,包括连接、路由、handler处理等,基于此,我实现了 Go web framework benchmark

它具有下面的功能:

  1. 为每个web框架实现了/hello的Http Get服务,它返回 hello world字符串。所有的web框架的实现都是一致的。
  2. 可以指定业务处理的时间,如10毫秒,100毫秒,500毫秒等
  3. 自动化测试

这个框架并没有测试其它功能,如Post、Put,也没有测试路由的参数解析的功能,它的本意是期望通过Get方法的测试来比较各个框架对业务的处理的能力。

根据Julien Schmidt测试框架中测试到的go web框架,在加上lion,fasthttp,一共测试了下面的web框架。
default http
macaron
go-json-rest
beego
pat
lion
httptreemux
go-restful
gin
martini
lars
bone
gocraft
gorilla
httprouter
iris
tango
vulcan
possum
denco
traffic
ace
go-tigertonic
fasthttp
r2router
goji
gojiv2
echo

基本测试

首先我们先看一些业务逻辑处理时间分别为0ms,10ms,100ms,500ms时的各web框架的表现。

测试的并发数为5000。

     
1
     
wrk -t16 -c5000 -d30s http://127.0.0.1:8080/hello

注解:

  1. possum在测试的时候出现N多的 http: multiple response.WriteHeader calls错误,它的性能比较低下。以下的测试possum也有问题。
  2. 默认的go标准库的实现性能已经很高
  3. 处理时间10ms和100ms, 各框架的性能差别不是特别巨大,但是500ms吞吐率下降的很厉害。
  4. fasthttp表现非常好

目前我并没有监控latency和cpu, memory指标,或许以后会加入。

并发量测试

我们以业务逻辑处理时间为30ms为基准,测试并发量为100,1000,5000的情况下web框架的性能。

注解:

  1. 大部分的框架的性能差不太多
  2. fasthttp表现还是非常好,是性能最好的框架,尤其在并发量大的情况下
  3. 并发量在1000的时候大部分的框架的吞吐率能达到3万/秒,并发量在5000的时候大部分二代框架能达到4万/秒

综上测试,大部分的go web框架性能表现还可以,加上处理时间的测试后性能差别不是很大,不像测试路由功能一样泾渭分明。
fasthttp表现非常的,需要考虑的是如果选他做web框架,你的代码将难以迁移到别的框架上,因为它实现了和标准库不一样的接口。

转载请注明文章来源:

相关 [快的 go web] 推荐:

谁是最快的Go Web框架

- - 鸟窝
前几天我写了一篇文章: 超全的Go Http路由框架性能比较,利用Julien Schmidt实现的 benchmark测试框架对几乎所有的go web框架的路由功能进行了比较. 我本来以为对Go web框架的性能考察就告以段落了,直到我写了一段简单的代码测试Irsi,用来模拟实际产品中的处理,才发现了Julien Schmidt测试框架的问题.

采访:关于 Go 语言和《Go Web编程》

- - 开源中国社区最新新闻
最近,在网上出现了一本名为《Go Web编程》的书籍,里面详细地讲述了使用Go语言进行Web编程的各个方面. 很特别的是,这本书是在GitHub上以开源的方式撰写的. 日前,InfoQ采访了这本书的作者谢孟军先生,请他来和大家谈谈Go语言以及他撰写的开源书籍. InfoQ:请您先简单和大家介绍一下自己.

go语言编写Web程序

- - 博客园_首页
创建一个数据类型,含有load和save函数. 基于http包创建web程序. 基于template包的html模板技术. 使用regexp包验证用户输入. web程序的基础技术(HTTP, HTML). 首先,要有一个Linux, OS X, or FreeBSD系统,可以运行go程序. 如果没有的话,可以安装一个虚拟机(如VirtualBox)或者 Virtual Private Server.

Go 和 Python Web 服务器性能对比

- Ken - python.cn(jobs, news)
我通常使用 Python 来构建 Web 应用. 一年前,在兴趣的驱使下,我开始学习 Go. 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同 thttpd 服务器一起的应用. 我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具.

docker - 从安装到部署一个web应用(go、java) - CSDN博客

- -
1.权限是root,不是则先提升权限. 下载docker最新版二进制tar.gz. linux下: wget https://get.docker.com/builds/Darwin/x86_64/docker-1.11.0.tgz. docker官方镜像仓库由于有墙,所以下载的很慢. 如此一来,tomcat就启动了,-p 5000:8080的意思是把容器tomcat的8080端口隐射到宿主机的端口上,这样外网访问5000就能访问到我们的container1的8080 tomcat上面了..

Go和HTTPS

- - Tony Bai
近期在构思一个产品,考虑到安全性的原因,可能需要使用到 HTTPS协议以及双向数字证书校验. 之前只是粗浅接触过HTTP( 使用Golang开 发微信系列). 对HTTPS的了解则始于那次 自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解.

Valve宣布CS: GO

- 小D - Solidot
此前媒体曾报告说Valv邀请CSS玩家和社区代表访问其总部,现在谜团已经解开:Valv宣布了团队射击游戏Counter-Strike: Global Offensive,它将在2012年初登陆Steam(PC和Mac)、PS3和Xbox360. CS: GO将是12年前发布的CS的真正扩展,而不是类似CS:Source的引擎更新,它提供了新的地图、角色、武器,经典CS地图(如de_dust),新的游戏模式,配对比赛和排名榜等.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

Go 1.1 的性能提升

- - 博客 - 伯乐在线
伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译. 如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们. 这是Go1.1发布后性能提升分析系列的第一篇文章. Go官方文档( 这里和 这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升.

《学习Go语言》0.4 中文版

- way - python.cn(jobs, news)
鱼哥(https://twitter.com/#!/smallfishxy)上个月勒令我要完成 0.4 版的翻译. 之前公司重组的时候,没顾上看英文版本的更新,结果这老外不声不响的做了如此之多的改动……. 于是只好人工 diff,一条一条的对比 commit 内容. 总算是跟进到了 0.4 这个 tag.