The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск обработчика нехватки памяти earlyoom 1.4, opennews (ok), 02-Мрт-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


138. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 03-Мрт-20, 14:42 
Народ, помогите собрать небольшую статистику. Вот пример, который уводит мою систему (centos 7, hdd 500 GB, 8 GB оперативки, swap включён на 8 ГБ, процессор i3-2100) во фриз:
'''
#include <stdint.h>
#include <stdlib.h>

int main()
{
  while (1) {
    uint64_t *buf = malloc(1024 * 1024 * 1024);

    if (buf != NULL) {
      for (int i = 0; i < 1024 * 1024 * 1024 / 8; i += 4096 / 8) {
        buf[i] = 0;
      }
    }
  }
  return 0;
}
'''

Собрать и запустить:
# cc -std=c99 a.c && ./a.out

И просьба написать:
0) запустилось/не запустилось/прибилось
1) дистрибутив
2) swap включён или нет
3) полный фриз/притормаживает/вообще не заметил
4) диск: hdd или ssd
5) настройки "из коробки" или что-то сами настраивали

Ответить | Правка | Наверх | Cообщить модератору

142. "Выпуск обработчика нехватки памяти earlyoom 1.4"  –1 +/
Сообщение от пох. (?), 03-Мрт-20, 15:56 
запустилось, сожрало весь процессор (логично, как и то что система при этом, мягко говоря, не летает) и нагадило 7 гиг в своп из десяти возможных. На чем надоело и было прибито банальным ctrl-c

Поскольку не очень понятно, что мы хотели в итоге узнать - что происходит при запуске троянской программы? Очевидно. Лечение - изоляция и лимиты. Что происходит при запуске легальной программы, которой действительно нужно перемолоть больше памяти чем может дать система - тоже очевидно. Лечения нет, кроме как бежать за планкой.
Что происходит при запуске плохо написанной программы, которой столько памяти нафиг не нужно но все равно жрет (наиболее близкий реальный кейс к данному примеру) - тоже очевидно, лечение - выбросить макачий кал и больше не запускать.
Система в большинстве этих случаев вполне оставляет время среагировать и возможность вмешаться. Без всякого shit-oom.

Ответить | Правка | Наверх | Cообщить модератору

143. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 03-Мрт-20, 16:17 
Спасибо, что запустили и отписались.

> Поскольку не очень понятно, что мы хотели в итоге узнать - что происходит при запуске троянской программы?

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

PS. Это не выдуманный пример.

> Система в большинстве этих случаев вполне оставляет время среагировать и возможность вмешаться. Без всякого shit-oom.

А что у вас за система? Я свою привёл, у меня система настолько сильно начинает тормозить, что не реагирует ни на что.

Ответить | Правка | Наверх | Cообщить модератору

148. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от пох. (?), 03-Мрт-20, 16:55 
> Не троянской программы, а ошибочной программы

ошибки обычно иначе выглядят - вот типичная ошибка (в днк разработчика):

  1960 mysql     20   0 5544180 1.873g  11088 S   6.0  9.6   1566:00 mysqld
в конце-концов она устанет от такой жизни, задумается о вечном и перестанет откликаться на раздражители (виснет только один из тредов, но об него локаются запросы и рецепт все равно один)
- после чего будет просто прибита и перезапущена.

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

Программа, которая с памятью все же что-то осмысленно делать пытается, а не просто течет, и вгоняет систему в trashing - так что при этом загадит всю и еще захочет - она обычно cpu intensive (столько памяти-то лопатить, мало не покажется), там так просто не отделаешься. И непонятно, хотим ли мы ее такую прибить - нам может в любом случае вся система бесполезна без результатов ее работы.

Система - виртуалка с обычной убунтой, xeon e5, диски живут на промышленной СХД, но она об этом счастливо не в курсе, живут на ней репо прода и самой убунты, поэтому нагрузка в штатном режиме ровно ноль, никаких особо специальных настроек нет.

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

15:49:18 up 208 days, 23:28,  2 users,  load average: 3.95, 1.22, 0.42
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user      pts/0    192.168.6.4      15:47    1:17   1:04  55.70s ./a.out
user      pts/1    192.168.6.4      15:48   11.00s  2.08s  0.50s w
linups:~> free
              total        used        free      shared  buff/cache   available
Mem:        8209956     8071716       46580          44       91660       46520
Swap:      10483708     7880952     2602756

