在本系列中,我们将讨论Linux性能衡量以及如何正确衡量。Linux性能是一个非常广泛的话题,因此我们将重点关注通常可以提高系统性能的四种主要资源——CPU、内存、磁盘存储和网络。现在说到组件相关的性能,很多场景只需要你提高CPU配额就可以解决问题。但也许这不是您想做的,您想知道真正导致它的原因以及如何解决它。您至少需要了解特定资源的资源利用率来自何处,因为这是您可以更改应用程序工作负载的方式。排队和并发现在,我认为,了解资源的另一件重要事情是了解当您拥有CPU资源时,它们具有某种我们可以用来执行工作负载的自然并发性。因此,例如,如果您查看您的CPU,它可能有多个或多或少并行执行的频率CPU内核。但是,如果CPU中有更多任务,则可以将它们排队。如果你有旋转磁盘,它一次只能处理一个I/O请求。您的RAID卷或SSD可以同时执行更多操作。但是它们都具有某种并发性,它们执行得很好,然后就会发生排队。排队有什么不好?排队会增加执行时间(延迟),而延迟是最终用户体验性能的方式。如果您想了解有关该方法的更多信息,不仅适用于Linux,还适用于其他系统,我建议您查看此USE方法-Utilization、Saturation和Errors。LoadAverage让我们从Linux中常见的一些典型错误开始。我认为我们最常见的误解之一是平均负载。在很多情况下,我看到人们在读取平均负载,也许对其进行一些监控,然后说“哦,这是一个神奇的数字——如果平均负载大于5,那就不好了”。我认为这是一个问题。例如,服务器的平均负载相当高,在40到60之间,但我可以看出服务器有80个CPU内核,这并不多。关于这个服务器负载,你能告诉我什么?虽然平均负载可用于深入了解您的系统,但许多人并不真正理解它并将其视为一个神奇的数字。我们看到平均负载有什么问题?一是它确实混合了I/O和CPU使用率。您可能有非常繁重的I/O工作负载和非常繁重的CPU工作负载。它们可能都有很高的平均负载,所以你真的不知道那是什么。它不是真正标准化的。正如我所提到的,您可以创建一个只有一个CPU内核的VM,或者我们的生产系统有100个CPU内核,两者之间存在两个数量级的差异。真的,这意味着他们不能使用他们自己的“神奇数字”,我们可以在十年前或更早的时候使用,当时所有服务器都有一个、两个或四个CPU内核。在这些情况下,服务的平均负载为20是异常的。它不是标准化的,并且还有很多计算工件,尤其是在Linux中。如果您对这些计算工件感兴趣,请查看BrandonGregg的博客。他做了所有伟大的工作,LinuxLoadAverage是他写的最后一件事。现在,我至少可以做的是将I/O负载与CPU负载分开。这基本上是相同的平均负载,但分布均匀,在这种情况下,我可以看到,如果我将CPU负载标准化,它实际上非常低,没有等待任务,但I/O不断波动。PSI查看CPU或/和其他一些资源利用率的更好方法是PSI。这是一个新工具。它是新内核的一部分,可能并非在所有Linux发行版上都可用,因此,出于实际目的,我认为它会在几年内有用。它使我们能够从延迟的角度真正了解给定任务阻塞了什么,是由于空闲CPU运行队列、等待磁盘I/O还是由于内存压力而阻塞。它为我们提供了有关性能及其对最终用户的影响的重要信息,而不是专注于人们通常想做的“神奇数字”。要了解更多信息,您可以阅读此博客。eBPF你现在可以做的是使用eBPF,这对于监控来说是一件很棒的事情。您可以通过多种方式消费和使用该信息,例如,有一个Cloudflare导出器,您可以在其中将此信息提供给Prometheus进行监控。这是BCC工具集合中的一个命令行工具,您可以在其中实际查看运行队列延迟,或者在CPU上安排任务之前需要多少时间。如果应用程序几乎立即得到调度,则意味着有可用的CPU,并且无论您使用哪种CPU使用率图表,等待时间都不会太长。如果实际上等待的时间很长,说明你的节目已经很久没有排上了。在这种情况下,好处是他们处理了一些复杂情况,只是CPU使用率没有显示出来。例如,LinuxCPU调度程序极其复杂,尤其是在NUMA环境中。因此,无论执行什么逻辑,如果调度时间过长,都会对用户程序造成影响。您无法在CPU利用率图表中看到它,但您会在循环队列延迟信息中看到它。现在,这是另一个错误。这是Prometheus的一个示例,显然可以告诉我们不同节点的CPU使用率。其中哪一个对应于正在使用的CPU?我在Internet上看到了很多关于图形的建议,并且可能会说,“哦,让我们运行它的查询吧,所有非空闲状态都使用CPU。”事实并非如此,至少有两个重要的误解:1.iowaitisidle从CPU的角度来看,当CPU处于iowait状态时,它就处于空闲状态。是的,为了方便,决定在这个状态中添加另一个状态——没有磁盘I/O时为空闲状态,有磁盘I/O时为空闲状态。但是从CPU的角度来看,如果你的系统在I/O状态下显示99CPU,那么这不是CPU瓶颈,而是I/O瓶颈。2.窃取是虚拟机不可用的CPU在VM环境和一些云环境中,窃取对应于您所做的任何事情都没有真正被应用程序使用的CPU。它指的是邻居的虚拟机。由于CPU在虚拟环境中共享,因此另一个VM可能会在同一CPU内核上窃取您的CPU周期。更多CPU乐趣了解CPU性能更有趣。因此,例如,现代CPU会随着负载改变它们的频率。有时可高达5倍。此外,您的系统可以提供的峰值内核频率取决于负载——特别是您在一个内核上运行的内容——以及您使用的内核数量。更不用说虚拟核心与实际核心不同。从利用率的角度来看,在这种情况下,如果您的CPU使用率接近饱和,您会随处看到这种情况。但是理解容量规划很重要,因为如果您知道您的应用程序随着您的工作负载线性增长,并且您可以看到CPU使用率低至5%,您可能会猜测您的应用程序至少可以增长20倍。对于当今CPU如何扩展的复杂数学来说,情况可能并非如此。PS:本文属于翻译,原文
