Тайна памяти Великого Skype для бизнеса

Эта статья была написана Кенном Гильсторфом, инженером по эскалации Skype для бизнеса.

Как инженер эскалации, я помогаю клиентам с некоторыми из более "persnickety" Skype для бизнеса проблем. В последнее время я получил довольно много случаев, которые "основаны на производительности" - в основном, жалобы на то, что Skype для бизнеса работает медленно или медленно, не разрешает общий доступ к приложениям или просто использует слишком много памяти. Во многих случаях исследование этих случаев показывает, что пользователь позволяет Skype для бизнеса работать в течение нескольких недель, и со временем память ползает, пока не влияет на производительность. Я даже заметил это сам, когда я позволил Skype работать в течение длительного времени. Итак, что делает Skype, и почему он содержит так много памяти? (Вот небольшая подсказка: это нормально и по замыслу. Нет ничего плохого - любая и каждая собственная программа работает с этим.)

Сколько памяти он может пережевывать?

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

При первом запуске Skype для бизнеса (SfB) использование памяти будет сравнительно небольшим (если можно считать 100 МБ небольшим). Мы видим, что это происходит в любом количестве средств, таких как диспетчер задач:

Снимок экрана: подробные сведения о приложении Lync в окне диспетчера задач со значениями памяти 83 428 КБ.

Рис. 1. Не обманывайте себя: Lync.exe — это имя процесса для SfB (32-разрядная версия)

Со временем объем памяти, используемой процессом, будет расти. Насколько он увеличивается, зависит от того, сколько используется Skype, для чего он используется и т. д. Например, вот тот же клиент примерно через 24 часа:

Снимок экрана: подробные сведения о приложении Lync в окне диспетчера задач с увеличением памяти до 115 196 тыс.

Рис. 2. Тот же SfB 24 часа спустя

Таким образом, Skype потреблял около 32 МБ за 24 часа. Это не так много, не так ли? Это действительно не - пока я не объясню, что Skype просто сидел без дела в течение всех этих 24 часов. В принципе, я начал Skype для бизнеса на компьютере, заблокировал его, и ждал около 24 часов, прежде чем разблокировать его. При использовании, плата была бы гораздо выше, особенно если я присоединился к собраниям, использовал общий доступ к приложениям или рабочий стол в этих собраниях, использовал мгновенные сообщения и т. д. Я видел случаи, когда использование памяти Skype для бизнеса за один день увеличивалось до 300–500 МБ. После одной или нескольких недель использования все может быть очень важно, особенно в 32-разрядном клиенте с большим объемом памяти.

Покажите мне память

Существует множество средств, которые могут профилирования памяти. Одним из самых популярных ( по крайней мере в Корпорации Майкрософт) является средство SysInternals VMMap, доступное в VMMap версии 3.26. Мы можем использовать его для просмотра памяти процесса и определения того, можно ли профилировать память Skype для бизнеса.

Загрузив VMMap, запустите ее. При запуске откроется список процессов, чтобы вы могли выбрать процесс, который требуется изучить. Я выберу lync.exe и нажмите кнопку ОК.

Снимок экрана: карта V m в начале с выбранной кнопкой Lync.

Рис. 3. VMMap в начале

Затем вы увидите рисунок, который представляет собой разноцветное представление текущего профиля памяти для выбранного исполняемого файла, в данном случае Lync.exe.

Снимок экрана: разноцветное представление профиля памяти.

Рис. 4. Начало VMMap для недавно запущенных Lync.exe

Здесь много информации, и описывая все это будет заполнить один или несколько записей блога своего собственного. Если вас интересует, есть несколько отличных книг и онлайн-статей, которые могут помочь объяснить это. (Лично я рекомендую "Расширенная Windows" Джеффри Рихтера - в настоящее время не печатается, но по-прежнему отлично объясняет, как работает память. Вы можете найти использованные копии в вашем любимом книжном магазине.)

Как видите, память, показанная в диспетчере задач , не соответствует ни одной категории в VMMap. Диспетчер задач — это более обобщенное представление; это точно, это просто не считает все. VMMap является гораздо более полным.

Вот наш экземпляр Skype после 24-часового периода ожидания:

Снимок экрана: карта V m для Skype через 24 часа.

Рис. 5. VmMap для Skype через 24 часа

Где память?

