rw_semaphore阻塞I / O重线程

时间:2015-12-29 11:59:32

标签: linux multithreading linux-kernel semaphore

我在跟踪应用程序中的性能瓶颈时遇到了一些问题。我在GPU上进行计算,并且我使用多个线程来加载和准备数据。所有文件都存储在SSD中,但有时性能会大幅降低(vmstat显示读取速度从300MB / s降至30MB / s)。当我运行ps时,我注意到大多数工作线程经常在call_rwsem_down_write_failedcall_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吗?)。有没有办法检查这些信号量的使用位置并消除阻塞?

提前致谢!

1 个答案:

答案 0 :(得分:0)

  

有没有办法检查这些信号量的使用位置......?

如果您的内核已经过适当配置,您可以在控制台上使用system request w - 显示阻止(D状态)任务的列表 - 或者

echo w >/proc/sysrq-trigger
dmesg

查看调用堆栈跟踪。