Performance

.NET 内存性能优化实战:Span<T>、ArrayPool、GC 与 LOH 控制

很多服务在压测里吞吐不错,一上生产就抖。根因常常不是业务逻辑,而是内存分配模式不健康。 典型表现: GC 频率偏高 P99 周期性尖峰 单机吞吐不稳定 这篇文章重点讲“如何减少无意义分配”,并把优化控制在团队可维护范围内。 问题背景 真实现场:一次常规版本上线后,接口平均耗时变化不大,但 P99 从 120ms 拉到 380ms,最后定位到的是字符串拼接和临时数组在高峰时段触发了更频繁的 GC。 …

C# 异步编程实战:Task、ValueTask、线程池饥饿与背压设计

接口慢,不一定是数据库慢。很多系统在高峰期的核心问题,是异步链路写法导致线程池被慢慢耗空。 这类问题最麻烦的地方在于: CPU 不一定打满 错误日志不一定明显 本地压测可能复现不出来 这篇文章围绕一个目标展开:让异步代码在高并发下“稳态运行”,而不是“平时很快,高峰崩盘”。 1. 问题背景:为什么会出现线程池饥饿 常见触发方式: 在 ASP.NET Core 请求中使用 .Result / …

EF Core 写入链路实战:从 ChangeTracker 到 SQL Batch 的性能诊断与优化

这篇文章讨论一个问题:一次写入请求从实体变更到数据库落盘,中间到底发生了什么,哪里最容易慢,以及应该怎么定位。 问题背景 真实场景:订单系统在白天吞吐稳定,凌晨高峰出现周期性尖峰。接口平均耗时变化不大,但 P95 从 80ms 抬到 420ms,数据库 CPU 也出现波峰。 排查后发现: 应用层每次批量处理 2000 条数据 循环中频繁触发变更检测 每条数据都单独 SaveChanges 最终生成 …

EF Core 慢查询排查实战:TagWith、OpenTelemetry 与执行计划

EF Core 性能问题里,最折磨人的不是“慢”,而是“慢得没规律”,线上卡,测试又无法复现。 很多小D、小W同学都经历过这种现场: 压测数据很好看 数据库 CPU 没打满 业务代码看起来也没什么大问题 你改了几个 Include,可能短期有效,但过两周又抖回来。根因往往不是某一行 LINQ 写错,而是整条排查链路没打通。 这篇文章就做一件事:给你一套能线上落地的 EF Core 慢查询定位闭环, …

EF Core 查询性能实战:Include、投影与跟踪策略边界

很多团队把 EF Core 的性能问题归因于“ORM 天生慢”,但线上真实情况通常是: 查询写法对 SQL 形态不敏感 默认跟踪被滥用 图省事一次 Include 到底 结果是接口能跑,但高峰时段 P95 持续抬高,数据库 CPU 和网络带宽一起被拖上去。 这篇文章聚焦一个目标:把 EF Core 查询从“能查到数据”升级到“可预测、可解释、可优化”。 1. 问题背景:列表页为什么越改越慢 一个典 …

从 IApplicationBuilder 到 RequestDelegate:ASP.NET Core 请求管线性能与可观测性

很多团队做性能优化时,第一反应是改 SQL、加缓存、扩机器。结果接口还是慢,而且慢得不稳定。 这类问题里,有一部分根因并不在业务代码,而在请求进入业务之前就已经产生了: 中间件顺序、重复序列化、过重日志、异常处理位置不当,都会把每个请求的固定成本悄悄抬高。 这篇文章我们不讲抽象概念,直接从一个真实工程场景出发,拆开 ASP.NET Core 请求管线,回答三个问题: 请求管线到底是怎么执行的 哪些 …