请指点我监控哪个tad在毫秒级别运行的工具或方法?谢谢。
假设我有 3 个线程正在运行,我想要如下信息:
0 - 20ms thread1
20 - 40ms thread2
40 - 50ms thread1
50 - 70ms thread3
注意:我更喜欢在不侵入内核的情况下解决这个问题。
编辑 :
在具有 2.6.21 Linux 内核的 MIPS 平台中
命令 TOP 可以提供一些关于线程的信息,但不能提供太多信息。
请指点我监控哪个tad在毫秒级别运行的工具或方法?谢谢。
假设我有 3 个线程正在运行,我想要如下信息:
0 - 20ms thread1
20 - 40ms thread2
40 - 50ms thread1
50 - 70ms thread3
注意:我更喜欢在不侵入内核的情况下解决这个问题。
编辑 :
在具有 2.6.21 Linux 内核的 MIPS 平台中
命令 TOP 可以提供一些关于线程的信息,但不能提供太多信息。
您可以使用LTTng通过适当配置的内核来跟踪调度活动(以及许多其他事情!)。
也就是说,我查看了您的 nabble 链接-您真正的问题似乎是您的写入线程阻塞了读取线程,对吗?要考虑尝试的一件事是使用支持并发读写的数据库。或者在读线程处于活动状态时使用锁定协议来阻塞写线程。
例如,您可以有一个 mutex、condvar 和一个 want_read 值。在每次写入之前,写入线程获取互斥体并检查 Wants_read 值。如果它不为零,它会阻塞在 condvar 上。同时,读线程开始时会在互斥锁下增加 Wants_read,完成后,减少它并在 condvar 上广播。当读取线程想要进入时,这应该会导致写入线程在安全时立即阻塞。
对于您在评论中提到的特定问题,没有 usleep 的线程将使线程忙,这将占用大量处理器资源。然后你会得到一个缓慢的数据库搜索响应。
对于一般情况,如果您想检查线程调度顺序,并且不想麻烦安装 lttng,您可以使用我使用的技巧。我在线程的关键路径中添加了一些简单的系统调用,如打开、关闭、时间和无效参数(与 printf 相比开销较低,并且 printf 有时涉及线程锁定),然后您可以使用 strace 工具跟踪所有这些线程。查看 strace 日志,你可以看到它们是在什么时候调度的,什么时候其他线程被调度进来的。然后你就会大致了解哪个线程花费了最多的时间,以及哪个线程占用了系统的大部分时间。
Lttng 绝对是解决此类问题的最佳工具,前提是您可以使其正常工作。
Intel Concurrency Checker可以在 windows 和 linux 上运行。没用过,所以不知道很多细节,但是听说会做性能测量。可能值得一试。
查看性能检查器工具。