ядер там больше и нету, все что есть - съело. В целом - не вижу на этом вырожденном случае какого-то особо неправильного поведения системы.

Ответить | Правка | Наверх | Cообщить модератору

155. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 03-Мрт-20, 18:38 
> В целом - не вижу на этом вырожденном случае какого-то особо неправильного поведения системы.

Да, интересно. Но вы это всё запустили в виртуалке - соответственно, можно найти кучу объяснений, почему вы не ощутили полного отсутствия отклика от системы.

> Ну да, она тормозила - ну так и должна.

То, что творится у меня, я бы не сказал, что "так и должна" :)

Ответить | Правка | Наверх | Cообщить модератору

145. "Выпуск обработчика нехватки памяти earlyoom 1.4"  –1 +/
Сообщение от Аноним (145), 03-Мрт-20, 16:30 
*та самая картинка с велосипедом и палкой в колесе*
Ответить | Правка | К родителю #138 | Наверх | Cообщить модератору

151. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +1 +/
Сообщение от yaya (?), 03-Мрт-20, 17:44 
Вы так на все тесты реагируете? Багрепорты ни разу не писали? Обычно для поиска бага хорошо иметь тест.

Или вы ходите по github'у и на все багрепорты с прикреплёнными тестами прикладываете картинку с велосипедом и палкой? Типа "ха-ха, вот дурак, зачем же ты так делаешь, если же видно, что оно не работает. Сам виноват - велосипедист с палкой, ха-ха" так что ли?

Ответить | Правка | Наверх | Cообщить модератору

174. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от ананчик (?), 04-Мрт-20, 00:49 
тест не релевантен, нехватает sleep
как только он съедает память то сразу выходит
и еще вагон всего

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

Ответить | Правка | К родителю #138 | Наверх | Cообщить модератору

183. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 04-Мрт-20, 20:25 
> тест не релевантен, нехватает sleep

Зачем sleep-то?

> как только он съедает память то сразу выходит

Вы не увидели там while (1)?

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

То, что я хочу проверить - я понимаю и написал такой маленький тест. Один человек уже его запустил, у него не возникло недоумений, как у вас. Он увидел, что его система начала притормаживать, но не критично. По ctrl-c он сумел срубить тест. Но он запустил его в виртуалке.

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

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

Ответить | Правка | Наверх | Cообщить модератору

191. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от ананчик (?), 04-Мрт-20, 23:44 
> Зачем sleep-то?

что бы не выжирал память за считанные секунды.
>Вы не увидели там while (1)?

Действительно он есть, что еще более странно что будет когда malloc будет возвращать ошибку
while(1){} одно ядро убили.

я похожие тесты крутил очень очень давно, когда памяти было действительно мало. И они закачивались тем что процесс умирал после жуткого просиживания по io. То что у вас  gui  просто встает колом тоже нормально это регулируется приоритетами процессов по io.

а вот посадить такую  membomb в cgroups я не пробовал, думаю сейчас это решило бы практически все проблемы

Учтите что соотношение размера оперативной памяти и размер свопа очень сильно влияет на ваши тормоза. Добавьте sleep где-то 1-5 секунд запустите vmstat/iotop или что то подобное и вам сразу станет понятно откуда тормоза.
вот вам маленькая шпаргалка https://www.oracle.com/technical-resources/articles/it-infra...

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

Ответить | Правка | Наверх | Cообщить модератору

197. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от Аноним (-), 05-Мрт-20, 02:22 
> что бы не выжирал память за считанные секунды.

А в чем пойнт туповэйтить в разы дольше?

Ответить | Правка | Наверх | Cообщить модератору

203. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от пох. (?), 05-Мрт-20, 07:47 
> Действительно он есть, что еще более странно что будет когда malloc будет
> возвращать ошибку

очевидно - будет крутиться в цикле, периодически спрашивая "а еще память есть? А если найду?"

и если найдет - сожрет.

> io. То что у вас  gui  просто встает колом
> тоже нормально это регулируется приоритетами процессов по io.

этот процесс не занимается io, думайте дальше.

> а вот посадить такую  membomb в cgroups я не пробовал, думаю
> сейчас это решило бы практически все проблемы

да-да. ручное управление памятью каждому /bin/ls решит все проблемы, безусловно.

Добро пожаловать в 1970й. В 72м это немного всем уже осточертело, и появился unix.

