Что делается-то! ЖОНГЛИРУЕТ!!! ШОК!!!
автор cheekibat
PS Тем временем ваши фрукты на столе внезапно исчезают....
автор cheekibat
PS Тем временем ваши фрукты на столе внезапно исчезают....
Если вам неудержимо хочется использовать оборудование из музея для современной разработки — статья специально для вас.
Машины должны служить а не требовать ресурсы. И автор патча l9 об этом знает.
Сейчас наверное некоторые читатели сильно удивятся:
с 2007 года в ядре Linux живет серьезный баг, приводящий к полному зависанию системы при работе под большой нагрузкой на память.
На дворе на момент написания статьи май 2025 года, так что баг успел отпраздновать совершеннолетие и открыть первую бутылку пива.
Оригинальный репорт выглядит так:
Разумеется разработчики ядра в курсе проблемы, но по ряду причин.. не считают этот баг важным.
Да, вы правильно прочитали:
«полное зависание системы под нагрузкой» и «разработчики не считают важным исправлять» — как вам такие реалии Linux?
Более того, недавно тикет с описанием этого бага вообще закрыли с эпической формулировкой «just become obsolete»:
С легким намеком, что некоторым стоит перестать собирать себе компьютеры по помойкам:
but now I don't bother with less than 32Gb of RAM for a desktop.
Теперь прокрутите обсуждение бага в трекере вниз и посмотрите на последнее сообщение о проблеме:
Оно конечно все замечательно и у самого автора этой статьи давно 64Гб на одной из рабочих машин, а некоторые коллеги успели впихнуть даже 128Гб, причем в ноутбук — чтобы мы наконец увидели SUSE Linux, которая не тормозит.
Но к сожалению одними любителями компьютерного антиквариата данная проблема не ограничивается — на нынешние облачные времена типичное рабочее окружение Linux это виртуальная машина, с ограниченным обьемом памяти. Скорее всего даже ваш корпоративный сайт крутится на виртуальной машине с 4Гб памяти.
Так что на самом деле проблема касается практически всех пользователей Linux, а не только идейных нищебродов энтузиастов, собирающих себе оборудование по музеям.
Если вы хоть немного понимаете в компьютерах, прочитав абзац выше и сопоставив масштаб проблемы и отношение к ней разработчиков Linux, думаю уже сделали определенные выводы:
либо команда разработки ядра Linux — поголовно некомпетентны, либо
у автора контракт с рептилоидамив описании выше был упущен ряд важных нюансов.
Правда как обычно где‑то между — «особенных» среди современных разработчиков Linux действительно хватает, но ряд нюансов я все же намеренно упустил.
Опишу в какой момент проявляется этот баг:
надо долго и упорно увеличивать нагрузку на использование памяти, причем маленькими порциями и обязательно из нескольких разных процессов — чтобы OOM Killer не успел отработать.
На практике надо либо заниматься тренировкой нейросетей, либо непрерывно гонять тяжелые приложения на Java/Node (в первую очередь IDE) и постоянно запускать сборку больших проектов.
И все это на неподготовленном офисном оборудовании с 4-6 Гб памяти, представляющем историческую ценность, либо в виртуальной машине.
Уже давно существует неофициальный патч, решающий описанную проблему с зависанием квадратно-гнездовым радикальным способом:
The kernel does not provide a way to protect the working set under memory pressure. A certain amount of anonymous and clean file pages is required by the userspace for normal operation. First of all, the userspace needs a cache of shared libraries and executable binaries. If the amount of the clean file pages falls below a certain level, then thrashing and even livelock can take place.
По сути этим патчем формируется небольшой объем памяти (тот самый working set), которую запрещается перегружать даже самым хитрым приложениям, откусывающим память по килобайтам.
Разумеется патч заметили и тут находится архив эпической переписки в рассылке Linux Kernel длиною в год, где автор патча пытается объяснить окружающим что он не верблюд и проблема действительно есть.
Однако патч в мейнстрим так и не попал, что наводит на определенные нехорошие мысли.
Помимо основной версии ядра т. н. «vanilla», исходники которого выкладываются на широко известном kernel.org, существуют «васянские сборки» — наборы патчей ядра, собранные энтузиастами под конкретную задачу.
Одна из таких сборок называется Xanmod и посвящена работе современного ядра на desktop-системе с минимальными визуальными задержками:
XanMod is a general-purpose Linux kernel distribution with custom settings and new features. Built to provide a stable, smooth and solid system experience.
Так вот на момент появления l9ec патча, он был включен в сборку Xanmod:
С официальной страницы с отзывами, между прочим.
Но в последних 6.х версиях Xanmod его уже нет, на что есть формальная причина — появление вот этого патча, вроде как окончательно решающего проблему c зависанием:
MGLRU is a kernel innovation we've been eager to see merged in 2022 and it looks like that could happen for the next cycle, v5.19, for improving Linux system performance especially in cases of approaching memory pressure.
На данный момент MGLRU в mainline и скорее всего работает прямо сейчас и у вас в системе, если конечно у вас современный линукс и MGLRU не отключен вручную.
К сожалению принцип работы MGLRU другой (см. комментарий выше про 32Гб памяти на десктопе) и тестировался его функционал тоже в другом месте:
On Android, our most advanced simulation that generates memory pressure from realistic user behavior shows 18% fewer low-memory kills, which in turn reduces cold starts by 16%.
Как нетрудно догадаться, «realistic user behavior» на мобильном Android несколько отличается от тотальной перегрузки тяжелыми средствами разработки на дохлом десктопе или еще более слабой виртуальной машине.
Поэтому «продвинутым пользователям Linux» в очередной раз придется заботиться о себе и своих проблемах самостоятельно.
К сожалению автор патча l9 видимо устав бодаться с идиотами, не стал переносить свой замечательный патч в 6.х ветку ядра, решив что раз более умные ребята из Google выкатили MGLRU — от его решения толку больше не будет.
Как ни странно, но это не так и l9 патч куда более предсказуем и надежен как удар ломом, в отличие от цирка с аж 14 патчами MGLRU:
These initial multi-generational LRU patches amount to 14 patches at the moment and in a patched kernel can be enabled via the LRU_GEN Kconfig switch
Собственно эта статья появилась на свет после того как автор опять словил зависание под нагрузкой во время работы над большим проектом, из-за чего и решил откопать дедовский пулемет портировать известный патч в 6.х ядро.
За основу был взят последний патч для 5.х ветки без учета MGLRU: le9ec-5.15.patch а его логика добавлялась в Xanmod-версию ядра 6.14.5.
Ниже по шагам объясняю как выполнить перенос логики патча, чтобы процедуру можно было повторить и на более новых ядрах и на «vanilla» версиях.
Скачиваем архив с Xanmod ядром и l9-патч по ссылкам выше и распаковываем.
Стоит сразу предупредить, что размер текущей версии ядра Linux в распакованном виде ~1.8 Гигабайт, а для сборки понадобится еще ~28 Гигабайт.
Вот такие нынче ядра.
Разумеется применить готовый diff автоматически для ветки 6.х не получится, так что будем переносить логику патча по шагам.
Всего в рамках патча изменения происходят в пяти файлах:
Поскольку исправлять документацию нам не очень актуально, первый файл можно пропустить. Таким образом первое актуальное исправление находится в файле include/linux/mm.h, куда добавляются глобальные переменные, отвечающие за настраиваемые лимиты:
Все что нужно сделать — вставить строки в файл include/linux/mm.h:
extern unsigned long sysctl_anon_min_kbytes;
extern unsigned long sysctl_clean_low_kbytes;
extern unsigned long sysctl_clean_min_kbytes;
Следующий шаг чуть объемнее:
Необходимо найти массив static struct ctl_table vm_table[] в файле kernel/sysctl.c и добавить внутрь три блока, отвечающих за настройку.
{
.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,
},
Следующая правка в файле mm/Kconfig, которой добавляется управление новыми настраиваемыми параметрами ядра:
По-сути правки, вам надо добавить в файл mm/Kconfig три блока: ANON_MIN_KBYTES, CLEAN_LOW_KBYTES и CLEAN_MIN_KBYTES вместе со всем содержимым.
Все что выше отвечало лишь за настройку, основная логика патча l9 приходится на файл mm/vmscan.c, в котором будут происходить оставшиеся правки.
Первым делом добавляем локальные переменные:
Затем добавляем логику присваивания значений из параметров ядра:
Ориентируетесь на макрос #define prefetchw_prev_lru_folio, строки добавляются после него:
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;
Следующая правка добавляется в метод static void get_scan_countкоторый успел поменять сигнатуру:
Я добавил сразу после блока с переменными:
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
struct mem_cgroup *memcg = lruvec_memcg(lruvec);
unsigned long anon_cost, file_cost, total_cost;
int swappiness = sc_swappiness(sc, memcg);
u64 fraction[ANON_AND_FILE];
u64 denominator = 0; /* gcc */
enum scan_balance scan_balance;
unsigned long ap, fp;
enum lru_list lru;
/*
* Force-scan anon if clean file pages is under vm.clean_low_kbytes
* or vm.clean_min_kbytes.
*/
if (sc->clean_below_low || sc->clean_below_min) {
scan_balance = SCAN_ANON;
goto out;
}
Следующая правка в этом же файле должна быть вставлена в этот же метод get_scan_count, но ниже по коду — ориентируйтесь на строку nr[lru] = scan;благо она такая одна:
Я вставил логику проверки сразу над ней:
/*
* Hard protection of the working set.
*/
if (file) {
/*
* Don't reclaim file pages when the amount of
* clean file pages is below vm.clean_min_kbytes.
*/
if (sc->clean_below_min)
scan = 0;
} else {
/*
* Don't reclaim anonymous pages when their
* amount is below vm.anon_min_kbytes.
*/
if (sc->anon_below_min)
scan = 0;
}
nr[lru] = scan;
Следующей правкой добавляется новая функция prepare_workingset_protection, которая должна вызываться из существующего метода shrink_node_memcgs:
Так что вам надо найти функцию shrink_node_memcgs (она такая одна) и вставить новую функцию prepare_workingset_protection над ней:
static void prepare_workingset_protection(pg_data_t *pgdat,
struct scan_control *sc)
{
/*
* Check the number of anonymous pages to protect them from
* reclaiming if their amount is below the specified.
*/
if (sysctl_anon_min_kbytes) {
unsigned long reclaimable_anon;
reclaimable_anon =
node_page_state(pgdat, NR_ACTIVE_ANON) +
node_page_state(pgdat, NR_INACTIVE_ANON) +
node_page_state(pgdat, NR_ISOLATED_ANON);
reclaimable_anon <<= (PAGE_SHIFT - 10);
sc->anon_below_min = reclaimable_anon < sysctl_anon_min_kbytes;
} else
sc->anon_below_min = 0;
/*
* Check the number of clean file pages to protect them from
* reclaiming if their amount is below the specified.
*/
if (sysctl_clean_low_kbytes || sysctl_clean_min_kbytes) {
unsigned long reclaimable_file, dirty, clean;
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) << (PAGE_SHIFT - 10);
else
clean = 0;
sc->clean_below_low = clean < sysctl_clean_low_kbytes;
sc->clean_below_min = clean < sysctl_clean_min_kbytes;
} else {
sc->clean_below_low = 0;
sc->clean_below_min = 0;
}
}
Собственно последняя правка это вызов новой функции из существующей shrink_node_memcgs:
После внесения всех этих исправлений, запускаем один из вариантов настройки ядра:
make xconfig
И наблюдаем новые поля настройки:
Цепочка сборки и установки ядра совершенно стандартная:
make && make modules && make modules_install && make install
К сожалению это еще не все и прежде чем патч заработает надо будет отключить MGLRU, который как я уже описывал — успели внести в основную ветку ядра:
cat /sys/kernel/mm/lru_gen/enabled
Должен показать 0x0007 если MGLRU включен, отключить можно командой:
echo 0 | sudo tee /sys/kernel/mm/lru_gen/enabled
Вот тут у автора патча лежат готовые скрипты для автоматизации всего этого цирка. Я же просто добавил строчку с отключением в /etc/rc.local.
Для тестов портированного патча, был взят один из моих боевых ноутбуков Lenovo Z580 2012го года выпуска, с 8Гб памяти:
На нем постоянно творится всевозможная дичь — тут пять разных операционных систем и куча проектов и инструментов для разработки на каждой.
Поэтому без особого труда были одновременно запущены:
PostgreSQL с реальной базой
MySQL тоже с реальной базой
Intellij Idea
VSCode
Сборка проекта на Node.js с Webpack и hot reload
Сборка достаточно крупного Java-проекта (~3000 исходных файлов)
Chromium с 20 вкладками
Напоминаю что все это на 8Гб реальной памяти и на ноутбукe. Причем в качестве ОС в этот раз была обычная Ubuntu:
Как-то так это выглядит в действии:
Через неделю после публикации я решил пойти еще дальше и поставил пропатченное с l9 ядро на ноутбук 2007 года с 3Гб памяти. И повторил тесты с нагрузкой. Видео тут.
Все более чем работает и пропатченное ядро замечательно отрабатывает свою пайку.
Можно сколько угодно стебаться с пожеланиями «купи себе наконец нормальный компьютер», скажу что намеренно и давно использую старое железо — в первую очередь для оценки производительности создаваемого ПО.
И это одна из причин, по которой у нас получаются технические чудеса вроде Телепорты.
Если вы пока не дошли до столь глубокой стадии просвещения в разработке — все равно стоит знать, что мы ловили подобные зависания и в виртуальных машинах с Linux, например на CI‑сервере при сборке нескольких проектов одновременно.
Так что актуальность описанного все же высокая и как получилось, что столь простой и очевидный патч, который гарантированно решает проблему до сих пор не используют активно — ума не приложу. Ну и разумеется автору патча лучи респекта, благо это лучший представитель отечественной инженерной школы.
Статья была опубликована на Хабре, оригинал, в котором автор статьи себя не сдерживал и в красках рассказал все что думает о разработчиках ядра Linux как обычно можно найти в нашем блоге.
Trion-1
Страница игры в Steam
На рассвете XXII века освоение космоса и колонизация Солнечной системы монополизированы несколькими огромными и амбициозными мегакорпорациями. Несмотря на крайнюю хрупкость и уязвимость, этим компаниям удается поддерживать баланс. Однако на самой окраине Солнечной системы корпорации совершают открытие, которое дает технологическое преимущество и нарушает равновесие. Так рождается новый конфликт: «Инцидент на Юпитере».
«Нексус: Инцидент на Юпитере» (Nexus: The Jupiter Incident) — это тактическая космическая стратегия в реальном времени, основанная на миссиях, со зрелищными сражениями и захватывающим кинематографическим качеством. Сосредоточьтесь на тактике и действии, управляя дюжиной линкоров, встречая инопланетян, неизвестные солнечные системы и астрофизические явления в своей борьбе за спасение Земли.
Готовы ли вы принять вызов?
Эпическая кампания из 6 эпизодов и более чем 26 захватывающих миссий
Разнообразные типы заданий: шпионаж, бой, скрытность, саботаж, спасение, наука и т. д.
Управление до 10 чрезвычайно детализированными настраиваемыми космическими кораблями — от базового уровня до уровня симуляции
6 различных инопланетных видов с уникальной тактикой для каждой расы и 30 инопланетных космических кораблей
Более 50 уникальных персонажей и 90 различных видов оружия и устройств
Гибкая система звездной карты: анимированные объекты карты, световые блики и т. д.
Масштабирование более чем 350 планет, лун, комет и т. д. в полностью трехмерной среде
Движение планет, основанное на реальной физике
Вы можете получит один из ответов от скрипта раздачи:
{}
Всё отлично, заявка зарегистрирована и игра скоро появится в Библиотеке GOG аккаунта
{"message":"Already claimed"}
Игра уже была Вами получена, если её еще нет в Библиотеке, просто подождите...
{"message":"Unauthorized"}
Вы не зашли в аккаунт, зайдите в аккаунт и повторите переход по ссылке
{"message":"Giveaway Has Ended"}
Раздача уже закончилась
"Пятничное моё" решил посвятить своему одному из последних велопроектов.
Вкратце, для ЛЛ:
В городе Сосновый Бор, что в ста километрах от Петербурга, есть ежегодная традиция - строить мини-велосипеды на колёсах размером не более 12" и соревноваться в скорости на них. Фотоотчёт, как это было в 2024 году.
Мы с женой в качестве хобби строим велосипеды и вот уже третий год подряд не упускаем возможности принять участие в этом чаде кутежа, например. Наш первый велосипед для гонки, потом был и второй.
Не изменяя традициям, мы и в этот раз решили строить что-то для перевозки чего-то. Во всём цивилизованном мире их назвают "карго-байками", но мне нравится более уютное слово "грузовичок", этакий пухляш на микроколёсиках с низким центром тяжести, короче милота-уру-ру. Да и в целом, при всей моей любви ко фрик-байкам, всё же хочется некой утилитарности и вне гоночной трассы.
Первыя версия была вообще чоппером, а потом Остапа понесло.
В этот раз захотелось попробовать свои силы в строительстве электробайка. По опыту, чем вместительнее грузовая часть велосипеда, тем больше ты её нагружаешь. Кареточный мотор по стоимости выходит как несколько таких донорских велосипедов, поэтому я решил что меня устроит простой ассистент педалирования (это не чтоб лететь как проклятый, а чтобы мотор немного помогал при вращении педалей).
Нижняя труба 38х2. Остальные трубы - 22х1.5. Грузовая часть и кареточный стакан - нержавеющаяя сталь.
Изначально вилку брал от донора, но алюминий оказался слишком тонким для этого дерьма. Поэтому сварил улучшенную версию из стали, с запасом под трёхдюймовые баллоны.
Цвет окантовки (как на той самой пачке) намешали из того что было в запасах. В современном варианте он довольно кислотный, а вот раньше фон был как раз поспокойнее. В любом случае - главное чтобы узнавалось.
Боковые панели согнул из алюминиевого композита. Дальше окраска, отклейка, лак, полировка и нанесение шрифта. Этим занималась моя супруга, я так не умею, мои полномочия на этом всё.
Любимые цыгане, обожаю цыган. Да, странное название покрышки, но на самом деле резина интересная, и к сожалению не очень подходит электротранспорту. Батарея 10 Ампер 36 вольт (было 24 вольта). Кабель-менеджмент делался в последнюю ночь сонным разумом.
Зато не пришлось долго возиться со стыковкой советской фары от мопеда с современным китайским фонарём. Всё встало как прям тут и было.
Мне показалось что все эти современные пластиковые кнопки и светодиодные индикаторы будут выбиваться из общего настроения проекта, поэтому сварил вот такой корпус из нержавейки. Внутри стрелочный вольтметр и антивандальные кнопки управления электроникой.
PAS-датчик (Pedal Assist System) снимает частоту вращения шатунов и отправляет сигнал в контроллер, который в свою очередь вращает мотор-колесо.
Поскольку я планировал ехать с дочкой, то заложил возможность установки детского кресла. Разумеется, саму гонку я проехал с выключенной электроникой, чтобы было всё по-честному. Детское кресло на маятнике и подпружинено, лялька кафует.
Подножка крепится сбоку, на каркас платформы. В принципе, устройство велосипеда получилось такое, что полностью завалить его на бок очень непросто. При падении он просто упрётся краями платформы в землю.
Поск оранжевых компонентов - тот ещё квест, особенно когда нет времени. Курок пришлось покрасить, а седло супруга перетягивала кожзамом в нужный цвет.
Сзади ещё один мини-багажник. Согнуть фанеру было непросто, но у нас получилось. Стабилизировали её эпоксидной смолой. Фару должны узнать любители советских автомобилей. Зарядное гнездо спрятано в самом низу.
На выставке WNKA 2026. Оранжевые покрышки заменили на вайт-волы. На мой взгляд, хоть изначально всё и строилось вокруг оранжевой резины, чёрно-белая классика выглядит контрастнее и солиднее.
Небольшой ролик с процессом изготовления и заездом:
Честно, я три раза пытался залить клип напрямую сюда, но каждый раз после полной загрузки видео исчезало из поста. Я уже и шакалил его как мог, и форматы менял - всё без толку.
Получилось именно то что я и хотел: не самый быстрый, но лёгкий в управлении и педалировании мини-грузовичок. В связи со своим велостроительным хобби мне часто приходится возить всякие железки по городу. Теперь мне в этом будет помогать моя грузовая СОДА. Собственно, почему так назвал? Как и сказано в заголовке, нет ничего более полезного в хозяйстве как та самая незаканчивающаяся пачка на кухонной полке. Возьмите современную упаковку в руки и посмотрите на обороте - и в приготовлении еды используется, и машину мыть можно, и чуть ли не все болезни мира она лечит. С одной стороны вроде и наивно, с другой стороны - юмор наше всё.
P.s. люди шарящие за электро транспорт, а именно за покрышки размером 12" - подскажите хорошую резину размером 2.125 или больше. Решил попробовать литые - это ужас. Накат просто испарился, а батарея выедается в два раза быстрее. Моим личным топом всегда были Schwalbe Big Apple 12" из-за их прочного корда и возможностью накачки высокого давления. Но мне хочется что-то потолще, попузатее что-ли.
Всем красивых велосипелов!
На момент июля 2026 года уже есть десятки нейронок,есть как популярные так и конечно же не популярные(провалившиеся либо просто не известные),оценивать какая нейронка лучше будем с помощью того самого... истинного... уже легендарного... В.А.Й.Б КОДИНГА
Начнём:
Deepseek-одна из худших нейронок... была до весны/лета,в неё выкатили достаточно хорошую обнову с помощью которой можно создать даже мобильную игру с помощью HTML,тут главное- хороший промпт и терпение,специально для этого поста создал простую игру по тематике кликера,получилось так себе,потребовалось ±9 попыток на что то нормально,но нейронка не понимает большинство просьб(Динамичный фон нормальный,модельки чуть качественней и т.п.) логично что данные вещи пока что ии выполнить не в состоянии,оценка: 3.7 звезд из 5-и
2. Chat gpt - спойлер,это худшая нейронка которой я только пользовался для вайб кодинга,не смогла создать даже близко начальную версию дип сика,говорить не о чем,0 звездочек из 5-и
Продолжение поста следует(решил частями опубликовать:>)
В следующих постах будем разбирать грок,клауд и прочие уже не особо популярные нейронки