【问题标题】:Why is the CPU not maxed out?为什么CPU没有被最大化?
【发布时间】:2014-04-09 10:37:23
【问题描述】:

我有一个想要提高效率的应用程序 - 它对任何资源的征税都不足以让我将其识别为瓶颈,因此该应用程序可能正在做一些妨碍完全效率的事情。

应用程序从一个 SQL Server 实例上的数据库中提取数据,对其进行一些操作,然后将其写入另一个 SQL Server 实例上的数据库 - 所有这些都在一台计算机上。它不会并行执行任何操作。

当应用程序运行时(可能需要几个小时),4 个 CPU 内核中没有一个内核被最大化(它们每个内核的利用率都徘徊在 40-60% 左右),磁盘几乎处于空闲状态,并且使用的 RAM 很少。

报告值:

Target SQL Server instance: ~10% CPU utilization, 1.3GB RAM
Source SQL Server instance: ~10% CPU utilization, 300MB RAM
Application: ~6% CPU utilization, 45MB RAM

所有工作都在一个磁盘上进行,在操作期间平均写入速度约为 100KB/s。根据任务管理器,“活动时间”通常为 0%,偶尔会在 1% 到 5% 之间闪烁一秒钟左右。平均响应时间,同样根据任务管理器,在 0ms 到 20ms 之间移动,主要表现在 0.5 到 2ms 之间。

【问题讨论】:

标签: sql-server io cpu performance


【解决方案1】:

数据库因 IO 限制而臭名昭著。现在,认真地说,正如你所说:

应用程序从一个 SQL Server 实例上的数据库中提取数据, 对其进行一些操作,然后将其写入另一个数据库 SQL Server 实例 - 全部在一台机器上。

我不知何故认为这是一个最终用户级别的机器,可能是一个工作站。您的线性代码(顺便说一句,获得充分利用是一个坏主意,因为您永远不会并行运行所有 3 个部分 - 读取、处理、写入)将受到您拥有的任何 IO 子系统的严重限制。

但只要你能说明,这不会发挥作用:

它不会并行执行任何操作。

它必须做的是并行做事:

  • 一个任务是读取下一个数据
  • 一项任务进行数据处理
  • 数据写入一个任务

你绝对可以比你的 4 核更多。上次我做类似的事情(读/操作/写)时,我们最大化了 48 个内核,大约 96 个并行运行的处理线程(并且执行写入的数量较少)。但其中的一个核心是您的应用程序实际上开始使用多个 CPU。

如果不并行化:

  • 您最多只能使用一个核心,
  • 你基本上浪费时间在两端等待数据库。您等待数据被读取或提交时的延迟是您未处理任何内容的延迟。

;) 一旦你解决了这个问题,你就会遇到 IO 问题。答应了。

【讨论】:

  • 谢谢。该处理实际上一次对数千个“记录”进行操作,因此使其并行执行某些工作的最简单(就应用程序设计而言)方法可能是并行处理一定数量的记录。这些记录没有顺序依赖关系,所以这应该是安全的。
  • 这 100% 像我们做的那样。一个线程做出选择语句,将每条记录推入处理队列,X 个线程进行处理,将输出馈送到写入器队列,Y 个写入器队列执行写入;)我们在大约 20 分钟内处理了大约 4 亿条记录。
【解决方案2】:

我推荐阅读How to analyse SQL Server performance。您需要捕获和分析等待统计信息。这些将告诉您执行是什么阻止了它在 CPU 上的最大消耗。您已经感觉到工作负载导致 SQL 引擎等待而不是运行,但只有在您了解等待统计信息之后,您才能感觉到什么在等待。按照链接的文章了解具体的分析技术。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多