Я использую sid Debian, жесткий диск, отформатированный в ext4, работающий на Linux 3.1
Я помню, в предыдущих версиях Linux (может быть, до 3.0), если у меня не хватает памяти, а подкачка не включена, программы обычно вылетают. Это идеально подходит для моей среды: простой просмотр веб-страниц без критических операций. То есть, если я случайно наткнулся на плохой веб-сайт, который использует слишком много памяти, он просто падает, не делая мой терминал непригодным для использования.
Но в моей текущей настройке компьютер зависает с высокой пропускной способностью ввода / вывода в фоновом режиме. iotop показывает, что kswapd0 является виновником, что означает, что это происходит из-за обмена. После использования, swapon -s
чтобы определить любые свопы, которые были включены, я использовал, swapoff -a
чтобы отключить все свопы и swapon -s
снова, чтобы подтвердить, что все свопы были отключены.
Затем я попытался максимизировать использование памяти снова. Увы, такого поведения я не ожидал. Вместо этого kswapd0 снова и снова пытается выгрузить ОЗУ и завершается неудачно, так как нет места подкачки. Поскольку он никогда не сдается, мой компьютер заблокирован в режиме вечной заморозки ввода-вывода, что плохо сказывается на здоровье моего диска.
Я делаю что-то не так, пытаясь swapoff -a
? Почему поведение отличается от того, что было раньше (вероятно, до 3,0 раз)?
swapoff -a
себя , если есть материал в свопе, будет генерировать много I / O (и может привести к процессам быть убитым , если не хватает реального RAM Availabe). Вы уверены, что это не то,swapoff -a
что вызвало "шторм" ввода / вывода?fstab
строку о свопе. Попробуйте, если поведение такое же.swapoff -a
должен отключить swap навсегда, что означает, что он должен оставаться отключенным после следующей перезагрузки. Я подтвердил это. Тем не менее, "шторм" ввода / вывода все еще происходит во время сеанса после следующей перезагрузки. Для записи, "шторм" ввода / вывода не произошел в тот момент, когда я это сделал,swapoff -a
потому что своп был 0 в то время.swapoff -a
является постоянным.Ответы:
Отключение свопа не будет делать то, что вы хотите. Вы все равно получите высокую пропускную способность ввода / вывода, но это будут чистые страницы, а не грязные.
Без обмена система сжимает кэш чистых (неизмененных) страниц почти до нуля, потому что это единственные страницы, которые можно извлечь из физической памяти. Он может только изгнать грязные (измененные) страницы из памяти, записав их в файл подкачки, без подкачки, он не может изгнать грязные страницы.
Когда у вас заканчивается физическая память, каждому процессу придется загружать свои кодовые страницы с диска, поскольку он вытесняет предыдущие кодовые страницы процесса. Результатом будет сильное избиение и чрезмерная работа, выполняемая подсистемой подкачки.
Это особый случай очень важного принципа: для хорошо спроектированной системы нельзя улучшить ее работу, сократив выбор. Linux - это хорошо продуманная система. Удаление свопа дает ему меньше вариантов, поэтому неудивительно, что он ведет себя хуже.
источник
cat /proc/meminfo
на любом типичном Linux-компьютере после нескольких часов загрузки.Лучшее решение, чем отключение подкачки, которая в лучшем случае приведет к гибели случайных процессов при нехватке памяти, - это установить предел сегмента данных для процессов, которые вытаскивают ресурсы из сети. Таким образом, сбежавший браузер достигнет предела и умрет, а не приведет к непригодности всей системы. Пример из оболочки
Число после -d в килобайтах. Вы должны поэкспериментировать с этим в своей системе, чтобы выбрать лучшее значение для ваших привычек просмотра. Скобки приводят к созданию подоболочки; команда ulimit влияет только на эту оболочку и ее дочерние элементы, изолируя ее эффекты от родительской оболочки.
источник
chromium
процессов, использующих небольшие куски памяти?Чтобы убедиться, что подкачка не используется, лучше не допускать добавления подкачки при загрузке. Это может быть сделано, в зависимости от системы, отключив
swap
службу загрузки или просто закомментировать запись в своп/etc/fstab
.Что касается вашего зависания,
stop()
функция in/etc/init.d/swap
может дать подсказку:Обратите внимание на часть о тупике . Вы можете попробовать сделать
umount -a -t tmpfs
себя, прежде чем выключить своп.Редактировать:
Возможно, вы также можете достичь своей цели, изменив
sysctl
настройки (см. Этот вопрос ).источник
swap
вinit.d
, ни у меня егоfstab
, но у меня есть ,/etc/init.d/mountoverflowtmp
что крепленияtmpfs
для записи аварийного журнала. Демон свопаtmpfs
тоже использует ?grep -RF swap /etc/
если хотите найти его. Но чтобы отключить службу, вы должны использовать такую командуservice
(IIRC; я не использую Debian сам).tmpfs
, потому чтоtmpfs
это файловая система в оперативной памяти (RAM). Но другие службы / программы, которые используют,tmpfs
могут полагаться на своп в особом порядке. Я действительно не знаю, но это может быть связано с кэшированием или особым способом, которымtmpfs
драйвер запрашивает доступ к пространству подкачки.swapoff
и черезvm.swappiness=0
. Покаkswapd0
еще бежит! Интересно, регрессия ли это за 2,4 дня…Лучше закомментировать запись раздела подкачки,
/etc/fstab
чем запускатьswapoff -a
после каждой загрузки.У меня та же проблема с kswapd0 на моем оборудовании.
Настройка
vm.swappiness
параметров системы мне не помогает.Я погуглил и прочитал много постов, списков рассылки, и теперь я думаю, что это ошибка ядра.
Когда нет активного раздела подкачки и свободная память становится меньше некоторого порога (в моем случае около 300 МБ), система перестает отвечать из-за безумия kswapd0.
Вероятно, это воспроизводится с особой конфигурацией и условиями.
Для кого-то это решается переустановкой системы с переразметкой для других путем создания собственного ядра с
kswapd0
отключенным.источник
kswapd0
сходит с ума и у вас не активирован своп, значит, вам не хватает оперативной памяти. Вы можете выбрать OOM Killer илиkswapd0
. Linux идетkswapd0
дальше, потому что ядро предполагает, что более важно закончить медленно, чем прервать процесс. Для случайных людей порог, в котором ядро думает, что достаточное продвижение вперед все же происходит, уже ледниково медленный, и почти любой предпочел бы выбрать OOM Killer.В моей системе (Debian SID 2016-11-15) я сделал это:
отключите своп сейчас:
закомментируйте строку с разделом подкачки в / etc / fstab
отключить монтирование swap в systemd:
Было бы достаточно. В
/etc/initramfs-tools/conf.d/resume
файле есть ссылка на своп . Я не знаю, какова цель этого. Может быть, этот файл будет проблемой при следующей перезагрузке (пока я не пытаюсь перезагрузиться, мое время работы драгоценно;)).источник
Я нашел один способ (пока), чтобы избежать этого. Если вы хотите протестировать его и посмотреть, как он работает в вашей системе, посмотрите исправление ядра внутри этого вопроса . По сути, он не высвобождает
Active(file)
страницы (по крайней мере), когда находится под давлением памяти, таким образом, перебрасывание диска (постоянное чтение) сводится практически к нулю, и OOM-killer разрешается запускаться в течение 1 секунды, вместо того, чтобы заморозить ОС для того, что кажется как навсегда (или хотя бы на много минут). Я надеюсь, что настоящие программисты (из которых я не являюсь) улучшат патч и превратят его в реальное решение, теперь, когда они видят, что он работает для этих ситуаций.источник
echo 1 | sudo tee /proc/sys/vm/drop_caches
когдаActive(file):
(of / proc / meminfo) превышает 2 ГБ (в 16-ГБ ОЗУ) - это может доходить до 4 ГБ