2009-02-20 6 views
2

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

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

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

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

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

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

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

ответ

1

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

0

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

+0

Это не одна нить. Это все. И они не зацикливаются на моем коде. –

+0

Хорошо, интересно.Поскольку вы говорите, что все они занимаются настоящей работой, что показывают стеки вызовов? –

0

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

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

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

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

Смежные вопросы