Почему частично полное ОЗУ вызывает задержку?

53

Почему частично полное ОЗУ (скажем, 80%) заставляет устройство сильно зависать, даже если есть место для хранения большего количества данных? Я ожидаю, что он продолжает работать хорошо до 99%.

Я замечаю, что на мобильном устройстве больше, чем на ПК, поскольку у него меньше оперативной памяти, например, у моего мобильного телефона 2 ГБ ОЗУ; когда у меня меньше 1 ГБ свободной памяти, это сильно отстает! Почему это происходит, несмотря на то, что он все еще имеет ~ 1 ГБ для использования?

Мухаммед Нурельдин
источник
28
Я подозревал, что вы предполагаете, что доступная оперативная память не используется. Итак, вы видите 20% доступной оперативной памяти и думаете, что используется только 80% оперативной памяти. Это неверно, оперативная память может быть как используемой, так и доступной. (Например, машина, которую я сейчас использую, имеет 32 ГБ ОЗУ и доступно 21,1 ГБ, но бесплатно только 1,8 ГБ.)
David Schwartz
2
Вы имеете в виду мое свободное место на жестком диске с моей оперативной памятью? Ужасно нет.
Мохаммед Нурельдин
3
Их можно заменить, конечно. Но это окажет огромное негативное влияние на производительность - именно так, как вы видите. Если рабочий набор превышает ОЗУ, производительность будет ужасной, независимо от того, сколько ОЗУ доступно.
Дэвид Шварц
3
Что заставляет вас думать, что это процент оперативной памяти, что делает устройство лаг?
enkryptor
4
@ MohammedNoureldin Я думаю, должна быть причина, по которой ваша RAM занята (несколько процессов работают и что-то делают). Это может быть той же причиной, почему устройство отстает. Загрузка ОЗУ может быть только симптомом, а не самой причиной.
enkryptor

Ответы:

70

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

Здесь есть 2 основных принципа:

  1. Общая сумма всего, что должно быть в ОЗУ, и тех вещей, которые могут быть полезны в ОЗУ, почти всегда больше, чем размер ОЗУ. Вещи, которые могут быть полезны в ОЗУ, включают рабочие наборы процессов и резервный список. Последний содержит данные и код, которые когда-то были в активном использовании, но с тех пор перестали работать. Многое из этого будет использовано снова, а некоторые довольно скоро, поэтому полезно хранить это в оперативной памяти. Эта память действует как своего рода кеш, но на самом деле она не так важна, как в категории доступной памяти. Как и свободная память, она может быть быстро предоставлена ​​любой программе, которая в этом нуждается. В интересах производительности резервная память должна быть большой.

  2. Частота использования блоков памяти далеко не случайна, но может быть предсказана со значительной точностью. Память делится на блоки, часто 4 байта. Доступ к некоторым блокам осуществляется много раз в секунду, в то время как другие блокировались без доступа в течение многих минут, часов, дней или даже недель, если система работала достаточно долго. Между этими двумя крайностями существует широкий диапазон использования. Диспетчер памяти знает, какие блоки были доступны недавно, а какие нет. Разумно предположить, что к блоку памяти, к которому недавно обращались, скоро потребуется снова. Память, к которой недавно не обращались, вероятно, не понадобится в ближайшее время. Многолетний опыт доказал, что это действительный принцип.

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

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

Все становится сложнее, когда увеличивается нагрузка. Общая сумма используемых данных и кода больше, но размер оперативной памяти остается неизменным. Это означает, что меньшее подмножество этого может быть сохранено в RAM. Некоторые из недавно использованных данных больше не могут быть в оперативной памяти, но должны быть оставлены на диске. Менеджер памяти очень старается поддерживать хороший баланс между памятью в активном использовании и доступной памятью. Но по мере увеличения рабочей нагрузки диспетчер памяти будет вынужден предоставлять больше доступной памяти для запущенных процессов. Это не очень хорошая ситуация, но у менеджера памяти нет выбора.

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

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

