Joh*_*Bzz 7 c# asp.net cpu-usage kubernetes
我正在尝试查找我的应用程序 CPU 使用率高的原因。
我相对简单的 .Net6 API 应用程序消耗 100% 的 1vCPU,每秒仅执行约 20 个请求(每个约 100 毫秒)(仅 2 个并发请求)。dotnet-trace显示不确定的瓶颈。
.Net6、ASP API 应用程序。应用程序在 kubernetes 集群上的 docker 容器中运行。它采用.Net6,并且具有专用的 1000m CPU(意味着 1 个完整的 vCPU)。
为了满足请求,应用程序调用数据库两次或三次,并调用外部 API 几次。该应用程序没有任何繁重的计算(没有图像处理,没有巨大的列表等)。刚刚等待DB调用和API调用,一些JSON序列化,HttpClient调用等。
问题是,1 个具有专用 1000m CPU(1 个 vCPU)的 pod 每秒处理大约 200 个请求,每个请求大约 100 毫秒,这意味着它只能同时处理大约 2 个请求。这样的负载几乎消耗了 100% 的专用 CPU,并且会创建新的 Pod。
IMO,由于大部分工作是“等待数据库或 API 返回数据”,我的服务器(每个 Pod)应该处理大约 10 倍的负载。
我dotnet-trace在我的容器中运行,但我无法真正理解数据。我的代码消耗的 CPU 总量不到 5%。以下功能消耗了大部分:
ad 1. ~21% CPU System.Reflection.Emit.DynamicMethod.CreateDelegate- 这可能意味着什么?使用以下提示是否意味着 NewtonsoftJson 每次序列化某些内容时都会编译代码?
ad 2. ~13% CPU `System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath' - 这是否意味着我的程序不断加载一些程序集?暗示:

ad 3. ~11% 的 CPU System.Threading.LowLevelLifoSemaphore.WaitForSignal- 信号量的使用成本如此昂贵吗?我这样使用它:
private readonly SemaphoreSlim _mySemaphore = new SemaphoreSlim(1);
(...)
await _mySemaphore.WaitAsync();
(...)
finally
{
_mySemaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)