LINUX.ORG.RU
ФорумTalks

Открыл для себя vm.overcommit_memory

 


6

2

Да, я слоупок: более 5 лет пользуюсь линуксом, даже программист вроде как, и только сейчас обнаружил эти отличные опции для `/etc/sysctl.conf`:

vm.overcommit_memory = 2
vm.overcommit_ratio = 100

Перегрузил опции командой `sudo sysctl --system` и попал прямо в райские кущи. Можно открыть браузер, три IDE и запустить виртуалку Virtual Box - и результатом станет не зависание системы намертво с необходимостью делать hard reset, а просто ошибка в Virtual Box (работа виртуальной машины прервана).

Своп отключил ещё раньше, я не хочу, чтобы моя система висла намертво под девизом «я тут данные программы в своп скину, как будто бы памяти достаточно, ты тут посиди пару дней, подожди, пока я закончу». Хотя конечно с точки зрения разработчиков Linux это не зависание намертво, это просто долгая работа со свопом - но я так не считаю и считаю что в линуксе своп надо отключать.

А как вы боретесь с традиционным для Linux зависанием намертво при нехватке памяти?

P.S. для справки, настройку выполнял согласно этому былинному посту: http://avz.org.ua/wp/2011/04/24/overcommit-memory/

★★★★

Последнее исправление: quiet_readonly (всего исправлений: 1)

Ответ на: комментарий от baka-kun

Своп нужен и как замена тоже.

Всё же не замена в чистом виде, а временное хранилище редко используемой «грязной» памяти

Если подходить формально, то вся виртуальная память - временное хранилище. Постоянное - это файлы.

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

Конечно. Но я не вижу, как это противоречит утверждению «своп - это резервная медленная память». Просто использовать эту память можно по-разному.

tailgunner ★★★★★
()
Ответ на: комментарий от vaddd

Пропустил комментарий.

памяти у вас недостаточно

Её никогда не бывает абстрактно «достаточно», только применительно к конкретной задаче.

Даже если у тебя новый Зеон с 3ТБ оперативки, рано или поздно настанет момент решать: вытеснить блок файлового кеша, или исполняемого кода. Что успешно и происходит регулярно при обработке опытного массива данных. Системы, которым всегда достаточно памяти — это узкоспециализированные контроллеры, спроектированные с учетом каждого байта, обычно — системы реального времени.

«редко используемая грязная память» вас напрягает

Именно потому, что болтается в свопе, она меня никак не напрягает. Сейчас на домашнем компьютере примерно 12ГБ кушает Хром, ещё 16ГБ под виртуалкой, порядка 8Гб прочее ПО, остальное — ARC. Занято около 2ГБ свопа. Там всякий ненужный в работе мусор, типа getty на неиспользуемых vty; остатков загрузки и инициализации системы; запущенных когда-то демонов, нужных раз в год; может быть, какие-то давно открытые вкладки — пусть будут, жить не мешают.

любят ссылаться на сию статью фейсбучного инженера

Я не знаю, о какой статье речь, но отключающие своп не понимают его целей: сделать вытесняемой не только немодифицированную файловую память, но и «анонимную» — данные, существующие только в оперативке.

baka-kun ★★★★★
()
Ответ на: комментарий от tailgunner

«своп - это резервная медленная память»

Вот с этим утверждением я соглашусь, а «замена оперативной памяти» только с большими оговорками.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

Её никогда не бывает абстрактно «достаточно», только применительно к конкретной задаче.

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

отключающие своп не понимают его целей: сделать вытесняемой не только немодифицированную файловую память, но и «анонимную» — данные, существующие только в оперативке.

Зачем? Зачем ее вытеснять, если любой нормальный системовладелец должен знать что творится у него в системе? Если в системе пухнет анонимная память или происходит любой другой сорт memory leak -это плохая система или криворукий админ. В нормально сконфигурированной отлаженной системе никогда не возникнет проблемы с анонимной памятью. Ее вытесняют куда-то в своп только не от хорошей жизни. При достатке памяти она лежит себе в ОЗУ и все.

