1. 程式人生 > >讓techempower幫你通訊服務框架的效能

讓techempower幫你通訊服務框架的效能

在編寫服務應用框架的時候一般都需要進行效能測試,但自己測試畢竟資源受限所以很難做更高效能上的測試。其實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 updatesFortunes.每個測試都會進行測試排名,可以針對自己的框架選擇性來進行測試,如只實現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的測試結果:

所有框架

 

&n