这个问题困扰了我一段时间,我似乎在网上找不到任何关于它的内容。我有一台运行 VMware Hypervisor ESXi 的服务器。当我在其上启动虚拟机时,它们通常需要 2-3 分钟才能启动;时间不是很长,但不是瞬间完成的。但是,当我查看服务器上的性能日志时,处理器、RAM 或磁盘使用率都没有达到 100%;通常它们的平均使用率约为 60%-80% 那么如果服务器有工作要做,为什么不以 100% 的速度完成呢?
在我看来,在任何给定时刻,限制性能的组件都应以 100% 运行。例如,如果我的硬盘驱动器非常慢,那么它应该几乎总是以 100% 运行。因此,除非服务器完全处于空闲状态,否则至少一个区域(处理器、RAM、磁盘和网络)应始终处于 100% 状态。
为什么事实并非如此?
答案1
延迟是其中一个原因。“磁盘在我能做其他事情之前提供我需要的数据”和数据返回之间的延迟将使 CPU 在这段时间内处于空闲状态。
资源可能确实以 100% 运行,但持续时间很短。操作系统启动将遵循“处理或决定某事、从磁盘获取某事、在内存中执行某事、使用设备执行某事”的一般模式,每秒重复多次。因此,当您看到磁盘在 2 秒内以 25% 运行时,这可能意味着它在 0.5 秒内以 100% 运行,然后在其余时间处于空闲状态。
正如 EEAA 指出的那样,多核系统使这一过程变得更加复杂。CPU 上可以执行四个线程的单线程软件在全速运行时只能达到 25%。即使是多线程软件也很少能达到 100%,因为数据必须(通常)从硬盘流到 RAM、缓存、CPU。保持该管道满载很困难,而且往往主要发生在视频编码等可预测的工作负载中。在这种情况下,操作系统可以观察读取模式并在需要之前检索数据,将其放入适当的缓存中,例如 RAM 中的磁盘缓存。
答案2
你以一种非常简单的方式思考这个问题,这导致你做出一些错误的假设,我会尝试澄清这些假设。
首先,也是最简单的,在多核系统上,为了了解 CPU 使用率,您必须考虑进程负载是否是多线程的,以及是否旨在利用多个内核。如果不是这种情况,根据正在运行的进程组合,您可能永远不会看到 100% 的使用率。永远都不会。
其次,您需要考虑 IO 设备性能。例如,您的系统如何知道您的设备能够执行多少 IOps?它不知道。您需要关注的更有意义的指标是iowait
启动期间的值(在启动过程中可能很难获得)或启动期间的磁盘队列/延迟(应该更容易从虚拟机管理程序中获得)。如果您看到队列或延迟峰值,则您的 IO 设备可能是导致性能问题的一个因素。
答案3
我已经使用服务器大约 20 年了,当一个组件一直以 100% 运行时,通常不是一件好事。
例如,假设您有一个 SQL 数据库,您不想将其交换到磁盘,而是希望它完全耗尽内存。
如果您的数据库是 24GB 而操作系统需要 8GB,那么您就不会只想为机器分配 32GB 的 RAM,因为有很多“事情”可能出错,错误的代码、DDOS、应用程序使用率过高,谁知道呢,如果没有任何空间,您怎么知道服务器有麻烦了?
我们的数据中心有大约 2000 台服务器,我们希望看到它们都以大约 75% 的 CPU 和 RAM 运行,硬盘空间在我们的 SAN 上,所以这是完全不同的情况。我们还会发出警报,当它们的 CPU 或 RAM 达到 85% 时通知我们,并发出警报,当它们的 CPU 或 RAM 达到 90% 时通知我们。