LINUX.ORG.RU

Убунтята, не проходите мимо: le9 patch добавлен в linux-xanmod и ваш OOM killer будет вылечен

 , , ,


5

4

Тред https://forum.xanmod.org/thread-4102-post-7572.html

Патч https://github.com/hakavlad/le9-patch

В чем дело?

Линуксы зависают при нехватке памяти: Линукс ядро не может мягко обрабатывать ситуации с нехваткой памяти

Решение: запрет на вытеснение определенного объема файловых страниц. Это обеспечивает этот самый патч, и киллер приходит быстро, система не виснет.

Патч принят в pf-kernel и linux-xanmod. linux-xanmod предоставляет бинарные сборки для deb-дистрибутивов.

Скачать бесплатно https://xanmod.org/

★★★

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

https://github.com/hakavlad/le9-patch/blob/main/experimental/le9fb_patches/le9fb-5.14.patch

@post-factum @ValdikSS

  • Fatal IO error не воспроизводится, можно запускать десятки циклов с хвостами;
  • новых побочек нет (с предыдущим le9fa бывали преждевременные убийства при стрессах);
  • отлично работает как со свопом, так и без.

clean_min в сочетании с достаточным anon_min дает совершенно багоустойчивую конструкцию без побочек. Спрашивайте ответы.

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

@post-factum @ValdikSS

Во-первых, вышел le9fd, без заморозки и багов переваривающий даже

for i in {1..1000}; do (tail /dev/zero &); done

– быстрый запуск до тысячи хвостов - это невероятно!

https://github.com/hakavlad/le9-patch/blob/main/experimental/le9fd_patches/le9fd-5.14.patch

Маленькой новой побочкой остается нетерпимость к сбросу грязных страниц. Если нет резерва чистых и нет возможности свопить, то ООМ не будет ждать сборса грязных (если они есть). С другой стороны, это вариант более low-latency.

Вариант такой: причину багов искать где-то в GFP флагах.

https://elixir.bootlin.com/linux/latest/source/include/linux/gfp.h

https://www.kernel.org/doc/gorman/html/understand/understand009.html

anonymous
()
30 ноября 2021 г.
Ответ на: комментарий от post-factum

OOM killer – его наличие сомнительно само по себе.

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

Пожалуйста, напомни, как задействовать фолиос в 516? Что-то включать надо? Как регулировать размер?

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

Я пока хз, но адаптировать никогда не рано/поздно.

post-factum ★★★★★
()
Ответ на: комментарий от hakavlad

Folios — это не что-то такое, что нужно/можно включать/выключать.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum
 #include <linux/printk.h>
 #include <linux/dax.h>
 #include <linux/psi.h>
+#include <linux/sysctl.h>

Это еще зачем? #include <linux/sysctl.h> уже там есть:

#include <linux/sysctl.h>
#include <linux/oom.h>
#include <linux/pagevec.h>
#include <linux/prefetch.h>
#include <linux/printk.h>
#include <linux/dax.h>
#include <linux/psi.h>

https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/mm/vmscan.c?h=next-20211203#n46

hakavlad ★★★
() автор топика
Ответ на: комментарий от post-factum

Успешно собрал с этим:

static struct ctl_table vm_workingset_table[] = {
	{
		.procname	= "anon_min_kbytes",
		.data		= &sysctl_anon_min_kbytes,
		.maxlen		= sizeof(unsigned long),
		.mode		= 0644,
		.proc_handler	= proc_doulongvec_minmax,
	},
	{
		.procname	= "clean_low_kbytes",
		.data		= &sysctl_clean_low_kbytes,
		.maxlen		= sizeof(unsigned long),
		.mode		= 0644,
		.proc_handler	= proc_doulongvec_minmax,
	},
	{
		.procname	= "clean_min_kbytes",
		.data		= &sysctl_clean_min_kbytes,
		.maxlen		= sizeof(unsigned long),
		.mode		= 0644,
		.proc_handler	= proc_doulongvec_minmax,
	},
	{ }
};

static int __init init_vm_workingset_table(void)
{
	register_sysctl_init("vm", vm_workingset_table);
	return 0;
}

early_initcall(init_vm_workingset_table);

Выглядит нормально?

hakavlad ★★★
() автор топика
Ответ на: комментарий от post-factum

Так же норм?

#ifdef CONFIG_SYSCTL
unsigned long sysctl_anon_min_kbytes __read_mostly = CONFIG_ANON_MIN_KBYTES;
unsigned long sysctl_clean_low_kbytes __read_mostly = CONFIG_CLEAN_LOW_KBYTES;
unsigned long sysctl_clean_min_kbytes __read_mostly = CONFIG_CLEAN_MIN_KBYTES;
#else
unsigned long sysctl_anon_min_kbytes __read_mostly = 0;
unsigned long sysctl_clean_low_kbytes __read_mostly = 0;
unsigned long sysctl_clean_min_kbytes __read_mostly = 0;
#endif
hakavlad ★★★
() автор топика
Ответ на: комментарий от post-factum

