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

@李彪  May 28, 2018

背景描述

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

评论已关闭