Видео ролики бесплатно онлайн

Смотреть молодые видео

Официальный сайт teledu 24/7/365

Смотреть видео бесплатно

Zereal 09.09.2010 23:26

Перевод статей про ЛинуксУплотнение памяти

Уплотнение памяти
Оригинал

Интегрирован механизм уплотнения памяти (memory compaction), позволяющий снизить фрагментацию внешней памяти за счет перемещения нескольких использованных страниц памяти в один блок большего размера, состоящий из непрерывно следующих друг за другом занятых страниц.

В итоге, после выполнения операции упаковки, вместо перемешанного набора свободных и занятых непрерывных страниц памяти, получается один большой блок с используемыми страницами и один большой блок со свободными страницами. В дальнейшем это упрощает проведения операций по выделению больших областей памяти. Инициировать уплотнение всей памяти можно записав любое значение в файл /proc/sys/vm/compact_memory;" OpenNews


На LWM.net много раз описывали проблему фрагментации памяти. Вкратце: когда система работает, страницы, как правило, разбросаны между пользователями. Это затрудняет поиск необходимых групп физически-смежных страниц. На избежание необходимости применения многостраничного выделения памяти, когда это возможно, было затрачено много усилий .В результате этого большая функциональность ядра не страдает от страничной фрагментации. Но многостраничное выделение памяти все еще применяется; код, который нуждается в таких выделениях, может "провалиться" на фрагментированных системах.

Надо признать, что, с одной стороны, эта проблема усложняется. Современные процессоры не ограничены размером страниц в 4K; они могут работать со страницами гораздо большего размера («huge pages») в частях адресного пространства процесса. Там может быть реальный прирост производительности при использовании страниц большего размера, главным образом, в результате снижения нагрузки на буфер ассоциативной трансляции (TLB - Translation lookaside buffer) процессора. Но использование страниц большего размера требует, чтобы система могла найти физически-смежные зоны памяти, которые должны быть не только достаточно большими, но и правильно выверены. Поиск такого типа зон может быть достаточно сложной задачей на постоянно запущенных системах.

На протяжении многих лет разработчики ядра делали многочисленные попытки решить проблему. Результатом стали методы вроде ZONE_MOVABLE и lumpy reclaim. Есть еще много чего, что можно сделать, в особенности в области остановки (fixing fragmentation) для восстановления больших участков памяти. Не так давно, после перерыва, к решению это проблемы вернулся Мэл Горман с новым патчем, реализующим уплотнение памяти. Посмотрим, как этот патч работает.

Представьте себе очень маленькую зону памяти, которая выглядит следующим образом:

compaction1.png

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

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

compaction2.png

Между тем, в верхней части зоны другая половина алгоритма создает список свободных страниц, которые могут быть использованы как цель перемещения страницы:

compaction3.png

В конце концов два алгоритма встретятся где-то к середине этой зоны. К этому моменту, остается главным образом только вопрос вызова page migration code (который теперь доступен не только для NUMA систем) для перемещения свободных страниц в свободное пространство верхней зоны, получая красивую картинку вроде этой:

compaction4.png

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

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

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

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

Выполнение алгоритма уплотнения может быть вызвано двумя способами. Первый заключается в записи номера узла в /proc/sys/vm/compact_node. Вызываемое уплотнение будет происходить на указанном узле NUMA. Другой — для системы, терпящей неудачу в попытке выделить старшие страницы. В этом случае уплотнение будет работать как предпочтительная альтернатива освобождению страниц через непосредственное возвращение. Алгоритм уплотнения не запустится, если нет явного указания на запуск. Это плата за перемещаемые страницы, и этого лучше избегать, если нет настоящей необходимости.

Мэл прогнал некоторые простые тесты, показывающие, что с включенным уплотнением, он смог выделить более 90% памяти системы как huge pages (страницы большого размера, более 4К) одновременно уменьшая количество необходимой востребованной деятельности. Таким образом, это похоже на немного полезной работы. Это код управления памятью, хотя, количество времени, необходимого чтобы попасть в основную ветку ядра, предсказать заранее нелегко.

Переведено dementiy и опубликовано с небольшой редактурой по его просьбе. Благодарности прежде всего ему (а шишки мне =) ).
Скачать русскую версию одним файлом.


Тэги: LWN перевод уплотнение памяти
+ 10 -
Похожие Поделиться

goblinyara 09.09.2010 23:36 #
+ 1 -
спасибо, конечно, за перевод, но фраза
который больше не является только для NUMA систем

покоробила...
dementiy 09.09.2010 23:36 #
+ 2 -
Еще хотел кое-что дополнить. На lwn.net большое количество отличных статей, которые в общих чертах не углубляясь в технические детали опиисывают те или иные аспекты работы системы. Может быть найутся желающие сделать серию переводов?
Zereal 09.09.2010 23:37 #
+ 0 -
займемся этим для WM в перспективе.
digiwhite 10.09.2010 08:04 #
+ 2 -
Теперь у нас есть хороший, 8-страничный
смежный участок свободного места, который
при необходимости может быть использован
для удовлетворения многостраничного
выделения .

Я бы перевел как:"Теперь у нас есть непрерывный 8-и страничный блок памяти, который, при необходимости, может быть предоставлен операциям выделения памяти более высокого порядка".
dementiy 10.09.2010 13:12 #
+ 2 -
Вы любые уточнения Zereal отправляйте, она думаю поправит. Коллективно исправим перевод и доведем его до ума.
digiwhite 10.09.2010 08:14 #
+ 2 -
За перевод спасибо. Но есть моменты, которые мне не нравятся. Т.е. некоторые фразы выглядят как-то слишком несвязно. Вечером после работы, если осилю, поробую предложить свои взгляды. С коммуникатора делать это не очень удобно.
wiz 10.09.2010 11:17 #
+ 1 -
Ээ... И что? В каких версиях это реализовано и когда? Где это используется? Как вообще от этого профит получить?
dementiy 10.09.2010 13:24 #
+ 0 -
Уплотнение памяти было включено в последнюю версию ядра (2.6.35), ранее это был патч. А если не складывается общая картина, то я уже говорил, что надо сделать серию переводов (или кто-то может сам рассказать), которая описывала бы механизм работы памяти в общих чертах (именно в общих, так как у автора оригинала статьи есть книга на 700 страниц только про виртуальную память).
HTaeD 11.09.2010 19:39 #
+ -1 -
'CONFIG_COMPACTION=y' в конфиге ядра.
wiz 11.09.2010 19:43 #
+ 1 -
Это многое объясняет!

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн