其实原本是打算OpenTelemetry对应内容搞好后再做个简单的性能测试,也算表明自己写(抄)代码的能力(不至于用了反射什么的就把Kestrel这么好的底子的性能拖垮了)

但是最近看见一篇go的文章 报告揭示 OpenTelemetry 对 Go 的性能影响,说OpenTelemetry 拖慢了 go 30+% 的性能,

虽然个人还是保守持怀疑态度,但万一本人代码写得臭,到时候找不到地方怪怎么办

所以先留份简单的性能测试记录,后面搞好OpenTelemetry再做个比较

基准项目

一切从简,就选大家都熟悉的初始demo项目做基准好了

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
} [HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
this.Response.Headers["x-p"] = this.Request.Protocol;
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

代理配置

启动最简单的代理配置(主要想看看最理想情况下的结果)

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ServerOptions": {
"AddServerHeader": false
},
"ReverseProxy": {
"ConnectionTimeout": "00:00:01.000",
"Listen": {
"https": {
"Protocols": [ "Http1", "Http2", "Http3" ],
"Address": [ "127.0.0.1:5001" ],
"UseSni": true,
"SniId": "test"
},
"http": {
"Protocols": [ "Http1" ],
"Address": [ "127.0.0.1:5000" ]
},
"tcptest": {
"Protocols": [ "Tcp" ],
"Address": [ "127.0.0.1:5002" ],
"RouteId": "tcpTest"
}
},
"Sni": {
"test": {
"Host": [ "*" ],
"CheckCertificateRevocation": false,
"Certificate": {
"PEM": "-----BEGIN CERTIFICATE-----xxxxx\n-----END CERTIFICATE-----",
"PEMKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----\nxxxx\n-----END ENCRYPTED PRIVATE KEY-----",
"Password": "testPassword"
}
}
},
"Routes": {
"HTTPTEST": {
"Match": {
"Hosts": [ "*" ],
"Paths": [ "*" ]
},
"ClusterId": "apidemo",
"Timeout": "00:10:11"
},
"tcpTest": {
"ClusterId": "apidemo",
"Timeout": "00:10:11"
}
},
"Clusters": {
"apidemo": {
"HttpClientConfig": {
"DangerousAcceptAnyServerCertificate": true
},
"LoadBalancingPolicy": "RoundRobin",
"Destinations": [
{
"Address": "https://127.0.0.1:4001"
}
]
}
}
}
}
vkproxy -c D:\code\github\VKProxy\samples\CoreDemo\test.json

测试工具

这里会在本人电脑内测试理想情况,主要没有精力去搭建真实网络环境测试(贫穷的眼泪),哈哈

个人电脑情况:

Windows 11 (10.0.26100.4351)

Intel Core i7-10700 CPU 2.90GHz, 1 CPU, 16 logical and 8 physical cores

32G Memory

INTEL SSDPEKNW512GB

以前用过 ali 这个go写的测试工具,因为它会实时在命令行终端绘制性能测试图,在简单测试使用很方便,但可惜断更了,并且有个大bug没有修复:绘制的性能测试图错位了,非常影响观看,非常惋惜呀

所以这里找了个同样go写的工具 vegeta 主要看重它有命令可以生成图, 但可惜好像不支持 http3

测试命令

// 性能测试
.\vegeta.exe attack -insecure -rate=10000/s -duration=60s -format=http -targets=test -output=results -http2 // 汇总报告
.\vegeta.exe report .\results // 绘图
.\vegeta.exe plot .\results > plot.html

测试结果

基准 HTTP2 -> WeatherForecast api

.\vegeta.exe attack -insecure -rate=10000/s -duration=60s -format=http -targets=base -output=baseresults -http2
// base content:
// GET https://127.0.0.1:4001/WeatherForecast

汇总

Requests      [total, rate, throughput]         599930, 9998.35, 9998.35
Duration [total, attack, wait] 1m0s, 1m0s, 0s
Latencies [min, mean, 50, 90, 95, 99, max] 0s, 676.024µs, 0s, 2.56ms, 3.705ms, 5.367ms, 26.437ms
Bytes In [total, mean] 232052167, 386.80
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:599930
Error Set:

HTTP2 -> VKProxy(https) -> HTTP2 -> WeatherForecast api

.\vegeta.exe attack -insecure -rate=10000/s -duration=60s -format=http -targets=http2proxy -output=http2proxyresults -http2
// http2proxy content:
// GET https://127.0.0.1:5001/WeatherForecast

汇总

Requests      [total, rate, throughput]         599980, 9999.85, 9999.85
Duration [total, attack, wait] 59.999s, 59.999s, 0s
Latencies [min, mean, 50, 90, 95, 99, max] 0s, 2.199ms, 1.845ms, 5.162ms, 6.359ms, 9.217ms, 108.78ms
Bytes In [total, mean] 232078680, 386.81
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:599980
Error Set:

HTTP2 -> VKProxy(tcp) -> scoket -> WeatherForecast api

.\vegeta.exe attack -insecure -rate=10000/s -duration=60s -format=http -targets=tcpproxy -output=tcpproxyresults -http2
// tcpproxy content:
// GET https://127.0.0.1:5002/WeatherForecast

汇总

Requests      [total, rate, throughput]         599976, 9998.48, 9998.48
Duration [total, attack, wait] 1m0s, 1m0s, 0s
Latencies [min, mean, 50, 90, 95, 99, max] 0s, 1.809ms, 1.004ms, 4.736ms, 5.744ms, 8.995ms, 98.922ms
Bytes In [total, mean] 232069758, 386.80
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:599976
Error Set:

