Какое значение имеет значение vm.swappiness при использовании zram?

13

Я использую zram на своем компьютере в качестве сжатой подкачки, поддерживаемой RAM. Когда системе необходимо что-то поменять, замена ее на файл подкачки с поддержкой zram более или менее эквивалентна сжатию этих данных в памяти для освобождения места. Это делает замену в большинстве случаев очень быстрой по сравнению с заменой на диске. Из-за этого мне интересно, можно ли добиться какой-то производительности, побуждая систему более агрессивно выменять неиспользуемые ресурсы, поскольку она может сделать это, не попав на диск?

Так кто-нибудь возился с, скажем, установкой vm.swappiness100 при использовании zram? Было бы это желательно?

sysctl -w vm.swappiness=100
Райан К. Томпсон
источник
2
Это отличный вопрос, и я думаю, что некоторые тесты для того, чтобы удалить мнения и получить факты ...
Старейшина Гик
Хорошая идея, и zram мог улучшиться с 2012 года, когда я использовал его в последний раз :-)
Huygens
Сделал небольшой тест и, насколько я могу судить, память, «зарезервированная» для zram, по-прежнему используется в качестве кэша. Если это подтвердится, то я думаю, что может иметь смысл поддерживать низкий уровень перестановки, чтобы избежать циклов ЦП?
Витор

Ответы:

2

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

Первая «проблема», когда ядро ​​хочет, чтобы n страниц было освобождено, m (при m <n, m - это количество сжатых страниц, необходимых для хранения n), вновь создаются в ОЗУ, я не уверен, может ли это нарушить работу ядра или не.

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

Ядро обычно имеет «общую память», которую оно может использовать для своей работы. Когда вы добавляете zram, он учитывается только в памяти «swap», как это было бы с любым дисковым обменом, но это уменьшало фактическую «общую память», а ядро ​​этого не ожидает / не ожидает. Иногда вы можете иметь странное и нежеланное поведение из-за этого!

С zram было бы хорошо, чтобы ядро ​​не слишком сильно менялось в этой области, когда оно находится под давлением памяти. И у вас всегда должен быть реальный раздел подкачки жесткого диска, по крайней мере, больше, чем ваш максимальный размер zram, чтобы система не получала OOM, тогда как в то же время вы увидите много свободного места, о чем сообщает free!

Гюйгенс
источник
zram предоставляет RAM устройства. Все, что записано на эти блочные устройства, сжимается. Если блочные устройства zram используются в качестве подкачки, когда система пытается переместить части памяти для подкачки, она будет эффективно перемещать память из одной части ОЗУ в другую, за исключением того, что данные будут сжаты перед копированием в место назначения. Это эффективно работает как дешевый механизм сжатия памяти для улучшения скорости отклика в системах с ограниченным объемом памяти. ... Zram находится в стадии подготовки с Linux 2.6.33. В 3.14 zram был перемещен из постановки в драйверы / блок / zram.
Старейшина Гик
1
@ElderGeek точно! И я возьму пример, чтобы проиллюстрировать, почему это не идеально. Ядро попытается удалить 64 МБ оперативной памяти, поместив их в своп zram. Сжатый 64 МБ блок теперь 32 МБ. В результате объем памяти уменьшился на 32 МБ, а не на 64 МБ. Что происходит, когда приложению требуется 64 МБ обратно в память, ядро ​​копирует (а не перемещает) блок обратно в память. Теперь у вас есть 64 МБ в оперативной памяти + 32 МБ в zram. Зачем копировать? Потому что ядро ​​кэширует страницы, как я объяснил в своем ответе. Оба поведения не идеальны. А когда память плохо сжимается, это еще хуже.
Гюйгенс
Все еще в стадии тестирования. Я думаю, что должен быть какой-то способ настройки алгоритма кэширования, который использует zram для освобождения сжатой страницы, когда она копируется обратно в несжатую память.
Старейшина Гик
Я пробовал это несколько раз до 2012 года. В то время мой компьютер был ограничен 1 ГБ ОЗУ, и во время работы в интернете он был мучительно медленным (у меня обычно 10-50 открытых вкладок). Но с тех пор я никогда не использовал его снова. У меня более чем достаточно оперативной памяти, и я больше не использую своп. Тогда, когда я использовал zram с Firefox, я быстро начал «обмениваться», учитывая, что у меня было мало оперативной памяти. И быстро у меня были не отвечающие системы со многими сбоями. Без Zram это было мучительно медленно, но, по крайней мере, стабильно. Моя проблема заключалась в том, что, вероятно, он постоянно сжимал / распаковывал страницы памяти.
Гюйгенс
Да, мои результаты были несколько схожими, в системе с 8 ГБ я смог заставить OOM, запустив несколько виртуальных машин во время задания кодирования. Есть ли у вас опыт работы с zswap? Кажется, жизнеспособная альтернатива основана на том, что я прочитал.
Старейшина Гик
2

Краткий ответ: vm.swappiness=100это подходящее значение для zram (по крайней мере, в Debian Stretch с Linux 4.9, я считаю, что это лучшее значение)

Я уже проверил vm.swappiness=100для меня.

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

Также я сделал еще одну простую программу для проверки этого вопроса. x На моей машине очень низкое vm.swappinessзначение (например, vm.swappiness=1) вызовет очевидную проблему с отзывчивостью.

О SwapCachedв /proc/meminfo:

Во-первых, попробуйте vm.page-cluster=0, это может уменьшить бесполезность SwapCachedподкачки.

SwapCached может ускорить zram так же, как устройство подкачки без zram

SwapCached может повторно использовать (бесплатно) при необходимости:

./linux-4.9/mm$ grep -rn delete_from_swap_cache
memory-failure.c:715:   delete_from_swap_cache(p);
shmem.c:1115:       delete_from_swap_cache(*pagep);
shmem.c:1645:            * unaccounting, now delete_from_swap_cache() will do
shmem.c:1652:               delete_from_swap_cache(page);
shmem.c:1668:       delete_from_swap_cache(page);
vmscan.c:673:       __delete_from_swap_cache(page);
swap_state.c:137:void __delete_from_swap_cache(struct page *page)
swap_state.c:218:void delete_from_swap_cache(struct page *page)
swap_state.c:227:   __delete_from_swap_cache(page);
swapfile.c:947:         delete_from_swap_cache(page);
swapfile.c:987: delete_from_swap_cache(page);
swapfile.c:1023:            delete_from_swap_cache(page);
swapfile.c:1571:            delete_from_swap_cache(page);
./linux-4.9/mm$ 
неграмотный
источник
0

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

Александр
источник
Я обнаружил, что подкачка с поддержкой zram весьма полезна, когда в системе не хватает памяти. Это спасло меня несколько раз от полного зацикливания на обмене адом и необходимости перезапуска (я анализирую большие наборы данных, поэтому мне нужна память, все 24 ГБ). Мне просто интересно, vm.swappinessнастроено ли значение для свопа на диске и стоит ли его менять, если я в основном буду использовать своп на zram.
Райан К. Томпсон
1
"все быстрее"? Сжатие на лету работало лучше, чем прямой дисковый ввод / вывод в течение более чем десяти лет (оно никогда не будет быстрее, чем доступ к памяти - это не
главное
symcbean, вы забыли "по сравнению со скоростью памяти". Где разногласия?
Александр
Я думаю, что смысл Symcbean заключается в том, что целью страниц с сжатой памятью (zram) является замена подкачки на физический носитель. Причина, по которой «естественное сжатие памяти» не является естественным, заключается в том, что приложениям будет сложно определить, какие части своей памяти можно сжать и когда; подсистема VM - намного более легкое место для реализации этого. Рабочие нагрузки, для которых используется zram, содержат страницы, которых нет в рабочем наборе, и которые можно легко сжать.
Даниэль Папасян