我有个系统我需要分析一下。
它由数十个进程组成,其中大部分是c++,有些由几个线程组成,通过各种系统调用与网络和彼此通信。
我知道有时会出现性能瓶颈,但是没有人花时间/精力去检查它们在哪里:它们可能在用户空间代码中,没有效率地使用syscalls,或者其他什么东西。
怎样才是最好的方法来分析这样的系统呢?我想出了以下策略:
手动记录各种代码序列的往返时间(例如,处理传入的数据包或cli命令),并查看哪个进程花费的时间最长。在此之后,分析该过程,修复问题并重复。
这种方法似乎有些烦琐和猜测。我不喜欢它。
你建议如何解决这个问题?有什么工具可以帮助我解决这个问题(多进程分析器?)
我想要的更多的是一种战略,而不仅仅是特定的工具。
应该分别分析每个进程并查找问题吗?如果是这样的话,我该如何处理呢?
,我是否尝试隔离出有问题的过程并从那里出发?如果是这样的话,我如何隔离他们?
还有其他选择吗?
发布于 2016-03-07 22:58:08
我认为这类问题没有一个答案。每个类型的问题都有自己的问题和解决方案。
一般来说,第一步是找出在大系统中花费的时间。是CPU绑定还是I/O绑定?
如果问题是CPU限制的,一个系统范围的分析工具可以用来确定在系统中花费时间的地方--下一个问题当然是这个时间是否真的必要,而且没有一个自动化工具能够区分一个写得很差的代码,它做了一百万个完全无用的处理步骤,和一个非常高效地用一百万个元素进行矩阵乘法的代码--这需要同样的CPU--时间来完成这两个任务,但是其中一个实际上并没有达到任何效果。但是,知道哪个程序在多程序系统中花费了大部分时间,这是一个很好的起点,可以确定该代码是否编写得很好,或者可以改进。
如果系统是I/O绑定的,例如网络或磁盘I/O,那么有一些工具可以帮助分析磁盘和网络流量。但是,期待该工具指出您应该期望的数据包响应或磁盘访问时间是另一回事--如果您与google联系搜索"kerflerp",或者如果您与位于一米之外的本地for服务器联系,则会对做出合理响应的时间产生巨大影响。
还有很多其他问题--并行运行两段使用大量内存的代码可能会导致运行速度慢于按顺序运行的代码--因为内存使用率高会导致交换,或者因为操作系统无法使用空闲内存来缓存文件--例如I/O。
另一方面,两个或更多使用很少内存的简单进程将从多处理器系统上并行运行中获益良多。
将日志添加到您的应用程序中,这样您就可以看到它在哪里花费时间,这是另一种相当有效的方法。特别是如果您知道用例是什么需要时间的话。
如果您有一个用例,您知道“这应该不超过X秒”,那么运行常规的预提交测试或提交后测试来检查代码是否如预期的那样运行,而且没有人添加了大量代码来减缓代码的速度,这也是一件有用的事情。
https://stackoverflow.com/questions/35855167
复制相似问题