【发布时间】:2014-06-03 18:01:53
【问题描述】:
我花了一点时间运行 valgrind/callgrind 来分析使用许多线程进行大量 TCP/IP 通信的服务器。经过一段时间的性能提升后,我意识到在这个特定的测试场景中,进程不受 CPU 限制,因此我所看到的性能“提升”毫无用处。
理论上,CPU 应该很忙。我知道它连接的 TCP/IP 设备不是限制,因为服务器在两台机器上运行。一个是 PC,另一个是带有 Arm 处理器的嵌入式设备。即使是嵌入式设备也只有大约 2% 的 CPU 使用率,但它执行的事务要少得多——大约十分之一。尽管我们试图尽可能快地获取数据,但这两个系统都只能获得大约 2%。
我的猜测是某些互斥锁被锁定并阻止了一个线程。这是一个纯粹的猜测!系统中有几个线程具有公共数据。也许还有其他可能性,但我怎么知道?
是否可以使用像 valgrind/callgrind 这样的工具来显示系统调用所花费的时间?如果更好的话,我也可以使用 Visual Studio 2012 在 Windows 上运行它。
我们可能不得不尝试遍历代码或其他东西,但不确定我们是否有时间。
感谢任何提示。
谢谢。
【问题讨论】:
-
嗯 - 想知道这是否有帮助 - --collect-systime=
[default: no] 这指定是否应收集系统调用时间的信息 -
如果你有 VS2012 供你使用,也许the built-in profiler 可能会有一些价值。
-
刚刚意识到 - 我有 VS2012,但没有高级版或终极版,所以我认为我没有那个选项。
-
在
gdb内运行程序,中断程序几次,看看所有线程的堆栈跟踪。我希望所有线程都在等待阻塞网络操作,或者某些线程正在等待锁定一个线程在执行阻塞网络操作时持有的互斥锁。 -
谢谢 - 是的,这是可能的。谢谢。
标签: c++ linux windows multithreading valgrind