Своп ведь не решает ни одной из этих проблем, а лишь создает новые. Вы попусту гоняете данные туда-сюда. Если у вас в процессе работы растет расход памяти - своп будет точно так же съеден. Даже сам факт существования свопа приводит к тому, что система к нему обращается. Вы что, никогда не замечали, что даже при почти пустой памяти своп вдруг может начать юзаться системой или приложениями? Не будь в этом момент свопа - система бы и не заметила его отсутствия. Я уж не говорю про критичные по времени серверные задачи, где некстати начавшееся свопление недопустимо.

vaddd ★☆
()
Ответ на: комментарий от vaddd

Мы уже поняли, что ты — травмированный нищеброд. Это не отменяет полезности свопа даже когда уперся в пределы материнки по памяти.

t184256 ★★★★★
()

Поменял параметры

vm.overcommit_memory = 2
vm.overcommit_ratio = 150
vm.vfs_cache_pressure = 200
vm.swappiness = 0

Стало намного лучше. Никаких фризов. На своих 16ГБ памяти могу открыть кучу приложений, и только после 10-го прожорливого приложения начинает, видимо, работать OOM killer (прибил мне Chrome и Firefox). И никаких фризов.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от t184256

не отменяет полезности свопа даже когда уперся в пределы материнки по памяти

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

vaddd ★☆
()
Ответ на: комментарий от vaddd

Не к конкретной задаче, а к конкретной системе со своим набором задач.

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

При достатке памяти она лежит себе в ОЗУ и все.

И мешает подтянуть в память больше нужных работающим приложениям данных.

Своп ведь не решает ни одной из этих проблем

Своп решает одну единственную проблему — вытеснить из оперативной памяти не только дисковый кеш или исполняемый код приложений, но и давно неиспользуемые «анонимные» данные, лежащие мертвым грузом.

Если у вас в процессе работы растет расход памяти - своп будет точно так же съеден.

Своп — это не панацея, от недостатка памяти не спасает. Он нужен для оптимальной работы при нормальной загрузке.

даже при почти пустой памяти

В работающей системе память никогда не может быть сколь-нибудь заметно пустой. Иначе система неэффективно её расходует.

при почти пустой памяти своп вдруг может начать юзаться

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

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

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

baka-kun ★★★★★
()
Ответ на: комментарий от vaddd

договаривайте - «когда нет денег на другую материнку».

Тут у людей и при 3ТБ оперативки своп используется. Посоветуй, на что поменять.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

Всё пляшет от задачи, в том числе выбор железа.

Если можно выбрать железо с запасом по памяти - зачем своп?

И мешает подтянуть в память больше нужных работающим приложениям данных.

Не мешает. Все, что нужно приложениям - помещается. Если не помещается - увеличьте память. Если нет денег - тогда уж заводите своп и занимайтесь перекладыванием данных туда-сюда. Знакома вам игра «ханойская башня»? Это то, чем вынужденно занимаются своповладельцы.

Своп решает одну единственную проблему — вытеснить из оперативной памяти не только дисковый кеш или исполняемый код приложений, но и давно неиспользуемые «анонимные» данные, лежащие мертвым грузом.

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

Своп — это не панацея, от недостатка памяти не спасает. Он нужен для оптимальной работы при нормальной загрузке.

В чем «оптимальность» свопа при наличии свободной памяти с запасом для нормальной работы?

В работающей системе память никогда не может быть сколь-нибудь заметно пустой. Иначе система неэффективно её расходует.

Мне непонятен термин «неэффективно расходует» по отношению к ОЗУ. Речь идет о мизерной по сравнению с зарплатой программиста сумме, которая будет использоваться годами. Свопясь туда-сюда вы скорее израсходуете ресурс ssd и окажется что экономия ста долларов на памяти выйдет боком и для вашего кармана и для надежности системы.

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

«Понадобиться память» может только если админ не контролирует процессы в системе. Или вошедший в раж школьник открывает одну за другой порновкладки браузера.

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

Вытеснения чем? В критичные по времени системы не ставят левый софт, на них не серфят по инету. В них ставят достаточное количество памяти для надежной работы всех процессов. Если в таких системах вдруг начинается утечка памяти - разработчику откручивают яйца и увольняют без выходного пособия.