Есть случаи, в которых моих ручки есть, когда нет CONFIG_SYSCTL?

Я вижу один законный способ отсутствия моих ручек после принятия патча: не установлен SYSCTL. В прочих случаях ошибка сборки как раз и ДОЛЖНА произойти.

В чем я неправ?

hakavlad ★★★
() автор топика
Ответ на: комментарий от post-factum

А куда они денутся с embedded? Что заставит их исчезнуть? Чем embedded принципиально отличается в плане обработки или наличия стандартных ключей конфига?

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

и сборщик ядра не поленится выключить ещё :) а то железо нынче жырное, всё стерпит

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

Думаю далее отправлять упрощенную версию и сосредоточиться на доказательствах главного - что защита кэша имеет значение. То есть думаю пока убрать anon кнопку и убрать Kconfig. dirty и swappiness не имеют же ключей конфига, пчм новые ключи должны это иметь?

mm-людям, кажется, с трудом даётся понимание смысла и важности le9. Нужно подробно разжёвывать все с множеством примеров.

BTW, сокращение DEF_PRIORITY уменьшает нагрузку на kswapd. По умолчанию (DEF_PRIORITY=12) tail /dev/zero грузит kswapd на 100%. При уменьшении DEF_PRIORITY до 8 нагрузка снижается до 70-80%.

Следующий вопрос: как находить memtotal, чтоб сделать кнопки типа vm.clean_min_ratio.

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

Следующий вопрос: как находить memtotal, чтоб сделать кнопки типа vm.clean_min_ratio.

@post-factum

static void prepare_workingset_protection(pg_data_t *pgdat, struct scan_control *sc)
{
	if (sysctl_clean_low_kbytes || sysctl_clean_min_kbytes || sysctl_anon_min_kbytes) {
		unsigned long node_mem_total;
		unsigned long reclaimable_anon, reclaimable_file;
		unsigned long dirty, clean;
		struct sysinfo i;

		si_meminfo_node(&i, pgdat->node_id);
		node_mem_total = i.totalram;

		reclaimable_anon =
			node_page_state(pgdat, NR_ACTIVE_ANON) +
			node_page_state(pgdat, NR_INACTIVE_ANON) +
			node_page_state(pgdat, NR_ISOLATED_ANON);

		reclaimable_file =
			node_page_state(pgdat, NR_ACTIVE_FILE) +
			node_page_state(pgdat, NR_INACTIVE_FILE) +
			node_page_state(pgdat, NR_ISOLATED_FILE);

		dirty = node_page_state(pgdat, NR_FILE_DIRTY);

		/*
		 * node_page_state() sum can go out of sync since
		 * all the values are not read at once.
		 */
		if (likely(reclaimable_file > dirty))
			clean = reclaimable_file - dirty;
		else
			clean = 0;

		sc->anon_below_min = reclaimable_anon <
			node_mem_total * sysctl_anon_min_kbytes / 100;

		sc->clean_below_min = clean <
			node_mem_total * sysctl_clean_min_kbytes / 100;

		sc->clean_below_low = clean <
			node_mem_total * sysctl_clean_low_kbytes / 100;
	} else {
		sc->anon_below_min = 0;
		sc->clean_below_low = 0;
		sc->clean_below_min = 0;
	}
}

Это работает. Красивое? Здесь kbytes работают как ratio.

Еще вопрос: насколько велик оверхед от prepare_workingset_protection() и как его найти? Все-таки ж там выделяется память и идут некоторые вычисления.

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

ratio не нужно. Как и в случае с dirty. От слова совсем. Любой процент будет просто нерелевантен тому, что происходит в системе.

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

anon ratio имеет смысл для меня.

Я нашел, что с anon_ratio = 10-20 нет багов - ни oops, ни вылетов браузера под некоторыми нагрузками с большим zram factor. - Как на машине с 2 гиг, так и с 12 гиг памяти.

Планирую так и делать: clean c kb, anon с ratio.

Еще думаю вообще избавиться от Kconfig. Да и нет традиции инициировать vm sysctl ключи через кконфиг. Ставить по дефолту нули или некоторые небольшие значение - это более стандартное решение. Это и кода меньше будет, и не будет дублирования текстов между Kconfig и vm.rst.

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

пожалуй продолжу зоонаблюдать, а у себя замерил и прописал байтами

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