在编写服务应用框架的时候一般都需要进行性能测试,但自己测试毕竟资源受限所以很难做更高性能上的测试。其实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的测试结果:
所有框架