vaddd ★☆
()
Ответ на: комментарий от baka-kun

Тут у людей и при 3ТБ оперативки своп используется. Посоветуй, на что поменять.

Когда нет вообще возможности отказаться от скидывания диск - это само собой. А какой смысл в свопе для большинства разработок на массовых компьютерах, где затратой лишних ста баксов можно удвоить память и отказаться от свопления? Хотите, чтобы я еще добавил в уважительные причины «мамка денег не дает» и «заказчик выделил на всю разработку всего сто тыров»?

vaddd ★☆
()
Ответ на: комментарий от vaddd

затратой лишних ста баксов можно удвоить память

Мамка дала денег только на один компьютер?

tailgunner ★★★★★
()
Ответ на: комментарий от vaddd

зачем своп?

Для уменьшения дискового I/O.

при наличии свободной памяти

Если у тебя в работающей системе с приложениями, занимающимися полезным делом, есть свободная память, то что-то явно идет не так.

В критичные по времени системы не ставят левый софт, на них не серфят по инету.

Мы о контроллерах и системах реального времени, или о десктопах/серверах общего назначения? Про первые я уже писал: «Системы, которым всегда достаточно памяти — это узкоспециализированные контроллеры, спроектированные с учетом каждого байта, обычно — системы реального времени». Там своя специфика.

Мне непонятен термин «неэффективно расходует» по отношению к ОЗУ.

На этом можно было бы и закончить.

«Понадобиться память» может только если админ не контролирует процессы в системе.

А, нет, тут ещё один перл. В работающей в устоявшемся режиме системе постоянно возникает необходимость распределить память, а значит — вытеснить какие-нибудь данные. Всегда, независимо от количества оперативки.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

Для уменьшения дискового I/O.

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

Если у тебя в работающей системе с приложениями, занимающимися полезным делом, есть свободная память, то что-то явно идет не так.

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

Мы о контроллерах и системах реального времени, или о десктопах/серверах общего назначения? Про первые я уже писал: «Системы, которым всегда достаточно памяти — это узкоспециализированные контроллеры

Обо всех. Системы, которым всегда достаточно памяти - это здоровые системы, при создании которых не экономили на копейках. Если в системе недостаточно памяти - ей не место на серверах. Она ненадежна по определению. Сойдет лишь как подарок младшекласснику. Пусть мучается и тренируется.

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

Да ничего подобного. Какая нужда в вытеснении при распределении свободной памяти?

vaddd ★☆
()
Ответ на: комментарий от qula

Это с overcommit_memory=2 и без свапа?

Это FreeBSD-11.1-RELEASE-p7. Со свопом, который пуст чуть более чем полностью.

IPR ★★★★★
()
Ответ на: комментарий от vaddd

Я решаю задачи, где и 32-то гига под приложения используется примерно никогда. А свап используется. Но это, как я понимаю, в твою картину мира не укладывается, а изменить ее ты не осилишь.

t184256 ★★★★★
()
Ответ на: комментарий от vaddd

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

О господи, ты не «не хочешь», ты не можешь!

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

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Я решаю задачи, где и 32-то гига под приложения используется примерно никогда. А свап используется. Но это, как я понимаю, в твою картину мира не укладывается, а изменить ее ты не осилишь.

Вы наверное ниасилили прочитать что я писал раньше.

Даже сам факт существования свопа приводит к тому, что система к нему обращается. Вы что, никогда не замечали, что даже при почти пустой памяти своп вдруг может начать юзаться системой или приложениями? Не будь в этом момент свопа - система бы и не заметила его отсутствия.

vaddd ★☆
()
Последнее исправление: vaddd (всего исправлений: 1)
Ответ на: комментарий от vaddd

Не будь в этом момент свопа - система бы и не заметила его отсутствия.

Хорош позориться. Не будь в этом момент свопа — система бы стала голодать по дисковому кешу, что вызвало бы необоснованные дополнительные тормоза по IO.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

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

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

vaddd ★☆
()
Ответ на: комментарий от Deleted

опять же, в статье одни слова, пруфов, что своп уменьшает, а не увеличивает обращения к диску, нет

Harald ★★★★★
()
Ответ на: комментарий от t184256

