У меня есть служба C #, написанная для .NET 2.0, в которой используется поставщик доступа к данным Oracle для .NET 2.102.2.20. Служба запускает несколько потоков и выполняет множество запросов к базе данных Oracle 9.2. Я использую NHibernate.
Что я вижу, так это то, что когда он запускается, он работает быстро, а затем становится все медленнее и медленнее. Загрузка процессора начинается с низкого уровня, затем увеличивается и увеличивается. Через несколько минут он ползет и процессор на 100%. Я посмотрел в своем коде и не нашел ничего, что могло бы сделать это. Процент времени в GC составляет <5%. Я пытался изменить параметры ODP.NET безрезультатно. </p>
У кого-нибудь есть идеи, что может делать это?
Подробнее:
Потоки являются рабочими потоками и должны постоянно работать. У меня нет безудержных тем, они делают настоящую работу. Я профилировал программу, и похоже, что она проводит много времени внутри провайдера Oracle, чего вы и ожидали, но почему он использует так много ЦП? Как будто он вращается в ожидании результатов или чего-то еще, но это происходит не сразу, а через некоторое время.
Обновление:
Это может быть связано с .NET CLR на сервере.
Многопоточная тестовая программа, которая выполняет много манипуляций со строками, также демонстрирует то же поведение на этом компьютере, начиная быстро, а затем замедляясь в течение 15 минут примерно до 1/3 скорости. Тестовая программа не показывает такое поведение замедления на другом идентичном сервере с той же версией ОС и той же (мы думаем) версией .NET CLR.
Обновление:
Похоже, что это проблема с перегревом и тепловой защитой сервера, которые запускают и замедляют частоту ЦП.
Обновление:
Обновление прошивки для сервера исправило это. Я все еще думаю, что это была проблема перегрева, потому что если я перестану запускать процесс и позволю серверу «отдохнуть» на некоторое время, он начнет работать быстро, когда я перезапущу процесс, но если я убью процесс и перезапущу его сразу начнется уже работает медленно. Я предполагаю, что контроль прошивки для вентиляторов был неисправен, поэтому процессоры нагревались и замедлялись. Если я остановлюсь на некоторое время, они будут остывать и снова бегать быстро, пока они снова не нагреются.