我在跟踪应用程序中的性能瓶颈时遇到了一些问题。我在GPU上进行计算,并且我使用多个线程来加载和准备数据。所有文件都存储在SSD中,但有时性能会大幅降低(vmstat显示读取速度从300MB / s降至30MB / s)。当我运行ps
时,我注意到大多数工作线程经常在call_rwsem_down_write_failed
或call_rwsem_down_read_failed
上被阻止。实际输出是:
- - user Dl 47.4 - call_rwsem_down_read_failed
- - user Rl 48.5 - -
- - user Dl 48.5 - call_rwsem_down_write_failed
- - user Dl 47.2 - call_rwsem_down_read_failed
- - user Dl 46.8 - call_rwsem_down_write_failed
- - user Dl 49.1 - call_rwsem_down_write_failed
- - user Dl 46.8 - call_rwsem_down_write_failed
- - user Dl 47.2 - call_rwsem_down_write_failed
- - user Dl 46.9 - call_rwsem_down_write_failed
- - user Dl 49.3 - call_rwsem_down_read_failed
- - user Dl 47.2 - call_rwsem_down_write_failed
- - user Dl 48.4 - call_rwsem_down_write_failed
奇怪的是应用程序正在使用Torch7和libpng来加载图像,但它们都没有使用rw_semaphore
s(我已经对源进行了掠夺)。此外,线程不会执行任何写操作。
由于我无法找到任何使用它们的地方,我怀疑这一切都发生在一些系统调用中(可能是read
吗?)。有没有办法检查这些信号量的使用位置并消除阻塞?
提前致谢!
答案 0 :(得分:0)
有没有办法检查这些信号量的使用位置......?
如果您的内核已经过适当配置,您可以在控制台上使用system request w - 显示阻止(D状态)任务的列表 - 或者
echo w >/proc/sysrq-trigger
dmesg
查看调用堆栈跟踪。