结果大致就是这样了,看起来个人写的代码也不至于太臭,至少理想情况下没有拖慢多少,

客官,你们怎么看?

VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理(感兴趣的同学烦请点个github小赞赞呢)

留个VKProxy性能测试记录的更多相关文章

  1. 性能测试记录: ZZ 只改5行代码获得10倍吞吐量提升

    首先得找台足够性能的机器来测试,性能不足时代码运行会出现各种奇怪的现象,导致浪费时间 文章: https://www.jianshu.com/p/4cd8596352ad   只改了5行代码吞吐量提升 ...

  2. 如何使用jmeter做一个功能的性能测试

    一.为什么又再次写类似的文章? 在博客园和公号写文章,已经快两年了,所以自然在公号和博客园都能联系到我的. 也就是几天前,有个人加我微信,对于总有人加我好友,我已经觉得不奇怪了,为什么呢? 加我好友的 ...

  3. Python Kafka Client 性能测试

    一.前言 由于工作原因使用到了 Kafka,而现有的代码并不能满足性能需求,所以需要开发高效读写 Kafka 的工具,本文是一个 Python Kafka Client 的性能测试记录,通过本次测试, ...

  4. SQL2000的三种“故障还原模型”

    一.SQL2000的三种“故障还原模型” 在数据库属性的“选项”页,“故障还原模型”栏,共有三项选择:简单.完全.大容量日志记录.它们的根本差别在于SQL2000对数据库日志的维护方式不同.下面逐个讲 ...

  5. EF code First数据迁移学习笔记(转)

    转自:http://www.cnblogs.com/icyJ/p/migration.html 准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-pa ...

  6. RichEdit 各个版本介绍

    RichEdit是开发中经常使用到的控件,其版本自1.0起,历经好几年,好几次的更新,在此引用一篇介绍RichEdit版本的博文(http://blogs.msdn.com/b/murrays/arc ...

  7. DP——由蒟蒻到神犇的进阶之路

    开始更新咯 DP专题[题目来源BZOJ] 一.树形DP 1.bzoj2286消耗战 题解:因为是树形结构,一个点与根节点不联通,删一条边即可, 于是我们就可以简化这棵树,把有用的信息建立一颗虚树,然后 ...

  8. PHP_D4_“简易聊天室 ”的具体技术实现

    上面已经介绍了系统的关键技术,下面对具体实现进行详解: 1.开发时,经常需要利用一个配置文件来存储系统的参数,例如:数据库连接信息等.这样可以提高系统的可移植性,当系统的配置发生变化时,例如:更改服务 ...

  9. Spring AOP选择切点的问题

    先上代码: /** * 管理员登录方法的切入点 */ @Pointcut("execution(* com.arch.shiro.realm.UserRealm.doGetAuthentic ...

  10. Alpha课堂展示(麻瓜制造者)

    目录 成员简介 演示动态图 预期用户量 演示动态图 目标用户视频 分工协作 项目管理 质量控制 团队角色与具体贡献 用户反馈 成员简介 刘双玉 http://www.cnblogs.com/liu42 ...

随机推荐

  1. 学习Kotlin语法(四)

    简介 在上一节,我们对Kotlin中函数的相关知识有了大致的了解,本章节我们将去了解一些Kotlin中的作用域函数. 目录 let:处理可空对象,链式操作 run:对象配置 + 计算返回值 with: ...

  2. KGDB调试Linux内核与模块

    前言 内核 5.10 版本 openEuler 使用 yum install 下载了源码,并且通过两个 VMware 虚拟机进行调试 ubuntu 直接使用 git 拉取了https://kernel ...

  3. Clion配置Fortran环境

    1.安装CLion 下载链接:https://www.jetbrains.com/ 下载好后安装到指定目录即可 2.安装Fortran插件 3.编写程序 1)打开CLion,新建一个Fortran项目 ...

  4. Git命令的全家福手册

    一.全局命令

  5. TortoiseGit安装(Windows10环境)

    1.前往官网下载 https://tortoisegit.org/download/ 根据自己系统位数进行选择 2.双击运行 3.默认即可,第一个是基于PuTTY的SSH客户端,与Windows兼容更 ...

  6. Robot Framework绝对路径转相对路径

    如上图,添加商品需要上传商品图片,如此,设计脚本时候会填入图片的路径,使自动化能够自动到目的路径内获取图片上传 C:\\Users\\Beckham\\Desktop\\test2\\autoTest ...

  7. AI Agent离我们有多远?认知革命的开始(上篇)

    认知是成本最低的对冲. --张三思维进化论 深夜3点,我与AI Agent的惊人对话 2025年的一个深夜,我习惯性地打开电脑处理一些工作.身为一个从大厂转型的自由职业者,夜晚往往是我效率最高的时段. ...

  8. 【记录】Python3|用百度语音 API 朗读你的小说TXT

    百度语音合成官方教程_AI开放平台 百度语音合成官方demo_github.com 简单地写了一个按段落朗读文本的demo:DEMO链接_gitee.com. 有时候会请求不到数据,不知道是网络原因还 ...

  9. 接口测试策略(一、概念&流程&范围)

    接口测试概要 接口测试概念 什么是接口测试? 维基百科对接口测试的定义如下: API testing is a type of software testing that involves testi ...

  10. 关于The JSON value could not be converted to System.DateTime的解决方案

    如下json格式提交到后台后报: The JSON value could not be converted to System.DateTime. Path: $.beginTime | LineN ...