У меня многопоточный процесс. Каждый поток связан с процессором (выполняет вычисления), а также использует много памяти. По данным монитора ресурсов, процесс начинается со 100% загрузки ЦП, но через несколько часов загрузка ЦП начинает медленно снижаться. Через 24 часа он на 90-95% и падает.
Вопрос в том, что мне нужно искать и какие наиболее известные методы я могу использовать для отладки.
Дополнительная информация:
У меня достаточно оперативной памяти — большая ее часть не используется в данный момент.
Согласно perfmon — память не растет (поэтому я не думаю, что она подтекает).
Код представляет собой смесь .Net и нативного c ++, с некоторым маршалингом данных взад-вперед.
Я видел это на нескольких разных машинах (серверах с 24 логическими ядрами).
Одна вещь, которую я видел в perfmon — индикатор количества измененных страниц в списке увеличивается со временем по мере снижения загрузки процессора.
Редактировать 1
Одна из сторонних библиотек, которая используется — openfst. Похоже, это очень связано с неправильным использованием этой библиотеки.
В частности, я заметил, что у меня есть следующие предупреждения:
предупреждение LNK4087: ключевое слово CONSTANT устарело; использовать данные
Редактировать 2
Поскольку вопрос закрыт и не был вновь открыт, я напишу свои выводы и информацию о том, как проблема была решена, в теле вопроса (извините) для будущих пользователей.
Оказывается, что существует файл openfst.def, который определяет все символы openfst FLAGS_ *, которые будут использоваться приложениями / библиотеками. Я должен был исправить это, чтобы использовать ключевое слово «ДАННЫЕ» вместо «КОНСТАНТ» (КОНСТАНТ устарел, потому что это рискованно — больше информации: https://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx).
После этого — больше не наблюдалось ухудшения загрузки процессора. Больше не поднимается индикатор «измененные байты списка страниц». Я подозреваю, что это было связано со значениями по умолчанию FLAGS (в частности, флагов сборки мусора — FLAGS_fst_default_cache_gc), которые не были детерминированными из-за неправильного использования ключевого слова CONSTANT в файле openfst.def.
Заключение Поймите ваши предупреждения! Уничтожь как можно больше из них!
Благодарю.
Для такой неочевидной проблемы, как эта, вы также должны использовать профилировщик, который фактически выбирает базовые аппаратные счетчики в ЦП. Большинство профилировщиков, с которыми я знаком, используют статистику ядра, а не базовые счетчики HW. Это особенно верно в Windows. (Причина отчасти унаследована, а отчасти в том, что Windows хочет, чтобы статистика ядра была независимой от аппаратного обеспечения. API-интерфейсы PAPI пытаются решить эту проблему, но все еще относительно новы.)
Один из лучших профилировщиков — Intel VTune. Да, я работаю на Intel, но внутренние специалисты по высокопроизводительным вычислениям также используют VTune. К сожалению, это стоит. Если вы студент, есть скидки. Если нет, то есть испытательный срок.
Вы можете найти много информации по оптимизации и диагностике проблем на сайте software.intel.com. Вот указатели для оптимизация и для профилирование. Даже если вы не используете архитектуру x86, методы все еще действительны.
Что касается того, что может быть проблемой, то медленная деградация является странной.
Если вы используете архитектуру x86, рассмотрите вопрос об отправке вопроса на форуме Intel (например, «Кластеры Intel® и технология HPC» и «Настройка программного обеспечения, оптимизация производительности»). & Мониторинг платформы «).
Дайте нам знать, что вы в конечном итоге узнаете.
Других решений пока нет …