C # сервис с провайдером Oracle .NET становится все медленнее и медленнее - PullRequest
2 голосов
/ 20 февраля 2009

У меня есть служба 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.

Обновление: Похоже, что это проблема с перегревом и тепловой защитой сервера, которые запускают и замедляют частоту ЦП.

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

Ответы [ 3 ]

1 голос
/ 20 февраля 2009

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

0 голосов
/ 11 сентября 2009

У меня точно такая же проблема. OracleConnection становится все медленнее и медленнее. Что интересно, если я позвоню:

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

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

Это должно быть как-то связано с соединением оракула (кеширование ??)

0 голосов
/ 20 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...