Как Windows может выгрузить всю оперативную память в файл гибернации так быстро?

65

Я просматривал статью, в которой объяснялась процедура гибернации в Microsoft Windows. Основные моменты, которые я получаю из этого:

  1. Windows сбрасывает в память всю оперативную память (возможно, после ее обработки) hiberfil.sys.
  2. Во время загрузки файл гибернации читается, а содержимое загружается в ОЗУ.

Мой вопрос: когда я обычно копирую файл размером, скажем, 1 ГБ, это занимает около 2 минут .

Однако, когда Windows пишет файл гибернации (во время процедуры гибернации), весь процесс занимает, возможно, 10-15 секунд. Почему такая разница в скорости записи?

Объем моей оперативной памяти составляет 4 ГБ. (Я не говорю о технологии быстрой загрузки.)

тесты:

  1. Копирование файла 1 ГБ с диска 1 на диск 2 (внешний): 2,3 минуты.
  2. Спящий режим системы: 15 секунд.
кодировщик
источник
3
Я не знаю ответа, но держу пари, что если вы проверите книгу Windows Internals «Глава 13: Запуск и завершение работы», она скажет вам (если бы у меня была книга, я бы проверил).
Скотт Чемберлен
2
Это хороший вопрос. Когда гибернация была впервые внедрена в 1998 году, она была не такой быстрой.
Гейб
22
@coder: система NT гарантирует, что у hyberfil.sys есть все выделенное пространство и что весь файл не фрагментирован. В этом состоянии во время работы на жестком диске не прыгает голова. Таким образом, вы получите эффективные скорости, такие как 150Mo / s. Вы можете перепроверить то, что я сказал fsutil.
user2284570
3
Внешний диск обычно медленнее, чем внутренний.
Гарри Джонстон,
2
@EricLippert - он, безусловно, не хранит всю оперативную память, но это все же не объясняет этого. У меня регулярно есть несколько гигабайт активной оперативной памяти, которую нужно хранить (VS2013 или Eclipse + еще несколько вещей занимают много оперативной памяти), и они сохраняются со скоростью, которая мне кажется больше, чем даже теоретическая скорость записи моего не-SSD водить машину.
Давор

Ответы:

45

Это, вероятно, тройной ответ.

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

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

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

Кроме того, современные жесткие диски довольно быстрые. С диска с устойчивой записью порядка 100 МБ / с вы сможете записать (без сжатия) 4 ГБ ОЗУ менее чем за одну минуту. Поскольку гибернация может выполняться как последняя вещь после приостановки всех пользовательских процессов и перед приостановкой ЦП, ОС обычно будет иметь полную скорость записи на диск. Это одна вещь, которой не будет у вашего простого теста, и копирование с диска на диск будет потенциально медленнее, чем просто запись ОЗУ на диск.

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

Мокубай
источник
37
Или, чтобы сделать это более ясным: ваш RAM, вероятно, не заполнен. Буферы сбрасываются, а кеш сбрасывается при спящем режиме. Только память, фактически используемая приложениями , должна быть записана на диск. Гибридное отключение сокращает объем используемой памяти путем выхода пользователя из системы.
Даниэль Б
2
Страницы, которые не являются грязными, являются более общим утверждением «выгружены в файл подкачки», это может включать исполняемые файлы. (Поскольку исполняемые файлы несколько фрагментированы на диске, это может замедлить пробуждение.) Кроме того, чистые файловые буферы могут быть просто отброшены, даже если они не являются частью файла отображения памяти.
Пол А. Клейтон,
3
@ user2284570 из документа, на который я ссылался в этом ответе «Windows поддерживает режим гибернации, копируя содержимое памяти на диск. Система сжимает содержимое памяти перед сохранением их на диске, что сокращает требуемое дисковое пространство до уровня, который меньше общего объема физической памяти. в системе. "
Мокубай
4
@ user2284570: Это потому, что наихудший сценарий - сжатие 1: 1. Windows должна убедиться, что в hyberfil.sys достаточно (зарезервировано) места для любой возможной конфигурации памяти - даже если ей требуется только одна десятая размера ОЗУ для определенного режима гибернации. Добавьте к этому, что приличная часть использования ОЗУ - это файлы, загруженные в память (исполняемые файлы, ресурсы ...), но все же отображенные с жесткого диска, и вы действительно можете сэкономить много времени. Сделайте так, чтобы программа генерировала 4 ГБ криптослучайных данных в ОЗУ, и спящий режим длится значительно дольше - и даже в этом случае некоторые из них могли находиться в режиме подкачки.
Луаан
3
@ user2284570: Файл настолько большой, что на диске достаточно места для хранения всей памяти. Не все это пространство фактически используется в спящем режиме. Иногда файл будет (скажем) 7% сжатого содержимого памяти, 93% мусора.
psmears
31

