LINUX.ORG.RU

Можно ли обезопасить себя от смерти при нехватке памяти?

 ,


2

2

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

Deleted
Ответ на: комментарий от wandrien

Большинство программ не умеют обрабатывать allocation failure и либо падают с sigsegv, либо вызывают abort().

Это проблемы говнокода. В Windows и Haiku пишут программы с учётом возможной ошибки при выделении памяти. Просто новое окно не откроется и программа продолжит работать.

При нехватке памяти убить жирную протёкшую программу – наименьшее зло

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

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

fork() работает через астрал?

Резервируется память, и если памяти не хватит - fork() вернёт ошибку. Вообще надо пользоваться posix_spawn/CreateProcess, а не fork. Для fork, который потом сразу вызывает exec есть специальная обработка для поддержки legacy кода.

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

В Windows и Haiku пишут программы с учётом возможной ошибки при выделении памяти.

В Windows

Ага-ага. Верю.

Просто новое окно не откроется и программа продолжит работать.

«Просто новое окно», точно.

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

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

Мне вполне достаточно для работы, если система будет убивать воркеры браузеров, во вторую очередь – сами главные процессы браузеров, затем компиляторы – и по возможности не трогать всё остальное.

А не так, чтобы у меня упал или стал нефункционален текстовый редактор или сеанс ssh в то время пока разрабы браузера или еще какого-то говна нашли гениальный способ бороться с падениями в виде «завернём все malloc() в циклы, потому что в конце концов система нам не откажет, когда по abort() отвалится всё остальное». В топку.

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

Особенно когда это вызов из библиотеки из библиотеки из библиотеки из библиотеки внутри коллбека из библиотеки через мессадж луп из библиотеки.

Нагородят криворукую архитектуру, а потом обижаются, что всё падает и памяти не хватает. Впрочем на Си по другому сложно сделать.

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

Есть две категории пользователей - те, которые используют компьютер для решения задач и те, которые используют его для сексуального удовлетворения. (c)

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

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

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

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

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

что ещё за причины?

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

реальные программы используют меньше физической памяти, чем адресного пространства

anonymous
()
Ответ на: комментарий от ChekPuk

И она превращает мой лаптоп в кипятильник.

Есть недавние продвижения на эту тему: hrev54575. Ещё портировать DRM, Wine, Blink и можно будет полноценно жить.

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

HWP, intel

а для amd? а для старых процев без hwp? хосспади, какое же днище, нарочно не придумаешь…

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

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

А Microsoft и не знали, что Windows - «маргинальная нигде не использующейся ос».

реальные программы используют меньше физической памяти, чем адресного пространства

Никто не заставляет выделять память на всё адресное пространство. Но разработчики кривых аллокаторов этого делать не умеют.

X512 ★★★★★
()

Смотри earlyoom. В федоре теперь по-умолчанию оно ставится.

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

Вайн не нужен. Нужен Файрфокс и нормальный классический ДЕ :)

Кстати, как там с поддержкой принтеров и сканеров по вайфаю?

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

Кстати, вот реально, с портированием ФФ вдруг выяснится, что гайка тоже тормозит и вешается намертво. И что тогда? Переходить на Genode? :)

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

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

А программы «нужно писать правильно» в мире поней и радуги, и тогда наверняка вдруг запляшут облака, и ring 3 станет не нужен. MS-DOS и реальный режим хватит всем.

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

А Microsoft и не знали, что Windows - «маргинальная нигде не использующейся ос».

/me с недоумением посмотрел на свой смартфон.

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

Вот щас же специально пойду и запущу там какой-нибудь стресс-тест из тех, что кладут линукс.

Ждём отчёта о проделанной работе.

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

/me с недоумением посмотрел на свой смартфон.

А в другом треде вы хвалили архитектуру ядра NT и называли систему ввода-вывода в Линуксе набором костылей.

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

Вряд ли сегодня. Сейчас по городу буду мотаться до самой ночи.

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

А в другом треде вы хвалили архитектуру ядра NT и называли систему ввода-вывода в Линуксе набором костылей.

И что мне теперь нельзя сказать, что MS сделала ерунду, когда она сделала ерунду? Вы меня путаете с каким-то из тех фанатиков, у которых «виндовз рулез» или наоборот «виндовз мастдай».

Я рассматриваю только технические аспекты.

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

Вы ещё X.Org притащить предложите.

Надо будет – притащим. B-)

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

Нужен Файрфокс

Там Rust и привязка к GTK3. Blink уже кое как работает (есть результат получше когда показываются сайты, но часто падает, но я не могу сейчас его найти и код пока не опубликован).

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

MS сделала ерунду, когда она сделала ерунду?

Отсутствие оверкомита и запуска программ через fork/exec вы называете ерундой?

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

т.к. по умолчанию всё это один хрен WONTFIX и NOTABUG.

В Haiku адекватные разработчики принимающие критику. Некорректная работа системы при нехватке памяти считается багом.

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

Отсутствие оверкомита и запуска программ через fork/exec вы называете ерундой?

