我有一个需要分析的系统。
它由数十个进程组成,主要是c ++,其中一些由多个线程组成,它们通过各种系统调用与网络和相互通信。
我知道有时存在性能瓶颈,但没有人花时间/精力来检查它们的位置:它们可能是用户空间代码,系统调用的低效使用或其他。
对这样的系统进行分析的最佳方法是什么? 我想到了以下策略:
手动记录各种代码序列的往返次数(例如处理传入的数据包或cli命令)并查看哪个进程占用的时间最长。之后,分析该过程,解决问题并重复。
这种方法看起来很糟糕,而且很有猜测。我不喜欢它。
您如何建议解决此问题? 有没有可以帮助我的工具(多进程分析器?)?
我想要的更多是一种策略,而不仅仅是特定的工具。
我应该分别对每个流程进行分析并寻找问题吗?如果是这样我该如何处理?
我是否尝试隔离有问题的流程并从那里开始?如果是这样,我如何隔离它们?
还有其他选择吗?
答案 0 :(得分:1)
我认为这类问题没有一个答案。每种类型的问题都有它自己的问题和解决方案。
通常,第一步是弄清楚大系统中的WHERE是花费的时间。是CPU绑定还是I / O绑定?
如果问题是CPU限制的,系统范围的分析工具可用于确定系统在何处花费时间 - 下一个问题当然是否真的有必要,并且没有自动化工具可以分辨出一个写得很糟糕的代码片段,它完成了一百万个完全无用的处理步骤,另一个代码片段与一百万个元素进行矩阵乘法运算非常有效 - 它需要相同的CPU时间来完成这两个步骤,但是实际上实现了什么。但是,了解哪个程序在多程序系统中占用大部分时间可能是一个很好的起点,可以确定代码编写得好或可以改进。
如果系统受I / O限制,例如网络或磁盘I / O,则可以使用分析磁盘和网络流量的工具来提供帮助。但同样,期望该工具指出您应该期望的数据包响应或磁盘访问时间是另一回事 - 如果您联系谷歌搜索“kerflerp”,或者如果您联系距离您一米远的本地网络服务器,则会有对合理回应的时间产生巨大影响。
还有很多其他问题 - 使用大量内存并行运行两段代码会导致两者运行速度比顺序运行时慢 - 因为高内存使用会导致交换,或者因为操作系统不是例如,能够使用备用内存来缓存文件I / O.
另一方面,在多处理器系统上并行运行时,两个或多个使用非常少内存的简单进程将从中受益匪浅。
向您的应用程序添加日志记录,以便您可以看到花费时间的地方是另一种运行良好的方法。特别是如果你知道用例是什么需要时间。
如果您有一个用例,您知道“这应该不超过X秒”,运行常规的提前或提交后测试以检查代码是否按预期运行,并且没有人添加很多减慢代码的代码也是一件有用的事情。