Я нашел другой ответ, который, вероятно, лучше подходит. Как оказалось, современные версии ядра Linux, помимо прямого и периодического восстановления, имеют медленное выделение памяти, когда kswapd просыпается после того, как не может выделить непрерывный кусок памяти.
После пробуждения kswapd проверяет водяные знаки зон. Однако, как оказалось, водяные знаки — это не статические номера уровней -зон, которыми они могли быть когда-то. Скорее, они специфичны для порядка распределения.
. При принятии решения о том, следует ли перебалансировать зону, kswapd учитывает порядок неудачного запроса на выделение, вызвавшего ее. Поэтому, если память достаточно фрагментирована, kswapd придется поработать.
При перебалансировке зоны у kswapd будет выбор между сокращением файлового кэша и кражей анонимных страниц из пользовательских процессов (, если подкачка не отключена полностью ). Итак, остается вопрос --, почему kswapd выбирает последний вариант. Я думаю, что ответ снова фрагментация. --Я думаю, что алгоритм восстановления может иметь способ узнать, что страницы, полученные в результате сжатия файлового кеша, могут физически не быть смежными.
Вообще говоря, не только в последних версиях ядра добавлена дефрагментация памяти, но и грань между высвобождением кадров страниц и уплотнением памяти несколько размыта.
К сожалению, все классические учебники по ядру Linux были написаны на основе ядра версии 2.6 или более ранних, поэтому они могут вводить в заблуждение.
Если вы используете простую команду chroot
, а не специфичную для дистрибутива -оболочку, такую как arch-chroot
, вам необходимо смонтировать виртуальные файловые системы /dev
, /proc
и /sys
перед chroot, иначе многие команды будут сообщать о странных ошибках, поскольку они не смогут получить доступ к тому, что им нужно.
В большинстве современных систем Linux, если корневая файловая система, требующая исправления, смонтирована в /mnt/arch/@/
, следующие команды должны работать:
sudo mount -o rbind /dev /mnt/arch/@/dev
sudo mount -t proc none /mnt/arch/@/proc
sudo mount -t sysfs none /mnt/arch/@/sys
sudo chroot /mnt/arch/@
Чтобы отменить приготовления:
exit # = come back out of the chroot
sudo umount /mnt/arch/@/sys
sudo umount /mnt/arch/@/proc
sudo umount /mnt/arch/@/dev