最近刚好要使用Golang的RPC,因此对Golang标准库的RPC进行了一下测试,看看其性能到底如何。RPC服务端和客户端的实现完全使用RPC的net/rpc
标准库,没有经过特殊的优化,主要针对下面三个场景进行测试。测试之前需要先说明一下,Go的rpc连接是支持并发请求的,就是说一个一个连接可以并发的发送很多个请求,不像http协议一问一答的模式。
测试环境
操作系统:Centos 6.8 (Linux 2.6.32)
内存:32G
核数:双CPU, 一共12核
CPU型号:Intel(R) Xeon(R) CPU E5645 @ 2.40GHz
Golang: 1.7.4
场景
测试的场景主要是下面两个指标
* QPS指标
* 单个个连接保证一个并发,随着该并发请求数增加,QPS的变化
* 单个连接(Client), 单个并发请求10w, 随着并发数的增加,QPS的变化
* 单个连接并发数固定(第一个测试的最优值),增加连接数,QPS的变化
- 单机Server的并发数(同时连接数)
- 单机Server, 测试所能接收的连接数
QPS指标测试中,第一个设置是为了测试单个连接的并发数
实现
Server端的实现使用tcp协议,监听4200端口,循环等待连接,每当检测到请求时,启动一个goroutine去处理该连接,注册的服务执行一个简单的乘法操作。
//Service
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args Args, reply *int) error {
*reply = args.A * args.B