Во-первых, объем оперативной памяти, который необходимо сохранить, удивительно мал. Фактически, необходимо очищать только набор отображенных грязных страниц («отложенная обратная запись»), а также записывать все частные страницы, которые были записаны и перемещены в исполняемый код.

  • Сегменты .text исполняемых файлов всегда поддерживаются сопоставлением файлов. Это также верно по крайней мере для некоторых библиотек DLL (но не для всех, в зависимости от того, нужно ли их перемещать).
  • Память, которая аналогичным образом поддерживается файловыми сопоставлениями, может быть отброшена (предполагается, что она не CoW или RW и не загрязнена).
  • Ленивая обратная запись все еще должна произойти, но кроме этого, кэши могут быть отброшены.
  • Память, которая была выделена, но не была записана (обычно большая часть данных приложения!), Поддерживается нулевой страницей и может быть отброшена.
  • Большая часть страниц памяти, которые находятся в состоянии «ожидания» (фактический резидентный рабочий набор в Windows удивительно мал, всего 16 МБ), будет скопирована в файл страницы в фоновом режиме и может быть отброшена ,
  • Области памяти, отображаемые определенными устройствами, такими как графическая карта, могут (возможно) не должны быть сохранены. Иногда пользователи удивляются, что они подключают 8GiB или 16GiB к компьютеру, а 1GiB или 2GiB просто «пропали» без видимой причины. Основные графические API-интерфейсы требуют, чтобы приложения могли с недействительным содержимым буфера «при определенных условиях» (не говоря точно, что это значит). Таким образом, вполне разумно ожидать, что память, закрепленная графическим драйвером, тоже просто сбрасывается. В конце концов, экран все равно погаснет.

Во-вторых, в отличие от копирования файла, сброс набора страниц ОЗУ, которые необходимо сохранить на диске, представляет собой одну последовательную непрерывную запись с точки зрения накопителя. Win32 API даже предоставляет функцию пользовательского уровня для этой самой операции. Запись сбора напрямую поддерживается аппаратным обеспечением и работает так же быстро, как диск физически способен принимать данные (контроллер будет напрямую извлекать данные через DMA).
Для этого есть ряд предварительных условий (например, выравнивание, размер блока, закрепление), и он плохо работает с кэшированием, и не существует такой вещи, как «отложенная обратная запись» (что является очень желательной оптимизацией при нормальной работе). ).
Вот почему не каждый пишетработает так все время. Однако, когда система сохраняет файл гибернации, все предварительные условия автоматически выполняются (все данные выровнены по размеру страницы, по размеру страницы и закреплены), и кэширование просто перестало иметь значение, потому что компьютер будет отключен через мгновение.

В-третьих, выполнение одной непрерывной записи очень удобно как для вращающихся дисков, так и для твердотельных дисков.

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

При записи большого количества последовательных непрерывных данных на диске не требуется никаких операций чтения-изменения-записи. Эта проблема менее выражена на вращающихся жестких дисках, которые могут записывать отдельные сектора, которые достаточно малы (при условии, что вы не пишете отдельные байты, что обычно предотвращает кэширование, устройству не нужно извлекать исходное содержимое и записывать измененную версию.) ,
Это, однако, очень заметно на SSD, где каждая запись означает, что, например, блок 512 КБ (это обычное число, но оно может быть больше) должен быть прочитан и изменен контроллером и записан обратно в другой блок. Хотя в принципе можно написать (но не перезаписать) меньшие блоки на флеш-дисках, вы можете стирать только огромные блоки, так работает аппаратная часть. Это причина того, почему твердотельные накопители намного лучше справляются с огромной последовательной записью.

Damon
источник
Даже если DLL перемещена, единственное, что нужно для ее возвращения, - это перемещенный адрес. Переезд является детерминированным процессом и может быть повторен.
MSalters
"Собери пиши"? Вы имеете в виду "Скорее, пиши"?
Питер Мортенсен
3
@PeterMortensen: Нет, я действительно имею в виду « собирать, писать» (в отличие от разбросанного чтения). Это означает запись в один файл при сборе данных из разных мест. Вы предоставляете массив структур, каждая из которых содержит начальный адрес и длину (со строгими требованиями выравнивания). Операционная система передает их контроллеру, а оборудование делает все остальное.
Деймон
1
@MSalters: Но перемещение создает личную копию страницы, и тогда очень трудно определить, были ли внесены какие-либо другие изменения в частную копию. Сравните с отображениями, не требующими исправления, и используйте копирование при записи. Если будут сделаны другие изменения, будет личная копия. Если нет, страница все равно будет настроена для CoW.
Бен Фойгт
1
@MSalters Это может быть детерминированный процесс, но это не означает, что код гибернации работает на том же уровне программного стека, что и компоновщик. Если гибернация находится на уровне ядра, а связывание - на уровне пользователя, гибернация не может делать какие-либо предположения относительно того, что делает компоновщик.
Касперд
10

Он не сбрасывает всю оперативную память в спящем режиме.

