0

У меня есть веб-сервис, который периодически использует до 100% процессора на сервере. Мы не можем реплицировать это на сервере разработки, похоже, это происходит только на производстве. Мы думали, что это может быть проблема с загрузкой, но мы тестировали ее на разработку с количеством пользователей до 10 человек за раз. На производстве используется только 2 человека, в бета-состоянии. Я прочесывал код для любых бесконечных циклов, и их нет.Может ли DataTable.WriteXML вызывать высокий уровень использования ЦП?

После многократного поиска я нашел this страницу, в которой говорится, что проблема может быть связана с конкатенацией строк. Есть 5 мест, где использовался StringWriter, который я изменил на StringBuilder, как указано в ссылке. Но проблема все еще возникает, и мне интересно, могут ли быть вызовы DataTable.WriteXML. В основном каждый метод веб-службы заполняет таблицу данных и возвращает данные в формате XML, поскольку это необходимый формат для третьей стороны. Все звонки:

Dim SB As New StringBuilder 
Dim SW As New IO.StringWriter(SB) 
dsSource.Tables("Test").WriteXml(SW, Data.XmlWriteMode.IgnoreSchema, True) 

Неужели это неэффективно? Это приведет к 100% использованию ЦП? Если это может быть причиной, какая альтернатива была бы лучше?

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

Любые идеи?

ответ

0

Имеет ли этот производственный веб-сервер только 1 процессор? Я спрашиваю, потому что WriteXML, как любой синхронный/однопоточный код, будет использовать 100% одного процессора. Если сервер имеет несколько процессоров, и он перескакивает до 100 и остается там некоторое время, это, вероятно, что-то еще. Посмотрите на такие вещи, как несколько потоков (слишком много запусков) или очистка после себя, IE;

SW.flush 
SW.Close 
SW = Nothing 

Или поместить его в блоке ПРИМЕНЕНИЯ

USING SW As New IO.StringWriter(SB) 
'Your code here 
END USING 
+0

Сервер QuadCore, процессор будет оставаться на уровне 100%, пока процесс не будет убит. Я очищаю 'StringWriter' после использования точными средствами, которые вы упоминаете. – anothershrubery

+0

Я бы поставил код для записи определенных событий в журнал, чтобы вы могли найти, где проблема на самом деле. Как бы то ни было, мы просто стреляем в темноту, надеясь попасть в ответ. Затем, когда он блокируется на 100%, вы можете просмотреть свой журнал, чтобы узнать, что НЕ произошло, сообщая вам, где он находится. – Steve

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