2015-12-29 2 views
1

У меня возникли проблемы с отслеживанием узкого места производительности в моем приложении. Я делаю вычисления на GPU, и я использую несколько потоков для загрузки и подготовки данных. Все файлы хранятся на SSD, но иногда производительность резко сокращается (vmstat показывает, что чтение идет от 300 МБ/с до 30 МБ/с). Когда я побежал ps, я заметил, что большинство рабочих потоков регулярно блокируются на call_rwsem_down_write_failed или на call_rwsem_down_read_failed. Фактический выход был:rw_semaphore блокирование Вводы/выходы тяжелых нитей

-  - 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 с (я greped источники). Кроме того, потоки не выполняют никаких операций записи.

Поскольку я не могу найти место, где они используются, я подозреваю, что все это происходит в каком-то syscall (может быть, read?). Есть ли способ проверить, где используются эти семафоры, и устранить блокировку?

Заранее благодарен!

+0

'Я подозреваю, что все это происходит в каком-то syscall (может быть прочитано?)' - Да, 'rw_semaphores' может использоваться почти любым syscall. Но это ** код ядра **, поэтому вам не удалось найти его в * пользовательских пространствах * библиотеках. Поскольку вы * разработчик приложений *, вы редко хотите спускаться в ядро. Используйте 'strace' или подобные инструменты, чтобы попасть в код * user space *, где возникает конфликт. – Tsyvarev

+0

Я попробовал 'strace' и выяснил, что единственные сделанные syscalls -' open', 'fstat',' read', 'mmap',' brk' и 'close'. Я понятия не имею, как это требует 'rw_semaphore', поэтому я и задал здесь вопрос - я понятия не имею, как я могу изменить свой код, чтобы сделать его более эффективным без этих знаний. – wesolyromek

ответ

0

Есть ли способ проверить, где используются эти семафоры ...?

При условии, что ваше ядро ​​соответствующим образом настроено, вы можете использовать system requestж - список Отображения заблокированного (D государственного) задач - на консоли или

echo w >/proc/sysrq-trigger 
dmesg 

видеть вызов стека.

Смежные вопросы