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