背景描述
因工作需求,项目需要在不同的程序语言框架中进行通信,目前对于进程通信的方式,互联网上主要有HTTP请求、IPC通信、Socket通信、共享内存通信,虽然共享内存效率最高,但是对于内存结构的设计与队列维持需要很高的系统实现能力,所以目前我测试了HTTP与Unix Socket这两种通信方案。
测试环境搭建
目前分为HTTP和Unix Socket通信两种测试环境,为了保持测试环境尽量统一,我们请求端用PHP语言、接受信息端用Go语言。
测试软件使用 Jmeter 4.0
操作系统:Centos 7
硬件条件:I5 CPU、8GB内存<!--more-->
测试参数
1. HTTP请求性能测试
1.1 PHP端的请求代码:
<?php
global $g_handle;
if (empty($g_handle)) {
$g_handle = curl_init();
}
$options = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FRESH_CONNECT => false,
CURLOPT_FORBID_REUSE => false,
CURLOPT_POST => 1,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_POSTFIELDS => "data=123",
CURLOPT_HTTPHEADER => array(
'Connection: Keep-Alive',
'Keep-Alive: 300'
),
);
curl_setopt_array($g_handle, $options);
$ret = curl_exec($g_handle);
print $ret;
?>
1.2 Go语言接受端代码:
package main
import (
"github.com/gin-gonic/gin"
)
func main(){
r := gin.Default()
r.POST("/tcp", func(c *gin.Context) {
data:=c.PostForm("data");
c.JSON(200,gin.H{
"status":"ok",
"data":data,
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
1.3 测试结果:
- 聚合报告:
- 图形结果:
2. UNIX SOCKET 请求性能测试
2.1 PHP端的请求代码:
<?php
$msg = time()."";
// 创建 连接 发送消息 接收响应 关闭连接
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, '/tmp/keyword_match.sock');
socket_send($socket, $msg, strlen($msg), 0);
$response = socket_read($socket, 1024);
//socket_close($socket);
var_dump($response);
?>
1.2 Go语言接受端代码:
package main
import (
"net"
"syscall"
"time"
"fmt"
)
func main(){
// 创建一个Unix domain soceket
socket, _ := net.Listen("unix", "/tmp/keyword_match.sock")
// 关闭时删除绑定的文件
defer syscall.Unlink("/tmp/keyword_match.sock")
// 无限循环监听和受理客户端请求
for {
client, _ := socket.Accept()
buf := make([]byte, 1024)
data_len, _ := client.Read(buf)
data := buf[0:data_len]
_, _ = client.Write(data)
}
}
2.3 测试结果:
- 聚合报告:
- 图形结果:
评测总结
总体来说,Unix Socket优于HTTP
评论已关闭