У него уже будет большая часть ОЗУ, уже дублированная на диске. Это не только позволяет быстро переходить в спящий режим, но и позволяет быстро выделять память для новых программ (чтобы они могли быстро запускаться).

Поэтому нужно всего лишь написать небольшую часть 4 ГБ, и это можно сделать за 10-15 с.

От Microsoft :

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

Питер Кротти
источник
2

В дополнение ко всему вышесказанному, я думаю, есть несколько других факторов.

Одним из них является то, что при копировании файла, файл должен быть прочитан и записан; Hybernation требует только файл для записи. Это по определению уже в памяти!

Точно связанный с этим, при чтении файла и одновременной его записи для экономии памяти процесс выглядит следующим образом: чтение фрагмента, запись фрагмента, обновление каталога (отображение нового размера); читать чанк, писать чанк, обновлять каталог.

Каждый раз, когда вы перемещаетесь с одной части диска на другую (например, читаете файл a, чтобы записать файл b, пишите файл b, чтобы записать каталог, и пишите каталог, чтобы прочитать следующий фрагмент), который должен искать диск - перемещайте головки, позвольте головкам успокоиться, дождитесь появления правой части диска. Это одно из преимуществ твердотельного диска - поиск занимает совсем немного времени. При переходе в спящий режим данные записываются непрерывно. Файл гибернации (подкачки) предварительно выделяется, поэтому каталог не нужно обновлять (вы не меняете размер файла гибернации, а только его содержимое).

И, наконец, ваш компьютер приостановил все остальные задачи - это ЕДИНСТВЕННАЯ вещь, которую он делает (я сомневаюсь, что это будет иметь большое значение, но он обязательно сделает некоторые!). Даже такие вещи, как управление памятью и переключение задач приостановлены.

AMADANON Inc.
источник
Это должно иметь огромное значение!
Легкость гонок с Моникой
@LightnessRacesinOrbit: состязание ЦП вряд ли будет иметь какое-либо значение. Отсутствие конфликта ввода-вывода является большой проблемой, но в этом ответе уже говорилось, что поиск убивает производительность, а поиск, а не отсутствие общей пропускной способности, является основной проблемой конфликта ввода-вывода.
Бен Фойгт
@BenVoigt: Да, я согласен. И когда у вас есть 40 процессов, пытающихся что-то делать на диске, это существенно увеличивает поиск дисков. (tl; д-р я не говорил о конфликте процессоров)
Легкость гонок с Моникой
@LightnessRacesinOrbit: Это кажется ... необычным даже при нормальной работе (все, кроме входа и выхода из спящего режима). Я знаю, что когда я ловлю фоновую задачу, попавшую на диск, я удаляю присоску и заменяю ее чем-то, что обращается к диску только тогда, когда я что-то спрашиваю.
Бен Фойгт
@BenVoigt: это кажется маловероятным. Регистрация демонов является наиболее очевидным контрпримером, за которым следуют такие вещи, как обновления дрифтового файла ntpd. Я не утверждаю, что любой из этих примеров имеет большой эффект, но я не думаю, что разумно ожидать, что никакие фоновые задачи не коснутся диска автономно.
Легкость гонок с Моникой
0

Вероятно, это связано с тем, что ОЗУ имеет гораздо более высокую скорость ввода / вывода, чем жесткий диск, поэтому ОЗУ может выводить содержимое в нем так быстро, как может читать жесткий диск.

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

Уилф
источник
9
но все же ОС необходимо записать данные 4 ГБ ОЗУ на диск, что определяется узким местом ввода / вывода
кодер
Также при условии благоприятных параметров это означает, что во время гибернации скорость записи на моем Диске возрастает от 40 МБ / с до ~ 260 МБ / с. Это может быть правильным?
кодировщик
1
Вероятно - не должно быть слишком большого количества узких мест ввода / вывода, так как ему нужно только записать данные (возможно, что-то на месте, так что он знает, что он не будет перезаписывать что-то и куда помещать данные, чтобы он не нужно читать диск слишком много). На моем (linux с двойной загрузкой) ноутбуке я могу использовать dd if=/dev/zero of=/tmp/output.img bs=8k count=256kи получить 1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s, так что это кажется возможным (я добавлю, что копирование файлов в Windows в любом случае занимает слишком много времени).
Уилф
Вы также можете получить намного более быструю передачу при копировании файлов через локальный интернет. Также может не потребоваться копирование всего содержимого в ОЗУ - некоторые данные в ОЗУ могут быть просто кэшированы и не нужны для восстановления системы при выходе из спящего режима.
Уилф
Я только что попробовал бенчмарк dd в моей системе. Он никогда не превышал 52 МБ / с: / (старая машина). Однако я верю, что «возможно, что-то на месте, поэтому он знает, что он не будет перезаписывать данные и куда помещать данные, чтобы ему не нужно было читать диск». Слишком много - это ключ к быстрой скорости.
кодер