Не будь в этом момент свопа — система бы стала голодать по дисковому кешу, что вызвало бы необоснованные дополнительные тормоза по IO.

Вы ведь пишете вещи, которых совершенно не понимаете ) Не можете понять в чем ваша ошибка - просто проверьте на досуге, что ничего подобного не происходит )

vaddd ★☆
()

Смешно читать в некоторых комментариях, будто vm.overcommit_memory=2 не может работать нормально. Для справки, Windows всегда работает именно в таком режиме: если памяти в системе нет, ошибка будет при попытке её выделить, а не при фактическом обращении к памяти.

Другой вопрос, что этот факт учтён в winapi и учтён всеми разработчиками. Например, любимое дело скриптовых языков с GC - выделить огромный линейный кусок виртуальной памяти, чтобы в случае роста потребления памяти память, контролируемая GC, оставалось линейной. Это сильно упрощает GC, причём задачу отображения виртуальных адресов на физические полностью решает ОС, у которой это получается лучше.

Так вот, в winapi есть широко известная возможность явно зарезервировать линейный массив адресов виртуальной памяти, не резервируя при этом физическую. В Linux очевидной возможности нет: разработчики просто запрашивают кучу памяти через mmap и надеются на vm.overcommit_memory=0. В итоге программа со сборкой мусора внутри не выражает явно свои намерения и просто запрашивает памяти больше, чем ей нужно (что вызывает проблемы при vm.overcommit_memory=2).

У меня этим Firefox и Chrome страдают. Решил костыльно через увеличение overcommit_ratio до 150% от размера RAM (напомню, что swap я отключил).

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от icefreeze

как надо делать что работало как в винде?

Во-первых включить vm.overcommit_memory=2 и vm.overcommit_ratio=100, во-вторых переписать весь софт, использующий mmap ненадлежащим образом.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

как надо делать что работало как в винде?

Во-первых включить vm.overcommit_memory=2 и vm.overcommit_ratio=100, во-вторых переписать весь софт

«Во-вторых» надо сделать своп 2*RAM. А переписывать софт может и не понадобится.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

«Во-вторых» надо сделать своп 2*RAM. А переписывать софт может и не понадобится.

А лучше сделать просто 2*RAM. Тогда и делать своп может и не понадобится

vaddd ★☆
()
Ответ на: комментарий от tailgunner

Всем лучше. Владельцу лучше. Юзеру лучше. Продавцу памяти лучше. Производителю памяти лучше.

Ну может только мамке владельца хуже - лишние расходы.

vaddd ★☆
()
Ответ на: комментарий от vaddd

Это как?

Предлагаю подумать самостоятельно.

считающих достижением работу на грани исчерпания памяти, да еще и в ущерб общей производительности.

Удивляют люди, думающие, что своп работает только на грани исчерпания памяти. Хотя это далеко не основное его предназначение.

Он, конечно, и там помогает, позволяя избежать диких тормозов, когда с точки зрения ООМ-киллера всё ещё в порядка, но система вынуждена вытеснять и читать с диска исполняемый код чуть ли не при каждом переключении контекста. Многие, наверное, наблюдали этот бешеный свопинг — постоянную пробуксовку с отключенным свопом при заполнении памяти.

Если в системе недостаточно памяти

Да что ты всё про один крайний случай пишешь, детская травма? Им применение свопа не ограничено, он помогает при нормальной работе виртуальной памяти.

Да ничего подобного. Какая нужда в вытеснении при распределении свободной памяти?

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

baka-kun ★★★★★
()
Ответ на: комментарий от vaddd

Владельцу лучше. Юзеру лучше.

Не, ему пофиг. Он знает, сколько примерно памяти нужно, столько и покупает. А если немного ошибся - своп выручит.

Продавцу памяти лучше. Производителю памяти лучше.

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

tailgunner ★★★★★
()
Ответ на: комментарий от quiet_readonly

В Linux очевидной возможности нет

Есть. PROT_NONE тебе в руки.

baka-kun ★★★★★
()
Ответ на: комментарий от tailgunner

А переписывать софт может и не понадобится.

