上一篇针对组件实现的简单HTTP服务进行了一个压力测试,而这一篇主要针对的是HTTPS和不同序列化组件响应体中的性能测试。通过以上测试看一下组件在添加TLS后对性能的损耗和不同
序列化组件在HTTP中使用的效果。
这一次的测试逻辑和结构对比之前的相对复杂一些,方法会判断请求响应的类型和数量,具体逻辑代码如下:
public classHttpSession : SesionBase
{
publicoverridevoidReceive(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 = "[email protected]";
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 = "[email protected]";
item.City = "guangzhou";
item.Age = i;
userProtos.Items.Add(item);
}
}
if (type == BodyType.Json)
{
response.SetJson(data);
}
elseif (type == BodyType.Protobuf)
{
response.SetProtobuf(userProtos);
}
elseif (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个对象;测试结果如下:
从测试结果来看开启TLS的损耗还是比较大的,基本都在30%-40%的区间。由于是纯测试网络所以感觉 损耗比较大,实际应用中网络通讯占比不高的情况这个损耗就并不太重要了,毕竟有很多数据业务存在很多数据库IO处理和运算逻辑。
响应对象测试
这次测试响应对象类型有JSON,Protobuf和MessagePack,返回记录数分别是:1,20和50条。具体测试情况如下:
1条记录
20条记录
50条记录
从结果来看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
关注公众号
https://github.com/beetlex-io/