РЕДАКТИРОВАТЬ: После долгого обсуждения в комментариях, кажется, что мой первоначальный вопрос на самом деле не отражает происходящее. Вот краткое изложение того, где я сейчас нахожусь:
- При использовании HTTPS есть то, что я бы назвал резким скачком в пространстве виртуальной памяти моего приложения (обычно от 50 МБ до 200 МБ) при первом запросе HTTPS (вызов веб-службы, WebClient.DownloadFile () и т. Д. ) сделано
- В то же время ядро ЦП также переходит почти на 100%. Обычно это длится всего несколько секунд, но я видел, что это длится дольше
- Вполне возможно, что это просто стоимость использования HTTPS, но я был удивлен этим, так как я никогда не замечал этого раньше в других приложениях (а другие разработчики в моей команде никогда не замечали этого в этом приложении, который использует HTTPS задолго до того, как я поднялся на борт).
- Кикер: это происходит не на всех машинах, а на большинстве. Если бы это происходило последовательно на каждой машине, я бы с большей готовностью принял это как «затраты на ведение бизнеса». Но поскольку между некоторыми машинами, работающими с одним и тем же кодом и ОС, существует определенная разница, я хотел бы понять, почему это так, поскольку это либо а) позволит нам смягчить поведение, либо б) объяснить его таким образом, чтобы нетехнические сведения о том, что на самом деле это не «проблема», так как объяснение того, что диспетчер задач Windows показывает виртуальную память и не обязательно активно используемую физическую память, пока не является удовлетворительным: /
Я оставил исходный пост без изменений на тот случай, если кому-то интересно, но он больше фокусируется на веб-сервисах, которые на самом деле не являются корнем проблемы.
Заранее благодарим за дальнейшее понимание!
Мы наблюдаем резкое увеличение использования памяти всякий раз, когда наше приложение впервые обращается к нашему веб-сервису по протоколу https. Специфика зависит от машины, но в качестве примера мы можем увидеть, как наше приложение перепрыгивает с ~ 50 МБ до более 250 МБ, когда выполняется первый вызов веб-службы, и использование никогда не снижается. Последующие вызовы не приводят к другому такому прыжку. Я могу воспроизвести это поведение с помощью приведенного ниже кода (не относится к нашему приложению) и общедоступной веб-службы, которой мы не владеем, поэтому она, похоже, не зависит от нашего клиентского и серверного кода.
Интересно, что в моем тестовом приложении я не наблюдаю этот скачок в Windows XP (наше приложение в настоящее время развернуто только в Windows 7). Мы также не видим его на каждой машине разработки / тестирования в офисе (но мы делаем на большинстве), и в настоящее время у нас нет способа извлечь эту информацию с машин в «реальном мире».
Мне не удалось определить, что именно выделяется, но несколько профилировщиков дали понять, что оно находится в собственной (не управляемой) памяти. Анализ некоторых дампов WinDbg с использованием DebugDiag заставляет меня поверить, что в crypt32.dll выделяется много памяти, которая не освобождается. В некоторой степени это имеет смысл (https подразумевает сертификаты, безопасность и т. Д., И, вероятно, все, что загружается, кэшируется, поэтому последующие вызовы не приводят к дополнительным переходам), но мне трудно поверить, что это на самом деле просто стоимость использования https для веб-службы.
Я знаю, что будут ответы от "если более высокое использование памяти не вызывает проблем, зачем беспокоиться?" лагерь. В целом я согласен - цифры использования памяти в диспетчере задач часто не указывают на то, работает ли приложение так, как задумано. Если бы приложение использовалось исключительно внутри компании, я мог бы жить с этим, пока это не является симптомом других проблем. Но наше приложение развернуто на потребительских машинах, поэтому нам нужно беспокоиться о восприятии проблемы так же, как и о реальной проблеме. Так что, если есть какой-то способ исправить это, я был бы очень признателен!
Наконец, веб-сервис, который я использую в тестовом коде ниже, доступен здесь: http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx?wsdl. Код для EmailVerNoTestEmail был создан с использованием инструмента wsdl.exe с небольшой модификацией передачи URL-адреса в качестве параметра. конструктору, а не жестко его кодировать (чтобы http / https можно было задавать на лету).
public static void Main(string[] args)
{
const string urlSuffix = "://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
string protocol = null;
while(protocol == null)
{
Console.Write("Enter protocol (http, https): ");
var line = Console.ReadLine();
if (line != null) line = line.ToLower();
if (line == "http" || line == "https")
protocol = line.Trim();
}
var url = protocol + urlSuffix;
Console.WriteLine("Using URL: " + url);
Console.Out.Flush();
var service = new EmailVerNoTestEmail(url);
Console.WriteLine("Press any key to make the web service call...");
Console.ReadKey(true);
Console.WriteLine("Calling web service...");
var resp = service.VerifyEmail("test@gmail.com", "test");
Console.WriteLine("Response: " + resp);
Console.WriteLine("Press any key to exit.");
Console.ReadKey(true);
}