У меня есть старое приложение ASP.NET. Мы отправляем httpWebRequest на удаленный сервер REST и извлекаем XML обратно, большую часть времени приложение работает нормально. В последнее время мы получили несколько проблем с загрузкой процессора несколько раз в день.ASP.NET HttpWebRequest прекратить отправку запросов, высокий уровень использования процессора
Во время высокой загрузки процессора мы отслеживали эти подключения httpWebRequest (путем проверки netstat для процесса w3wp). В самом начале соединения меняются на статус «CLOSE_WAIT» с «ESTABLISHED», а после этого таймаута соединения эти соединения исчезают один за другим, а затем нет никакого соединения.
После перезагрузки IIS, когда процесс w3wp.exe запустился снова, мы все равно не смогли найти никаких соединений с целевым сервером httpWebRequest. Таким образом, использование ЦП продолжает оставаться на высоком уровне. Даже после нескольких раундов перезагрузки он не решит проблему, пока мы не увидим, что некоторые соединения начинают подключаться к целевому серверу httpWebRequest, использование процессора снизилось.
Я действительно думал, что это может быть проблема с моим кодом, который не обрабатывает httpWebRequest должным образом, я разместил здесь еще один вопрос: How to close underlying connections after catch httpwebrequest timeout?.
Как упоминалось в этом вопросе, я также нашел много исключений таймаута для System.Net.HttpWebRequest.GetResponse()
. Мы обнаружили 3500 таких же исключений за 5 минут, когда использование ЦП действительно велико.
Что может сделать этот тип проблемы и что может быть лекарством? Почему приложение не отправляет запрос больше (поскольку в netstat нет соединения)?
Вот исходный код только в случае, если:
System.Net.HttpWebResponse httpWebResponse = null;
System.IO.Stream stream = null;
XmlTextReader xmlTextReader = null;
try
{
System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(request);
httpWebRequest.ReadWriteTimeout = 10000;
httpWebRequest.Timeout = 10000;
httpWebRequest.KeepAlive = false;
httpWebRequest.Method = "GET";
httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
stream = httpWebResponse.GetResponseStream();
xmlTextReader = new XmlTextReader(stream);
xmlTextReader.Read();
xmlDocument.Load(xmlTextReader);
//Document processing code.
//...
}
catch
{
//Catch blcok with error handle
}
finally
{
if (xmlTextReader != null)
xmlTextReader.Close();
if (httpWebResponse != null)
httpWebResponse.Close();
if (stream != null)
stream.Close();
}
@feroze, спасибо большое за помощь, у меня нет опыта в профилировщике пробоотбора, не могли бы вы дать мне более подробную информацию или некоторые ссылки, которые я могу изучить. Еще раз спасибо. – machinegone
Вы можете скачать профайлер CLR здесь: http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&displaylang=en Вот несколько ссылок, которые показывают, как использовать профайлер: http://msdn.microsoft.com/en-us/library/ms979205.aspx http://msdn.microsoft.com/en-us/magazine/cc300553.aspx Я просто искал на ваш код снова, и что-то привлекло мое внимание. Поскольку вы добавляете XMLTextReader() в поток, также возможно, что анализ XML-документа может потреблять ЦП, если документ очень сложный. – feroze
@feroze, еще раз спасибо, я буду читать руководство и запускать его на своем сервере. Я дам вам обновление позже. Благодарю. – machinegone