Если вы сравниваете каждую отдельную категорию, ничего на самом деле не выстраивается. На самом деле найти то, что потребляет память, трудно, так как категории памяти меняются по мере того, как объекты и запросы памяти выполняются и освобождаются, а память резервируется и фиксируется для хранения различных объектов. "Ядро знаний" (в любом случае для целей этого блога) — это категория "Бесплатный". В нашем примере "свободная" память — это все доступное пространство, которое "зарезервировано" для исполняемого файла Lync. Но в диспетчере задач отображается только определенный тип зафиксированной памяти. Зарезервированная память не учитывается, так как она не используется.

Так где же память? Это становится трудно определить, потому что память не теряется. Вопреки распространенному мнению, команда Skype не субсидировалась производителями памяти для настольных компьютеров. Нет гнусной диаграммы, чтобы клиенты могли обновить какие-либо системы или память. Это даже не случай планового устаревания. Правда немного сложнее объяснить.

Давайте немного отступим, чтобы сделать вещи яснее. При первом запуске клиента Skype для бизнеса он имеет относительно небольшой объем памяти — обычно 100 МБ или около того, в зависимости от количества контактов, которые он отслеживает для вас и других накладных расходов (вы можете четко видеть это в приведенных выше данных). Через несколько дней вы заметите, что этот объем увеличивается от нескольких сотен тысяч байт до нескольких мегабайт. В некоторых ситуациях это может быть проблемой, но это не обязательно проблема в Skype для бизнеса сама по себе. Скорее, это результат парадигмы программирования Windows и того, как она обрабатывает память в собственном коде.

Программирование windows что?

Я собираюсь дать здесь только упрощенное представление о памяти Windows. Память Windows обрабатывается с помощью дорогостоящих (с точки зрения компьютерных циклов и ресурсов) процедур, известных как выделение и отмена выделения. Когда программе требуется память, она просит Windows выделить ее. По завершении с памятью программа просит Windows де-выделить ее. Внутри Windows проходит несколько процессов для управления запросами памяти.

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

Что произойдет, если недостаточно зарезервированной памяти для обработки запроса? Операционная система пытается зарезервировать больше памяти, если это возможно. Вот где в игру вступает разница между 32-разрядной и 64-разрядной архитектурой. 32-разрядный процесс может использовать не более 4 ГБ памяти. Это связано с тем, что 4 ГБ — это максимальный объем, который может адресировать 32-разрядный регистр. (Бит может содержать только двоичный файл 1 или 0. Таким образом, 32 бита означает, что 232 — это самый высокий допустимый адрес). Благодаря 32-разрядной архитектуре только около 2 ГБ этой памяти назначается самому процессу, остальное используется операционной системой для сопоставления общих библиотек DLL, ухода за общими объектами режима ядра и т. д. В 64-разрядной системе 64-разрядные регистры могут обрабатывать 264, что оказывается около 18 эксабайт. Однако Windows искусственно ограничивает объем доступной памяти, которая будет зарезервирована в диапазоне от 2 до 4 ТБ, в зависимости от версии Windows.

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

Во-первых, если не запрошено, Windows никогда не очищает память. Когда память выделена, она помечается как свободная на карте памяти Windows. Все, что он держал, по-прежнему там и останется там, пока он не перезаписан другим выделением. Далее Windows редко отменяет фиксацию памяти, если это не запрашивается. Как я уже говорил ранее, операции с памятью достаточно ресурсоемки. Таким образом, если программе требовалась память, выделенная ранее, Windows предполагает, что ей может потребоваться эта память снова, и будет откладывать отмену фиксации памяти до тех пор, пока она не потребуется. Наконец, Windows никогда не объединяет память. Это означает, что освобождаемая Windows память никогда не "агрегируется", а блоки свободной памяти никогда не перемещаются вместе, чтобы создать большие блоки свободной памяти. (Все эти функции объединяются в категорию, известную как "сборка мусора". платформа .NET Framework, как известно, имеет некоторые функции сборки мусора. Однако Skype для бизнеса является "собственным" или non-.NET приложением.)

Skype для бизнеса каждую секунду обрабатывает множество объектов с разными размерами. Он должен сделать это, чтобы быть потрясающим инструментом, который мы хотим, чтобы он был. Мы просим его управлять контактами, управлять календарями (собраниями), обмениваться мгновенными сообщениями с друзьями, родственниками и коллегами и даже говорить с ними с помощью голоса и видео, делиться рабочими столами или окнами и т. д. Ну, процитировать покойного, великого Роберта Хайнляйна, среди прочих: "Нет такой вещи, как бесплатный обед".