LMiller7
источник
1
Ваш ответ мне очень помог, спасибо! Это memory mangerчасть моего OSправа? так что, если бы я имел дело с указателями и этими очень низкоуровневыми вещами, сможет ли он по-прежнему делать пейджинг?
Мохаммед Нурельдин
7
Диспетчер памяти является частью ОС. Пейджинг является основной функцией диспетчера памяти и так же важен для работы, как дыхание для вас и для меня. Его нельзя остановить.
LMiller7
2
@MohammedNoureldin: Когда вы пишете приложения пользовательского пространства (чьи представления памяти изолированы от ядра и других процессов), вы не можете напрямую обращаться к физической памяти . Все, к чему вы можете получить доступ - это просмотр памяти, который управляется - как вы уже догадались - менеджером памяти со всеми его функциями (возможно), включая подкачку страниц. Указатели памяти ссылаются только на точки в адресных пространствах представления памяти. Это языковая концепция, используемая как в ядре, так и в коде пользовательского пространства, но это не означает, что два представления памяти идентичны. Не путайте управление памятью процесса с ядром MM!
Дэвид Фёрстер
6
Это «очевидно» или «хорошо известно», но, возможно, все же следует добавить в этот ответ: память (ОЗУ) в 1000 раз быстрее жесткого диска (ну, это зависит от многих вещей, например, ssd / ide / sata и т. д.). ОС выполняет код из оперативной памяти (+ кеш), а не с диска. Когда памяти становится мало, и ОС необходимо «поменять» части («неиспользуемого») кода из памяти на диск, чтобы освободить оперативную память для выполнения чего-то другого, это займет «много» времени (подкачка), и если это происходит часто (например, у вас много программ, каждая из которых нуждалась в обмене, чтобы их код был загружен в память), это сильно замедлит работу.
Оливье Дюлак
3
Обычно мы не используем термин «своп» для обозначения загрузки кода в память. Обычно это называется «ошибка». Обычно термин «своп» используется только для информации, которая должна быть записана на диск, прежде чем она может быть извлечена из ОЗУ.
Дэвид Шварц
29

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

Майк Скотт
источник
11
На самом деле, приложениям не нужно «очищать» кеш. Они просто запрашивают оперативную память у ОС. ОС, видя, что у нее нет неиспользуемой оперативной памяти, очистит часть файлового кэша и отдаст теперь обнуленную оперативную память приложению. Приложение не может сказать, откуда взялась эта оперативная память.
MSalters
5
@MSalters Да, я согласен, приложение запрашивает оперативную память, а ОС очищает кеш при необходимости. Я пытался сделать это простым.
Майк Скотт,
Это было довольно ясно, но я немного больше осведомлен о деталях, поэтому у меня такое чувство, что чего-то не хватает, и мне нужны более подробные ответы. Ответ @LMiller помог мне на самом деле, было бы здорово, если бы вы могли пересмотреть информация в нем.
Мухаммед Нурельдин
4

Этот ответ был в основном переписан, чтобы реорганизовать структуру и сделать сообщение более понятным. Я также открыл его как ответ сообщества вики; Не стесняйтесь редактировать.

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

vRAM находится в системном хранилище, обычно на жестком диске или в других значительных хранилищах.

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

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

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

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

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

Узнайте больше о разбивке здесь !

Большое спасибо авторам этого ответа, включая Дэниела Б , Ксеноида и Джона Бентли .

