背景描述
因工作需求,项目需要在不同的程序语言框架中进行通信,目前对于进程通信的方式,互联网上主要有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