C# 什么可以使SQLServerDB表现出循环CPU使用行为?

C# 什么可以使SQLServerDB表现出循环CPU使用行为?,c#,.net,sql-server,msmq,cpu-usage,C#,.net,Sql Server,Msmq,Cpu Usage,我有一个系统正在处理来自MSMQ队列的消息(使用多个进程进行处理) 每个消息处理意味着读取一些行,并进行3次更新和1次插入。我用这个系统每秒处理大约60条消息 令我困惑的是,无论出于何种原因,当队列中有大量消息,并且系统正在以尽可能快的速度处理消息时,CPU使用率呈现出一个周期,峰值为95%-100%,低谷为50%-45%。即使我添加了更多的进程来进行处理,这种行为仍然有效 当工作负载意味着行插入和更新(我认为是缓存刷新等)时,是否期望SQL Server显示这种行为?也许这与主机有关(这是在H

我有一个系统正在处理来自MSMQ队列的消息(使用多个进程进行处理)

每个消息处理意味着读取一些行,并进行3次更新和1次插入。我用这个系统每秒处理大约60条消息

令我困惑的是,无论出于何种原因,当队列中有大量消息,并且系统正在以尽可能快的速度处理消息时,CPU使用率呈现出一个周期,峰值为95%-100%,低谷为50%-45%。即使我添加了更多的进程来进行处理,这种行为仍然有效

当工作负载意味着行插入和更新(我认为是缓存刷新等)时,是否期望SQL Server显示这种行为?也许这与主机有关(这是在Hyper-V上运行的,而不是在真正的硬件上)


这里有一个perfmon运行的链接:

检查其余部分-可能是您点击了acheckpoint,因此处理速度减慢,直到脏页被写入数据库?

这是一个示例,对于默认SQL Server实例,如何启动一些相关计数器的logman计数器跟踪,收集间隔为10秒:

@echo off
del %temp%\sql_perf*.blg
logman delete sql_perf
logman create counter sql_perf -f bin -si 10 -o %temp%\sql_perf.blg -c "\Processor(_Total)\*" "\Physical Disk(*)\*" "\Process(*)\*" "\SQLServer:Access Methods\*" "\SQLServer:Databases(*)\*" "\SQLServer:Memory Manager\*" "\SQLServer:SQL Statistics\*" "\SQLServer:Wait Statistics\*" "\SQLServer:Transactions\*"
logman start sql_perf
命名实例将计数器类别名称从“SQLServer:…”更改为“:”

上载的性能计数器缺少物理磁盘计数器,因此IO分析不完整,但有人认为突出的是%CPU使用率与SQL Server事务/秒和批处理/秒完全匹配:


请注意,红线(%CPU)与绿线(事务/秒)和蓝线(批次/秒)的形状完全一致。这表明峰值完全由应用程序行为驱动。简单地说,SQL Server在CPU(以及IO写读,紫色线)上的峰值仅仅是因为您的应用程序每隔3分钟左右就会出现一次请求峰值

我发现了这种奇怪行为的原因:缺乏记忆。当我添加“Memory:Page Reads/sec”计数器时,谷值与高页面错误时间一致


谢谢你的回答(现在这个问题看起来很傻,我会要求更多的内存:)。

收集
物理磁盘(*)\*
和所有
SQL Server:\*
性能计数器,将它们发布在这里,然后我们可以讨论。这是我第一次使用logman…我在创建报告时遇到问题(“至少有一个输入二进制日志文件包含少于两个数据样本”)。我想这是一个问题中的问题,不是吗?=)它是命名的SQL Server实例还是默认实例?这是我的第一个想法,但问题是,我看不到磁盘活动与峰值或谷值重合…可能我看错了计数器?我添加了跟踪。我不知道该搜索什么,但我确实看到了我描述的模式……Tx/sec和CPU使用率之间的相关性是我无法解释的。我的应用程序有8个工作进程,它们共享的唯一内容是MSMQ队列(它们从中获取工作)和更新的SQL Server实例。我处理了100条消息,处理了50条消息,每一条消息实际上都是一样的。为了拍摄这个快照,我让队列堆积起来,因此我的工作人员应该全速工作,但他们似乎没有使用所有的CPU。我将尝试添加其他计数器(我使用了您的cmdline,它们是否丢失?)。非常感谢你的帮助!也要查找MSMQ计数器,也要查找它们。很可能该模式是由传入的消息流驱动的,然后您必须分析消息源,可能它们有这种发送尖峰的模式。命令行确实有输入错误,计数器名为
PhysicalDisk
(无空格)。有关Windows计数器的正确拼写,请参阅有关SQL Server计数器的信息,请参阅有关MSMQ计数器的信息,请参阅我已排除了MSMQ消息流量,让消息累积。我还停止了消息生成器,没有看到CPU使用情况(但我在跟踪收集期间没有这样做,我将在下一次尝试中这样做)。