Управление стольким количеством объектов таких разных и часто переменных размеров приводит к выделению и отмене выделения фрагментов памяти с переменным размером. Со временем это приводит к фрагментации памяти , иногда серьезной, что увеличивает объем памяти Skype для бизнеса.

Пример может лучше проиллюстрировать этот момент. Предположим, что Skype (или любая собственная программа) выделяет 64 объекта с нумерованными 1–64, размером по 4 КБ:

Снимок экрана: объекты Skype 64.

Рис. 6. 64 объекта, каждый из которых использует 4 КБ памяти

Это приводит к выделению памяти и обязательству объемом 256 КБ. Теперь предположим, что программе не требуются четные объекты, поэтому она выпускает их:

Снимок экрана: все освобожденные четные объекты.

Рис. 7. Освобождение всех четных объектов освобождает 128 КБ памяти!

Если вы посмотрите на большую картину общей памяти (с помощью VMMap или аналогичного средства), вы увидите, что один из зафиксированных столбцов (скорее всего, в разделе Куча , но это зависит от того, как именно программа запросила память) имеет 128 КБ меньше, а раздел "Бесплатный " увеличился на 128 КБ. В диспетчере задач программе теперь принадлежит только 128 КБ памяти.

Далее предположим, что наша программа содержит один объект размером 8 КБ, который она должна хранить. Это должно быть просто. В конце концов, он имеет 128 КБ бесплатно. Однако при попытке сохранить этот объект размером 8 КБ создается новое резервирование памяти вместо хранения памяти в свободном пространстве размером 128 КБ. Это связано с тем, что если вы посмотрите на память, вы увидите, что она по-прежнему сегментирована на 4-КБ блоки! Windows не имеет достаточно большого блока памяти для размещения объекта размером 8 КБ, поэтому ей приходится резервировать и зафиксировать в программе больше памяти.

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

Если это вызывает проблемы в 32-разрядном клиенте, мы часто рекомендуем перейти на 64-разрядный клиент, так как память там гораздо меньше, благодаря 64-разрядной и 32-разрядной архитектуре. Однако чрезмерный рост памяти, среди прочего, может привести к вялости даже в 64-разрядном клиенте. Эти другие рекомендации включают общую системную память, скорость диска (так как программная память обычно поддерживается виртуальной памятью в файле подкачки Windows), количество открытых других приложений и т. д. В обоих случаях, когда объем памяти Skype для бизнеса увеличивается со временем, тем хуже он будет работать. В случае с 32-разрядным клиентом это может привести к тому, что большие объекты, необходимые Skype, например внутренний буфер для общего доступа к приложениям, иссякают место и приводят к сбоям.

Справедливости ради следует отметить, что память — это только один ресурс, который потребляется с течением времени, но это самый очевидный ресурс. Использование дескрипторов может увеличиваться, потоки со временем увеличиваются, объем памяти пула страниц увеличивается и т. д. Каждое из этих повышений может повлиять на процесс и, в некоторых случаях, на всю операционную систему. Это одна из множества причин, по которой мы рекомендуем (даже для 64-разрядного клиента), чтобы пользователи выходили и перезапускать Skype ежедневно (или, по крайней мере, еженедельно).

Что делать с этим и можно ли принудительно перезапустить Skype?

Существует несколько способов принудительного перезапуска Skype, но не существует одного, лучшего способа. Одним из способов, конечно, является обучение пользователей. В большинстве случаев пользователи являются арбитрами использования рабочего стола, поэтому прагматично научить их выходить из системы и закрывать Skype, когда они уезжают на день. Это также можно сделать в качестве обязательного шага, написав пользовательский скрипт или исполняемый файл, а затем выполнив один из них в качестве задачи планировщика задач. Этот подход немного сбит с кулаками и может привести к циклу Skype, даже если он "используется" (хотя это может быть несколько смягчен с помощью условий планировщика задач). Существуют также сторонние возможности для управления настольными компьютерами и компьютерами, возможные варианты BIOS и т. д.

Суть в том, что лучше всего для Skype для бизнеса циклически его ежедневно или, по крайней мере, еженедельно. Если вы можете обучить пользователей перезапускать Skype для бизнеса на регулярной основе или, по крайней мере, когда все будет странно, у вас, скорее всего, будет гораздо меньше звонков в службу поддержки и гораздо больше счастливых пользователей.