У меня возникли проблемы с отслеживанием узкого места производительности в моем приложении. Я делаю вычисления на 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
?). Есть ли способ проверить, где используются эти семафоры, и устранить блокировку?
Заранее благодарен!
'Я подозреваю, что все это происходит в каком-то syscall (может быть прочитано?)' - Да, 'rw_semaphores' может использоваться почти любым syscall. Но это ** код ядра **, поэтому вам не удалось найти его в * пользовательских пространствах * библиотеках. Поскольку вы * разработчик приложений *, вы редко хотите спускаться в ядро. Используйте 'strace' или подобные инструменты, чтобы попасть в код * user space *, где возникает конфликт. – Tsyvarev
Я попробовал 'strace' и выяснил, что единственные сделанные syscalls -' open', 'fstat',' read', 'mmap',' brk' и 'close'. Я понятия не имею, как это требует 'rw_semaphore', поэтому я и задал здесь вопрос - я понятия не имею, как я могу изменить свой код, чтобы сделать его более эффективным без этих знаний. – wesolyromek