Вот если бы вместо реализации оверкоммита переписали софт, столько проблем бы исчезло. А так — замкнутый круг и молитва на OOM-killer. Дошло до того, что вполне вменяемые вроде люди ошибки malloc() не проверяют: «а зачем, если об отсутствии памяти узнаем только при попытке использовать в виде kill».

Эх, мечты-мечты…

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

Удивляют люди, думающие, что своп работает только на грани исчерпания памяти. Хотя это далеко не основное его предназначение.

Вы тоже не читали что я писал? Своп используется иногда и при пустой памяти. Но из этого совсем не следует, что он нужен. И совсем не следует, что без него не будет работать. То есть сам факт наличия свопа при избытке памяти вызывает ненужные тормоза

но система вынуждена вытеснять и читать с диска исполняемый код чуть ли не при каждом переключении контекста.

Вы пишете из какой-то собственное вселенной? Не надо системе ничего никуда вытеснять при наличии кучи места в памяти. Все процессы в озу, там и переключается.

Многие, наверное, наблюдали этот бешеный свопинг — постоянную пробуксовку с отключенным свопом при заполнении памяти.

Что вы мне все время пишете про заполнение памяти? Добавьте память, разберитесь с тем, что там происходит и не будет ни заполнения, ни своппинга.

Да что ты всё про один крайний случай пишешь, детская травма?

Так это вы мне все время пишете про недостаток памяти, а не я ) Я уже 15 лет как своп не использую, у меня нет недостатка памяти.

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

Да-да. Запустил систему и она сразу всю память и забрала. До чего только люди не договариваются.

vaddd ★☆
()
Ответ на: комментарий от tailgunner

Он знает, сколько примерно памяти нужно, столько и покупает. А если немного ошибся - своп выручит.

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

vaddd ★☆
()
Ответ на: комментарий от vaddd

Ошибаться надо в верхнюю сторону.

Кому надо - производителю памяти и ее продавцу?

Скупой платит потерей производительности

Воот, уже проблески разума. Ждем, когда ты скажешь, сколько стоит потеря производительности.

снижением надежности

расходом ресурса ssd

2*фейспалм

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Кому надо - производителю памяти и ее продавцу?

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

А то уже тут договорились до того, что система, в которой память недоиспользуется, считается неэффективной.

vaddd ★☆
()
Ответ на: комментарий от Harald

Ты какой-то странный, чесслово. Для тебя обращение к диску - фатальный недостаток что ли?

Deleted
()
Ответ на: комментарий от vaddd

Скупой платит потерей производительности

При одном и том же количестве оперативной памяти и одних и тех же задачах, отключение свопа ведёт к потере производительности.

Black_Shadow ★★★★★
()
Ответ на: комментарий от Black_Shadow

Попадание данных в своп использует тот самый медленный диск для которого нужен кеш, это замкнутый круг. Быстрому SSD кеш не очень то и нужен, а медленному HDD становиться еще хуже.

surefire ★★★
()
Ответ на: комментарий от Black_Shadow

При одном и том же количестве оперативной памяти и одних и тех же задачах, отключение свопа ведёт к потере производительности.

Верно лишь для случая работы при высоком заполнении памяти. При заполненности до 50% - ведет лишь к приросту производительности. Цифра «50», ессно, очень приблизительная.

vaddd ★☆
()
Ответ на: комментарий от vaddd

Не надо системе ничего никуда вытеснять при наличии кучи места в памяти.

В общем случае неиспользуемой памяти в нормальной системе не бывает. Если ты этого не понимаешь, дальнейший разговор не имеет большого смысла.

Так это вы мне все время пишете про недостаток памяти

Почему для тебя использование своп или отсутствие действительно неиспользуемой оперативной памяти равно её недостатку?

у меня нет недостатка памяти

Только недостаток знаний, видимо.

Запустил систему и она сразу всю память и забрала.

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

baka-kun ★★★★★
()
Ответ на: комментарий от surefire

Попадание данных в своп использует тот самый медленный диск для которого нужен кеш, это замкнутый круг. Быстрому SSD кеш не очень то и нужен, а медленному HDD становиться еще хуже.

Давай не сравнивать пограничные случаи, когда без swap запустится OOM Killer.

Black_Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.