我在追踪应用程序的性能瓶颈时遇到了一些问题。我在 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
(我已经 grep 了源代码)。此外,线程不执行任何写入操作。
因为我找不到任何使用它们的地方,我怀疑这一切都发生在某个系统调用中(可以是 read
吗?)。有没有办法检查这些信号量在哪里使用并消除阻塞?
提前致谢!
最佳答案
Is there any way to check where these semaphores are used …?
只要您的内核配置合适,您就可以使用 system request w - 显示已阻止(D 状态)任务的列表 - 在控制台上或
echo w >/proc/sysrq-trigger
dmesg
查看调用堆栈跟踪。
关于linux - rw_semaphore 阻塞 I/O 重线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510598/