Ответить | Правка | К родителю #191 | Наверх | Cообщить модератору

209. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 05-Мрт-20, 15:48 
> что бы не выжирал память за считанные секунды.

В этом и есть тест. Не, конечно можно было бы открыть chrome, открыть кучу вкладок, открыть libreoffice книги "Война и мир", открыть видеоредактор, 3D-редактор, загрузить в них кучу файлов и надеятся нарваться на проблему "нехватки памяти", но это как-то долго и не факт, что получится проблема "нехватки памяти".

Ответить | Правка | К родителю #191 | Наверх | Cообщить модератору

213. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от пох. (?), 05-Мрт-20, 22:32 
>> что бы не выжирал память за считанные секунды.
> В этом и есть тест. Не, конечно можно было бы открыть chrome,

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

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

Плюс они обрабатывают ошибки выделения этой памяти (скорее всего assert("опачки, кончилась?");
но уж точно не навернуть еще десяток циклов в ожидании а вдруг появится).

> "нехватки памяти", но это как-то долго и не факт, что получится
> проблема "нехватки памяти".

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

Ответить | Правка | Наверх | Cообщить модератору

216. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 06-Мрт-20, 16:52 
> Тут весь поинт в том что память жрется быстрее, чем своппер успевает ее освобождать.
> получится, но она несколько иначе выглядит.

Даже если не жрать память быстрее, а просто один раз запросить памяти на размер ОЗУ*2 и активно потом этой выделенной памятью пользоваться, то мы получим непрерывную активность на диске (если своп достаточно большой).

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

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

Никто не может заранее сказать, что запуская какую-то программу она не съест ОЗУ*2 памяти и не будет ею активно пользоваться, что аж все другие программы уйдут в своп.

На это тоже интересно было бы написать тест и посмотреть как поведёт себя система.

Впрочем, это не открытие америки. https://www.phoronix.com/scan.php?page=news_item&px=Linux-Do...

Ответить | Правка | Наверх | Cообщить модератору

196. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от Аноним (-), 05-Мрт-20, 02:21 
См. сюда - https://www.opennet.ru/openforum/vsluhforumID3/119943.html#193
> 0) запустилось/не запустилось/прибилось

Запустилось, сожрало память, прибито oom_killer. С -O2 то только грузило проц, но не жрало RAM.

> 1) дистрибутив

Deb 10; кернел собственный (full preempt aka "realtime"; no_hz_full aka "tickless"; примерно 5.5).

> 2) swap включён или нет

ZRAM.

> 3) полный фриз/притормаживает/вообще не заметил

Даже плеер не икнул.

> 4) диск: hdd или ssd

SSD. Но HDD в _этом_ случае не должен был бы сильно испортить.

> 5) настройки "из коробки" или что-то сами настраивали

Осмысленный тюниг с задействованием головы. Цель - быстрая система, которую не клинит. Судя по тесту, получилось отлично. Кернель собран по вкусу, интересного в данном случае full preempt, это полезно от клинов.

Ответить | Правка | К родителю #138 | Наверх | Cообщить модератору

210. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 05-Мрт-20, 15:59 
Спасибо за отзыв!

Видимо, oom_killer спас в этой ситуации.

Почему у меня, интересно, не сработал oom_killer? Запускаю ulimit у себя и вижу unlimited. Может в этом всё дело...

Ответить | Правка | Наверх | Cообщить модератору

225. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от Аноним (-), 07-Мрт-20, 07:38 
> Видимо, oom_killer спас в этой ситуации.

А не должен был? В системе кончилась память - он и возбух.

> Почему у меня, интересно, не сработал oom_killer?

А кернель сильно древний? Если системный диск механический и много всего запущено, бинари могут подрабатывать readonly свопами. Ну и его вручную можно попросить alt-sysrq-f.

> Запускаю ulimit у себя и вижу unlimited. Может в этом всё дело...

Ulimit и oom_killer несколько ортогональны. Если ulimit или подобный лимит сработает, до oom_killer дело скорее всего не дойдет - прога получит фигу до того как в системе память кончится "глобально". И кстати там вон подсказывают что ошибки выделения памяти нехило бы ловить.

Я кстати не полностью понял что оно делает с -O2. VSZ конский, RSS натикал до гига и угомонился, после этого оно только проц грузит. Дизассемблить/профайлить все же несколько впадлу, я и так пару мистических штук разрулил, еще столько же осталось.

