其实原本是打算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. cursor的mcp服务器安装(nodejs,npx安装和uv工具安装)

    一.前言: 1.近期MCP服务器非常火爆,作为LLM大模型的通用工具手脚,MCP可以帮助LLM大模型实现更好的功能.本人经常使用cursor来进行代码的编辑,正巧cursor在0.47版本之后,MCP ...

  2. FastAPI中的依赖注入与数据库事务管理

    title: FastAPI中的依赖注入与数据库事务管理 date: 2025/04/09 00:10:29 updated: 2025/04/09 00:10:29 author: cmdragon ...

  3. Text Bg ContentSizeFitter的另类控制

    using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Co ...

  4. 基于transformer的机器翻译:手把手教你实现

    目录 前言 transformer模型的搭建 Input embedding Encoder Decoder output transformer构建 data数据集处理 train config 参 ...

  5. 揭秘AI自动化框架Browser-use(二),如何构造大模型提示词

    在上一篇技术分析中,我们探讨了Browser-use框架如何实现页面元素标注.本文将聚焦于其提示词构造流程,揭示AI如何理解浏览器界面的核心机制. 上一篇-揭秘AI自动化框架Browser-use(一 ...

  6. 36.7K star!拖拽构建AI流程,这个开源LLM应用框架绝了!

    36.7K star!拖拽构建AI流程,这个开源LLM应用框架绝了! 只需拖拽节点,5分钟搭建专属AI工作流! Flowise 是一款革命性的低代码LLM应用构建工具,开发者通过可视化拖拽界面,就能快 ...

  7. 设计即合规: 开放AI生态中的用户数据治理实践

    Hugging Face Hub 已成为 AI 协作的核心平台,托管了数万个模型.数据集以及交互式应用程序 (Space). 在开放生态系统中,用户知情同意的管理方式与那些更 "数据饥渴&q ...

  8. Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件

    ​ 1.简介 在我们使用JPA时,构建 Specification 查询条件时重复代码过多,而且需要大量的无效代码. 2.工具类提供的方法 2.1.自动构建规范 /** * 自动构建规范 * * @p ...

  9. tcpdump工具

    监视指定的网络接口/网卡 tcpdump -i eth100 通过网卡eth100监视主机的数据包 tcpdump -i eth100 host 190.160.35.11 截获本地发送到目标主机19 ...

  10. 用脚手架创建odoo15项目

    Odoo 提供了一种机制来帮助建立一个新模块,odoo-bin有一个子命令脚手架来创建一个空模块 命令: $ odoo-bin scaffold <module name> <whe ...