测试报告:HTTP Post 与 Unix Domain Socket 通信性能对比

Posted by LB on Mon, May 28, 2018

背景描述

因工作需求,项目需要在不同的程序语言框架中进行通信,目前对于进程通信的方式,互联网上主要有HTTP请求、IPC通信、Socket通信、共享内存通信,虽然共享内存效率最高,但是对于内存结构的设计与队列维持需要很高的系统实现能力,所以目前我测试了HTTP与Unix Socket这两种通信方案。

测试环境搭建

目前分为HTTP和Unix Socket通信两种测试环境,为了保持测试环境尽量统一,我们请求端用PHP语言、接受信息端用Go语言。 测试软件使用 Jmeter 4.0 操作系统:Centos 7 硬件条件:I5 CPU、8GB内存

测试参数

1. HTTP请求性能测试

1.1 PHP端的请求代码:
 1<?php
 2global $g_handle;
 3if (empty($g_handle)) {
 4    $g_handle = curl_init();
 5
 6}
 7$options = array(
 8    CURLOPT_URL => $url,
 9    CURLOPT_RETURNTRANSFER => true,
10    CURLOPT_FRESH_CONNECT => false,
11    CURLOPT_FORBID_REUSE => false,
12    CURLOPT_POST => 1,
13    CURLOPT_TIMEOUT => $timeout,
14    CURLOPT_POSTFIELDS => "data=123",
15    CURLOPT_HTTPHEADER => array(
16        'Connection: Keep-Alive',
17        'Keep-Alive: 300'
18    ),
19
20);
21curl_setopt_array($g_handle, $options);
22$ret = curl_exec($g_handle);
23print $ret;
24?>
1.2 Go语言接受端代码:
 1package main
 2
 3import (
 4	"github.com/gin-gonic/gin"
 5)
 6
 7func main(){
 8	r := gin.Default()
 9	r.POST("/tcp", func(c *gin.Context) {
10		data:=c.PostForm("data");
11		c.JSON(200,gin.H{
12			"status":"ok",
13			"data":data,
14		})
15	})
16	r.Run() // listen and serve on 0.0.0.0:8080
17}
1.3 测试结果:
  • 聚合报告:
  • 图形结果:

2. UNIX SOCKET 请求性能测试

2.1 PHP端的请求代码:
 1<?php
 2$msg = time()."";
 3// 创建 连接 发送消息 接收响应 关闭连接
 4$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
 5socket_connect($socket, '/tmp/keyword_match.sock');
 6socket_send($socket, $msg, strlen($msg), 0);
 7$response = socket_read($socket, 1024);
 8//socket_close($socket);
 9
10var_dump($response);
11?>
1.2 Go语言接受端代码:
 1package main
 2
 3import (
 4	"net"
 5	"syscall"
 6	"time"
 7	"fmt"
 8)
 9
10func main(){
11	// 创建一个Unix domain soceket
12	socket, _ := net.Listen("unix", "/tmp/keyword_match.sock")
13	// 关闭时删除绑定的文件
14	defer syscall.Unlink("/tmp/keyword_match.sock")
15	// 无限循环监听和受理客户端请求
16	
17	for {
18		client, _ := socket.Accept()
19		buf := make([]byte, 1024)
20		data_len, _ := client.Read(buf)
21		data := buf[0:data_len]
22		_, _ = client.Write(data)
23	}
24}
2.3 测试结果:
  • 聚合报告:
  • 图形结果:

评测总结

总体来说,Unix Socket优于HTTP