在編寫服務應用框架的時候一般都需要進行性能測試,但自己測試畢竟資源受限所以很難做更高性能上的測試。其實GitHub上有一個項目可以讓開發人員提交自己的框架服務代碼然后進行一個標准測試;現在已經有上百個框架提交了相關測試代碼,包括netty(java),aspcore(.netcore)和swoole(php)等等(對.net core來說有些少,暫只有ms提供的aspcore-kestrel和本人的beetlex,其實.net core下的通訊框架不少有興趣的朋友可以提交上去)。官網會每隔一段時間公布測試框架排名,接下來介紹測試的要求和如何提交框架測試。
測試描述
框架測試基於HTTP 1.1,所以需要服務框架基礎上實現一個簡單的HTTP服務,這個服務要求並不需要完全整的HTTP服務,只需要滿足測試用例需求即可。完整測試用例用6個,分別是Plaintext,JSON serialization,Single query,Multiple queries,Data updates和Fortunes.每個測試都會進行測試排名,可以針對自己的框架選擇性來進行測試,如只實現Plaintext也是可以加入測試的。每個測試用例的具體要求如下:
https://www.techempower.com/benchmarks/#section=code
測試對代碼沒有嚴格的要求,所以很多框架會提供多個測試版本的代碼,包括完整功能和精簡功能。精簡功能則更多用於測試用在實際應用開發過程中會實現比較麻煩。
提交測試代碼
首先要有一個GitHub帳號,如果沒有就自行注冊一個;然后Fork項目https://github.com/TechEmpower/FrameworkBenchmarks
Fork后就可以添加自己服務的測試代碼,frameworks目錄下有不同的語言目錄,在你框架對應的語言的目錄下創建對應測試框架的目錄具體如下:

然后在相應目錄下添加框架測試代碼即可,當所有測試內容添加完成后提交相關PR即可,如果CI構建通過后techempower技術人員會合並到測試的Master分支中(可以針對自己的情況只實現個別用例進行測試)。
構建docker文件
測試服務部署是以docker的方式進行,所以需要描述相關測試程序所運行的docker描述。以下是針對Beetlex的描述
- BeetleX webapi
FROM microsoft/dotnet:2.2-sdk AS build WORKDIR /app COPY Benchmarks . RUN dotnet publish -c Release -o out FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime ENV COMPlus_ReadyToRun 0 WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["dotnet", "Benchmarks.dll"]
- BeetleX core
FROM microsoft/dotnet:2.2-sdk AS build WORKDIR /app COPY PlatformBenchmarks . RUN dotnet publish -c Release -o out FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime ENV COMPlus_ReadyToRun 0 WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["dotnet", "PlatformBenchmarks.dll"]
每個框架都可以針對不同的測試用例制定不同的測試環境,每個環境的測試結果都會反映到測試報告中。更詳細的運行描述環境可以參考相應語言下相關測試的描述文件。
構建測試描述文件
除了描述docker文件外,還需要描述benchmark_config.json測試文件,這個文件是告訴techempower需要測試那些內容和一些測試描述.BeetleX描述如下
{
"framework": "beetlex",
"tests": [
{
"default": {
"fortune_url": "/fortunes",
"plaintext_url": "/plaintext",
"json_url": "/json",
"db_url": "/db",
"query_url": "/queries?queries=",
"port": 8080,
"approach": "Realistic",
"classification": "Fullstack",
"database": "Postgres",
"framework": "beetlex",
"language": "C#",
"orm": "Raw",
"platform": ".NET",
"flavor": "CoreCLR",
"webserver": "beetlex",
"os": "Linux",
"database_os": "Linux",
"display_name": "beetlex webapi",
"notes": "",
"versus": "beetlex"
},
"core": {
"fortune_url": "/fortunes",
"plaintext_url": "/plaintext",
"json_url": "/json",
"db_url": "/db",
"query_url": "/queries?queries=",
"port": 8080,
"approach": "Realistic",
"classification": "Platform",
"database": "Postgres",
"framework": "beetlex",
"language": "C#",
"orm": "Raw",
"platform": ".NET",
"flavor": "CoreCLR",
"webserver": "beetlex",
"os": "Linux",
"database_os": "Linux",
"display_name": "beetlex core",
"notes": "",
"versus": "beetlex-core"
}
}
]
}
測試優化
官網的測試公告需要很久才能發布長則幾個月不等,所以不能等這個結果公布后才優化;開始並不知道,BeetleX第一交提交后就沒進行優化等結果(所以BeetleX在最近一次公布並沒有理想的結果)。其實techempower會不停地構造和測試,每次大概4-5天。你可以針對這些測試結果不停地進行優化調整和提交。可以通過https://tfb-status.techempower.com/ 查看詳細測試情況。
BeetleX的測試情況
Beetlex也提供兩個測試代碼分別BeetleX作為一個完整的webapi對應aspcore mvc api,而beetleX-core則作為一個精簡版對應aspcore。可以測試平台並不提供測試的完整日志,最基礎的Plaintext測試一直無法完成。不過在其他測試用例BeetleX測試表現還比較理想;綜合來說涉及到數據庫查詢的綜合測試中.net core平的表現都不算理想,希望.net core 3.0在性能上有着更大的提升。
以下是2019-08-01針對.net core的測試結果:

所有框架