Ответить | Правка | Наверх | Cообщить модератору

226. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 10-Мрт-20, 12:50 
> А не должен был? В системе кончилась память - он и возбух.

Я не много знаю про OOM killer, но он там как-то определяет, что убить, а что оставить. Теоретически, он мог прибить не тест, а что-то полезное.

Да и то, пока не будет swap'а - тест не особо интересен. Именно из-за наличия swap'а, можно словить тормоза.

> А кернель сильно древний?

Не знаю, но версия такая: 3.10.0-1062.9.1.el7.x86_64

> Ну и его вручную можно попросить alt-sysrq-f.

Вот что-что, а хоткеи в линуксе/ОС - это ещё одна больная тема, с которой я сталкиваюсь (хотя тут, наверное, X'ы уже виноваты, а не ядро). Элементарно не работают комбинации ctrl-shift-<some-key> (по ctrl-shift у меня переключение языка) (хотя в той же винде в той же программе (kicad, например) всё работает), а вы говорите про alt-sysrq-f, которые я жму - ничего не происходит. То ли оно работает, но не подаёт виду, то ли что-то опять не так с хотекеями... Но запускать свой тот тест и проверять alt-sysrq-f - не хочу рисковать опять жёстко вырубать комп :)

> Я кстати не полностью понял что оно делает с -O2.

0000000000400440 <main>:
  400440:       48 83 ec 08             sub    rsp,0x8
  400444:       0f 1f 40 00             nop    DWORD PTR [rax+0x0]
цикл 1: вызываем malloc(1 GB):
  400448:       bf 00 00 00 40          mov    edi,0x40000000
  40044d:       e8 de ff ff ff          call   400430 <malloc@plt>
делаем "цикл 1", пока он возвращает указатели:
  400452:       48 85 c0                test   rax,rax
  400455:       74 f1                   je     400448 <main+0x8>
цикл 2: заводим счётчик на 1 GB / 8:
  400457:       b8 00 00 04 00          mov    eax,0x40000
  40045c:       0f 1f 40 00             nop    DWORD PTR [rax+0x0]
делаем "цикл 2", пока счётчик не 0:
  400460:       83 e8 01                sub    eax,0x1
  400463:       75 fb                   jne    400460 <main+0x20>
повторяем "цикл 1"
  400465:       eb e1                   jmp    400448 <main+0x8>

Итого: компилятор выпилил запись в память. Мы впустую типа запросим память и впустую прокрутимся в пустых циклах.

Ответить | Правка | Наверх | Cообщить модератору

206. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от Аноним (206), 05-Мрт-20, 09:45 
i5-3570, 32 ГБ RAM

0) запустилось/не запустилось/прибилось
запустилось
1) дистрибутив
Debian testing amd64
2) swap включён или нет
выключен
3) полный фриз/притормаживает/вообще не заметил
"a.out" ~18 минут крутился с 30 ГБ RES и одним съеденным ядром, но без хоть сколь-нибудь заметного влияния на отзывчивость. Потом начало тупить и эксперимент был прекращён по Ctrl+C
4) диск: hdd или ssd
HDD, хотя при выключенном свопе это не важно
5) настройки "из коробки" или что-то сами настраивали
вроде бы, ничего специально не настраивалось

Ответить | Правка | К родителю #138 | Наверх | Cообщить модератору

211. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от yaya (?), 05-Мрт-20, 17:03 
Спасибо за отзыв! Ничего себе у вас там памяти :)

Интересно, что не сработал oom_killer, а спокойно отдалось 30 ГБ. Возможно после этого из malloc стал возвращаться NULL и просто крутился голый цикл, съедая CPU.

Ответить | Правка | Наверх | Cообщить модератору

214. "Выпуск обработчика нехватки памяти earlyoom 1.4"  +/
Сообщение от Аноним (214), 05-Мрт-20, 23:36 
Там ещё ~230-250 мегабайт свободные оставались, чего, возможно, было слишком много для срабатывания OOM killer-а, но слишком мало для overcommit-а при вызове malloc() на гигабайт. Собственно, тормоза начались только при попытке открыть новую вкладку с ютубом -- вероятно, аллокации в браузере снизили объём свободной памяти до некоторой критической отметки и ядро начало думать, что с этим делать. :)
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру