Ядро Linux выгружает большинство страниц из памяти, когда я запускаю приложение, которое использует большую часть 16 ГБ физической памяти. После завершения приложения каждое действие (ввод команд, переключение рабочих областей, открытие новой веб-страницы и т. Д.) Занимает очень много времени для завершения, потому что соответствующие страницы сначала необходимо прочитать обратно из свопинга.
Есть ли способ заставить ядро Linux копировать страницы из раздела подкачки обратно в физическую память, не касаясь (и не ожидая) каждого приложения? Я запускаю много приложений, поэтому ждать всегда больно.
Я часто использую, swapoff -a && swapon -a
чтобы заставить систему реагировать снова, но это очищает страницы от свопинга, поэтому их нужно записать заново при следующем запуске скрипта.
Есть ли интерфейс ядра, возможно, использующий sysfs, чтобы дать команду ядру прочитать все страницы из раздела подкачки?
Редактировать: я действительно ищу способ сделать все из swapcached. (Спасибо, Дероберт!)
[PS serverfault.com/questions/153946/… и serverfault.com/questions/100448/… являются смежными темами, но не затрагивают вопрос о том, как заставить ядро Linux копировать страницы из подкачки обратно в память без очистки подкачки.]
Ответы:
На основе программы memdump, изначально найденной здесь, я создал скрипт для выборочного чтения указанных приложений обратно в память.
remember
:Использование: что-то вроде
Он быстро пропускает неиспользуемую память (гигабайт в секунду) и замедляется при необходимости подкачки.
источник
Это может помочь увеличить
/proc/sys/vm/page-cluster
(по умолчанию: 3).Из документации ядра (
sysctl/vm.txt
):В документации не упоминается ограничение, поэтому, возможно, вы могли бы установить этот абсурдно высокий уровень, чтобы все свопы могли быть прочитаны очень скоро. И, конечно, поверните его обратно к нормальному значению впоследствии.
источник
page-cluster
значения может улучшить производительность.Вы можете попытаться добавить программы, которые вам больше всего нужны , в cgroup и настроить подкачку так, чтобы при следующем запуске приложения добавленные вами программы были менее вероятными кандидатами на обмен.
Некоторые из их страниц, вероятно, все еще будут заменены, но это может обойти ваши проблемы с производительностью. Большая часть этого, вероятно, просто поведение «останови и запусти», когда многие страницы программы находятся в режиме подкачки, и программе приходится постоянно приостанавливать работу, чтобы свопить ее страницы в ОЗУ, но только с шагом 4 КБ.
В качестве альтернативы, вы можете добавить приложение, которое работает, в cgroup и настроить подкачку так, чтобы приложение использовало файл подкачки чаще всего. Это замедлит работу приложения, но избавит остальную часть системы.
источник
Мне кажется, что вы не можете волшебным образом «заставить систему реагировать снова». Вы либо несете штраф, либо читаете страницы обратно из пространства подкачки в память сейчас, либо переносите его позже, но тем или иным способом вы берете это на себя. В самом деле, если вы делаете что-то подобное,
swapoff -a && swapon -a
вы можете почувствовать больше боли, а не меньше, потому что вы заставляете некоторые страницы копироваться обратно в память, которые в противном случае никогда бы больше не понадобились и в конечном итоге были отброшены без чтения (подумайте: вы выходите из приложения, пока большая часть его кучи выгружается, эти страницы могут быть полностью удалены, даже не возвращаясь в память).Что ж, почти любая страница, которая будет скопирована обратно из раздела подкачки в основную память, все равно будет изменена, поэтому, если ее когда-нибудь потребуется переместить обратно, чтобы снова выполнить обмен в будущем, ее все равно придется заново записывать в раздел подкачки. Имейте в виду, что подкачка - это, в основном, куча памяти, а не страницы только для чтения (которые обычно имеют файловую поддержку).
Я думаю, твой
swapoff -a && swapon -a
трюк так же хорош, как и все, что ты мог придумать.источник
swapoff -a && swapon -a
не будет хорошо для вас. Я думаю, что в этом случае вам нужно что-то, что сканирует/proc/<each-process>/mem
и читает каждую страницу памяти, чтобы убедиться, что она существует в оперативной памяти. Не знаю, существует ли это.Здесь очень хорошая дискуссия http://rudd-o.com/ru/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that которая сводится к уменьшению перестановки, с идеей, что для увеличения воспринимаемой отзывчивости системы следует предотвратить выгрузку кода (и это то, что происходит). Это не совсем ответ на ваш вопрос, но это может помешать появлению проблемы (ваши приложения просто не меняются местами, только неиспользуемые данные и кэш страницы)
источник