linux - rw_semaphore 阻塞 I/O 重线程

标签 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(我已经 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/

相关文章:

linux - 用于从文件创建数组并在 curl URL 上使用每个值的 Bash 脚本

linux - objdump 将文本段的内容提取为二进制格式

linux - 如何强制 linux 内核枚举 PCI-e 总线?

c - 错误 : ‘O_CREATE’ undeclared (first use in this function)

c++ - C++使用卡在函数调用中的辅助线程取消pthread

c++ - 多线程环境下的文档锁定

multithreading - .obj 中已定义的多线程函数

linux - 在装有 linux 的系统上检测网卡和端口

c - 为什么 vfork() 会出现段错误

Linux Buddy 页框分配和释放