C # сервис с провайдером Oracle .NET становится все медленнее и медленнее

2

У меня есть служба С#, написанная для .NET 2.0, которая использует поставщик доступа к данным Oracle для .NET 2.102.2.20. Служба запускает несколько потоков и запускает множество запросов к базе данных Oracle 9.2. Я использую NHibernate.

То, что я вижу, это то, что когда он запускается, он работает быстро, затем становится медленнее и медленнее. Запуск процессора начинается медленно, а затем увеличивается вверх и вверх. Через несколько минут он сканируется, а процессор находится на 100%. Я просмотрел свой код и не нашел ничего, что могло бы это сделать. Процентное время в GC составляет < 5%. Я попытался изменить параметры ODP.NET безрезультатно.

У кого-нибудь есть идея, что можно сделать?

Подробнее: Нити являются рабочими потоками и должны постоянно работать. У меня нет беглых потоков, они делают настоящую работу. Я профилировал программу, и похоже, что она тратит много времени в Oracle-провайдере, чего вы ожидаете, но зачем использовать так много CPU? Это как если бы оно вращалось в ожидании результатов или что-то еще, но это не происходит сразу, только через некоторое время.

Обновление: Это может быть связано с .NET CLR на сервере. Многопоточная тестовая программа, которая выполняет много строковых манипуляций, также демонстрирует одно и то же поведение на этой машине, быстро запускается, а затем замедляется в течение 15 минут до 1/3 скорости. Тест-программа не показывает это замедление на другом идентичном сервере с той же версией ОС и той же (как мы думаем) версией .NET CLR.

Обновление: Теперь похоже, что это проблема с перегревом и тепловой защитой сервера, ногами и замедлением частоты процессоров.

Обновление: Исправлено обновление прошивки для сервера. Я все еще думаю, что это проблема с перегревом, потому что, если я перестаю запускать процесс и дайте серверу "отдохнуть" на некоторое время, когда он начнет работать быстро, когда я перезапущу процесс, но если я убью процесс и перезапустил его сразу, начнет работать медленно. Я предполагаю, что контроль прошивки для вентиляторов был неисправен, поэтому процессоры нагревались и замедлялись. Если бы я перестал бежать некоторое время, они бы остыли и снова бежали, пока они не разогрелись.

Теги:
performance

3 ответа

1

Похоже, что ваши потоки не прерываются и продолжают работать постоянно, или у вас есть серьезные утечки памяти. Без дополнительной информации это может быть что угодно.

0

Я получаю то же самое. OracleConnection становится все медленнее и медленнее. Интересно, что если я позвоню:

cn.Close(); OracleConnection.ClearPool(cn);

каждый раз, он никогда не замедляется.

Он должен иметь какое-то отношение к соединению оракула (кеширование??)

0

Если процессор находится на 100%, вы, вероятно, сталкиваетесь с беглой нитью. Вы можете диагностировать это с помощью WinDbg + SoS. Присоединитесь к этому процессу и используйте команду !runaway, чтобы получить обзор того, сколько процессор использует каждый поток. Затем используйте !clrstack, чтобы узнать, что делает беглый поток. Дайте мне знать, если вам нужны дополнительные данные.

  • 0
    Это не какая-то нить. Это все из них. И они не зацикливаются в моем коде.
  • 0
    Ладно, интересно. Поскольку вы говорите, что все они выполняют настоящую работу, что показывают стеки вызовов?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню