【BeetleX重构】TLS和多数据类型性能测试

        上一篇针对组件实现的简单HTTP服务进行了一个压力测试,而这一篇主要针对的是HTTPS和不同序列化组件响应体中的性能测试。通过以上测试看一下组件在添加TLS后对性能的损耗和不同序列化组件在HTTP中使用的效果。

        这一次的测试逻辑和结构对比之前的相对复杂一些,方法会判断请求响应的类型和数量,具体逻辑代码如下:

public class HttpSession : SesionBase
{


    public override void Receive(NetContext context, object message)
    {


        var request = (HttpRequest)message;
        int count = 1;
        BodyType type = BodyType.Json;
        if (!string.IsNullOrEmpty(request.QueryString))
        {
            string[] values = request.QueryString.Split('=');
            if (values.Length == 1)
            {
                int.TryParse(values[0], out count);
            }
            else
            {
                Enum.TryParse<BodyType>(values[0], out type);
                int.TryParse(values[1], out count);
            }
        }
        HttpResponse response = new HttpResponse();
        UserProtos userProtos = new UserProtos();
        List<User> data = new List<User>();
        for (int i = 0; i < count; i++)
        {
            if (type != BodyType.Protobuf)
            {
                User item = new User();
                item.Name = $"Henry{i}";
                item.Time = DateTime.Now;
                item.Email = "henryfan@msn.com";
                item.City = "guangzhou";
                item.Age = i;
                data.Add(item);
            }
            else
            {
                UserProto item = new UserProto();
                item.Name = $"Henry{i}";
                item.Time = DateTime.Now.Ticks;
                item.Email = "henryfan@msn.com";
                item.City = "guangzhou";
                item.Age = i;
                userProtos.Items.Add(item);
            }
        }
        if (type == BodyType.Json)
        {
            response.SetJson(data);
        }
        else if (type == BodyType.Protobuf)
        {
            response.SetProtobuf(userProtos);
        }
        else if (type == BodyType.MessagePack)
        {
            response.SetMessagePack(data);
        }
        response.Write(context.Writer);
        context.Writer.Flush();
    }
}

在测试中发现Protobuf.Net这个组件在多线程高并发下组件存在严重性能问题,所以改用Google.Protobuf.net,但这个组件使用起来就没这么方便了。

测试环境
    服务器:A家云32核发计算型服务器 windows 2019
    压测端:  A家云32核发计算型服务器 ubuntu 18, 工具:wrk 

HTTP/HTTPS测试
        由于只测试两者间的开销差异,所以只测试了JSON返回,分别请求响应一个对象和20个对象;测试结果如下:

397ad5fce81b2494dcae677daa75ca60.png

da73be2ac56d97eec84f61b6cd0a2d79.png
从测试结果来看开启TLS的损耗还是比较大的,基本都在30%-40%的区间。由于是纯测试网络所以感觉损耗比较大,实际应用中网络通讯占比不高的情况这个损耗就并不太重要了,毕竟有很多数据业务存在很多数据库IO处理和运算逻辑。

响应对象测试
        这次测试响应对象类型有JSON,Protobuf和MessagePack,返回记录数分别是:1,20和50条。具体测试情况如下:

  • 1条记录

e28765c4a95e1183743b8a39a078a905.png

68e8e0d066809c16a91a34fe5482b3c0.png

  • 20条记录

99d86a3258bf0443134b816270c7f806.png

4ae064e2cfd8440efd829fb8ff38cf66.png

  • 50条记录

c41d9ae4b39bef8f08a5281de36636c6.png

86d75332f9421aaa817d8b431ca226e6.png
从结果来看Google.Protobuf.net组件基本是最优的选择了,效率高低带宽。如果只是交互小对象那System.Text.Json也是非常不错的选择,效率高协议可见使用方便。

后续重新更新techempower上的测试代码,这样更好验证BeetleX重构的效果是好是坏,毕竟现在测的硬件资源都比较充裕的;techempower的测试太久没更新已经排到20开外了。

以下是这次测试的服务端(暂没编译Linux端,如果有需要可以留言)

链接:https://pan.baidu.com/s/1WTjFpJ7ze28ih8hQ92BTbQ?pwd=okf9

提取码:okf9

BeetleX

开源跨平台通讯框架(支持TLS)

提供HTTP,Websocket,MQTT,Redis,RPC和服务网关开源组件

个人微信:henryfan128    QQ:28304340

关注公众号

a164bd9aa6cdaeb003181c9cd89ef0a0.jpeg

https://github.com/beetlex-io/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值