Уилл
источник
3
Это не значит, что избиение является преднамеренным. Это просто побочный эффект подкачки и конкуренции за физическую память. Кроме того, виртуальная память не «создается» путем перемещения страниц на диск.
Даниэль Б,
Правда, побои - это побочный продукт, но он чрезвычайно полезен в тех случаях, когда процессы запускаются, что помогает предотвратить тупик. И да, виртуальная память занята, а не создана. Я буду редактировать что в.
Волю
8
Нет, вы путаете мусор и пейджинг. Трашинг просто становится патологическим.
ксеноид
@xenoid Paging - схема управления памятью; Это все равно, что сказать, что я путаю оленей с моей машиной и системой шоссе. Обмолота - это процесс, который вызывает это падение производительности; Я, однако, согласен с вами, что это результат системы подкачки.
Будет ли
1
Комментарии включены, сделаны в вики ответ, не стесняйтесь редактировать.
Будет ли
1

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

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

Жиль Лезире
источник
ROM - это просто номенклатура для HD, когда речь идет о кэшировании, разбиении на страницы и т. Д. Все, что не является рабочей памятью. А ПЗУ обычно медленнее ОЗУ, почти всегда были. Старые компьютеры копировали данные из ПЗУ в ОЗУ (ROM Shadowing) при загрузке, потому что это работало быстрее.
Жиль Лезире
1
Конечно, но ROM и RAM также используются в качестве энергонезависимой по сравнению с энергозависимой памятью? Кстати, ROM обычно медленнее, ROM копируется в RAM (ROM Shadowing) при загрузке для повышения производительности. Но конечно, я изменю одну ссылку, чтобы исправить твои придирки. ;)
Жиль Лезире
1

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

  1. Регистры процессора - На практике регистры доступны в течение 1 цикла процессора . Учитывая, что процессоры выполняют миллиарды циклов в секунду (3 ГГц = 3 миллиарда циклов в секунду), это безумно быстро.
  2. Кэш процессора - зависит от уровня, но они все еще довольно быстрые (3-5 циклов доступности для кэша L1).
  3. Оперативная память (RAM) - случайная часть означает, что вы не знаете, в каком состоянии она находится, когда вы получаете к ней доступ. Подумайте о доставщике посылок, который должен остановиться, поднять посылку, пройти к двери, позвонить в дверь и ждать ответа. Может быть, вы совсем не ждете, или, может быть, вы подождете минуту или две, пока миссис Смит не подойдет к двери в задней части дома. С практической точки зрения, мы говорим где-то от 14-27 циклов (в зависимости от того, в каком состоянии была RAM, когда мы обращались к ней).
  4. Жесткий диск - здесь сейчас идет физический процесс, и, хотя он происходит настолько быстро, насколько это возможно, вы ожидаете перемещения головок и дорожек для перемещения под этими головками. С практической точки зрения, жесткий диск на 7200 об / мин может совершить оборот за 4 мс или около 750 000 циклов для процессора с частотой 3 ГГц . Это медленно.

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

Но затем вы возвращаетесь к документу! Теперь VMM должен загрузить все эти данные обратно с жесткого диска. Хуже того, если у вас мало оперативной памяти, теперь нужно перенести другие данные (больше азартных игр) на жесткий диск, чтобы освободить используемое пространство. Linux любит жить на грани. Он заполнит большую часть оперативной памяти часто используемыми данными (отлично подходит для серверов с небольшим количеством процессов).

Machavity
источник
1
Да, менеджер памяти - игрок, но это очень легко понять неправильно. Если бы доступ к памяти был действительно случайным, то диспетчер памяти был бы неправильным так же часто, как и правильный, и вся система сломалась бы. Но программы имеют тенденцию демонстрировать сильную местность ссылки. То есть большинство обращений к памяти имеют тенденцию быть локализованными в относительно небольшой области памяти. Они движутся, но достаточно медленно, чтобы система работала. Шансы складываются в пользу менеджеров памяти, а ошибки быстро исправляются. Это доказано многолетним опытом
LMiller7
Случайное в памяти с произвольным доступом относится к тому факту, что вы можете получить любой случайный доступ к нему. (В отличие от необходимости ждать, пока данные пройдут под считывающими головками, как на жестком диске или лентах, а затем получить доступ к данным последовательно.).
Фил
0

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

codykochmann
источник