上一篇針對元件實作的簡單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/