Есессна. fork/exec – базовые примитивы модели процессов.

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

Есессна. fork/exec – базовые примитивы модели процессов.

В NT Native API есть поддержка fork/exec, а в Win32 этого никогда не было. Fork требует специальной поддержки и переинициализации в почти каждой динамической библиотеке и никто не хочет этим заниматься.

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

Да я уже понял, что возвращать NULL во все процессы подряд – это корректная работа системы Haiku.

Не хотите получать NULL - заранее резервируйте память при запуске. Выдавать память, которой нет - это как афёра в выдачей билетов МММ с предсказуемым результатом.

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

Не хотите получать NULL - заранее резервируйте память при запуске.

Костыли изобретать вы мастак.

Нет.

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

Linux это возможность реализует. Точка.

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

Костыли изобретать вы мастак.

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

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

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

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 2)

Можно ли обезопасить себя от смерти при нехватке памяти?

Напиши зописку с адресом и контактными данными родственников, золоменируй и носи на шее. И главное из дома не выходи :)

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

Это браузер что ли высоконагруженная программа?

Если СУБД течет и сожрала память, то да — ее надо убить и отправить автоматический репорт ответственному лицу. Любые другие варианты - хуже.

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

Базовый конфиг должен быть адекватен для типового случая, а не для специального.

Вы в целом повторяете тот же набор рассуждений, который я прошел лет 7-8 назад.

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

Если СУБД течет и сожрала память, то да — ее надо убить и отправить автоматический репорт ответственному лицу.

А лучше ещё баг репорт разработчику (надеюсь, что краш репорт с трассировкой стека про прибитию процесса сохраняется) и перейти на более надёжную СУБД. Нормальные СУБД годами без протечек работают.

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

Ну вот и пришли к выводу, что оверкоммит не нужен. Другие ОС делают всё перечисленное по умолчанию.

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

Ты сам и поставил условие, что у тебя субд течет. Сам и разбирайся.

Ну вот и пришли к выводу, что оверкоммит не нужен. Другие ОС делают всё перечисленное по умолчанию.

Кому? Физикам, запускающим на выделенной машине с терабайтом ОЗУ моделирование на неделю?

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

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

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

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

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

Но тебе нужно выбросить из головы это теоретизирование и оторванные от жизни абстракции.

Почему нельзя подумать о том как должно быть? Иначе все бы до сих пор на DOS сидели. ЛОР для чего нужен? Как пользоваться костылями расскажут на Stack Overflow. Когда надо решать реальные задачи здесь и сейчас, я выбрасываю. Хотя некоторые абстракции вполне применимы на практике.

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

Во многом да :( Много где текучие и падучие программы просто перезапускают и всё работает. СУБД тоже может упасть и перезапуститься без последствий, благо в своё время умные люди транзакции придумали. Не думали бы о том как должно быть и до сих пор бы базы данных в куче текстовых файлов хранили. И это ведь работало.

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

ОС и должна делать максимум возможного против некорректно работающих программ.

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

Если это ОС, то ОС. Если приложение, то приложение.

Приложение should проверять значение malloc и стараться сделать максимум возможного даже в самой неудобной ситуации. Никто с него этой ответственности не снимал. Точно так же как оно should не течь, не делать double free и так далее.

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

Больше полномочий — больше ответственности.

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

Это здорово, но боюсь, что работа проделанная над блинком одноразовая. И всяких блокировок зловредных скриптов нормально не приделаешь. А ФФ был бы нямочкой. Хотя, да, слииишком много работы.

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

5.8.5

$ ls -l /sys/fs/cgroup
итого 0
-r--r--r--  1 root root 0 окт  3 07:55 cgroup.controllers
-rw-r--r--  1 root root 0 окт  3 07:55 cgroup.max.depth
-rw-r--r--  1 root root 0 окт  3 07:55 cgroup.max.descendants
-rw-r--r--  1 root root 0 окт  3 07:55 cgroup.procs
-r--r--r--  1 root root 0 окт  3 07:55 cgroup.stat
-rw-r--r--  1 root root 0 окт  3 07:55 cgroup.subtree_control
-rw-r--r--  1 root root 0 окт  3 07:55 cgroup.threads
-rw-r--r--  1 root root 0 окт  3 07:55 cpu.pressure
-r--r--r--  1 root root 0 окт  3 07:55 cpuset.cpus.effective
-r--r--r--  1 root root 0 окт  3 07:55 cpuset.mems.effective
-r--r--r--  1 root root 0 окт  3 07:55 cpu.stat
drwxr-xr-x  2 root root 0 окт  3 07:51 init.scope
-rw-r--r--  1 root root 0 окт  3 07:55 io.pressure
-rw-r--r--  1 root root 0 окт  3 07:55 memory.pressure
-r--r--r--  1 root root 0 окт  3 07:55 memory.stat
drwxr-xr-x 84 root root 0 окт  3 07:51 system.slice
drwxr-xr-x  3 root root 0 окт  3 07:23 user.slice
        memory.pressure  system.slice  user.slice
hakavlad ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.