unix
November 21, 2023

Разработка на "дровах" или FreeBSD на очень старом железе

Настало время замечательных историй, в этот раз расскажу про работу современной 64-битной ОС на очень старом железе. И про современную разработку на этом. Жертвам Node.js посвящается.

Обратите внимание на потребление памяти браузером Chrome и удавитесь от зависти ;)

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

Вообщем я решил проучить малолетних долбо@бов от разработки, на личном примере.

С ближайшей помойки антресоли был взят вот такой ноутбук из далекого 2008го года:

Краткие характеристики:

15.4" / AMD Turion 64 X2 TL-62 2.1 Ghz / RAM: 2048 Mb DDR2 667 МГц / HDD: 250 Gb / Video: ATI Mobility Radeon HD 2600 / Vista Home Premium (32 bit) /

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

Update: после выкладывания статьи на ЛОРе, оказалось что я мажор и буржуй зажрался а такие (и даже более слабые) машинки используются линуксоидами в полный рост в качестве основных и по работе.

Вот уж воистину «дух советского инженера» неистребим.

Эксперимент

Суть эксперимента:

добиться более-менее приемлемой работы современной 64-битной ОС и всего прикладного ПО (включая среду разработки) на столь устаревшей машине.

Это бескомпромиссный, самый хардкорный вариант:

Вышедшая на прошлой неделе 14я версия FreeBSD и 118й хром - свежее некуда. На железе 16 летней давности да.
Железка оказалась даже более мощной чем написано в интернете - аж 3Гб памяти на борту (не забываем про 2008й год)

Хотч разумеется есть и более обычные варианты использования старого железа:

устаревшие или специализированные версии линукса, старые версии Windows и конечно же никакого современного софта, тем более средств разработки.

Только старые версии Хрома или Firefox ESR.

Но поскольку я немного понимаю в разработке и компьютерах — пойду другим путем треша и угара тотального тюнинга и оптимизации.

Кстати эта статья тоже писалась на «дровах» — том самом 16-летнем ASUS, описанном выше, для большей хардкорности:

Поскольку спор был про разработку на таком, вот вам для иллюстрации чистый новый проект на Java 20 (свежее некуда уже есть), запущенный в полноценной среде разработки Eclipse:

Напоминаю, все это на машине которой 16 лет и 3Гб памяти на все.

На скриншоте также представлены:

Maven, Spring Boot, Apache Tomcat, Spring MVC со всей своей горой библиотек — все по современному.

У среды разработки Eclipse видна дата сборки 7 ноября 2023 года, это самая последняя версия на момент написания статьи:

Статья написана 20 Ноября 2023го, так что релиз свежайший.

Разумеется оно подтормаживает, но минимально комфортная соврменная разработка вполне возможна даже на таких дровах. Для демонстрации записал небольшое видео работы, чтобы вы примерно понимали как это выглядит и работает:

Установка и драйвера

В этом ноутбуке еще есть DVD-ROM, но заморачиваться поиском чистой болванки записью образа я не стал и ставил сразу с bootable USB и соответствующего образа FreeBSD. Разумеется никаких UEFI и Secure Boot тут нет, поэтому нужно использовать старый добрый MBR.

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

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

Видеокарта, WiFi, ethernet, звук, touchpad, suspend/resume

Вот с видеокарты и начнем.

ATI Mobility Radeon X2300 — так называется эта дискетная видеокарта, вот что показывает вызов pciconf:

Как это ни странно, но даже столь старая карта поддерживается свежим модулем radeonkms, портированным из Linux еще в 2015м.

К сожалению скорость с этим модулем оставляет желать лучшего, также есть стандартные проблемы с зависаниями после переключения TTY и несколькими suspend/resume циклами.

Поэтому я использовал устаревший драйвер из Xorg:

pkg install xf86-video-ati

С вот такой настройкой:

cat /usr/local/etc/X11/xorg.conf.d/20-radeon.conf 
Section "Device"
    Identifier "Card0"
    Driver     "radeon"
EndSection

Вызов glxgears показывает вполне неплохие FPS:

Не забываем про 2008й год )

Touchpad

Точпад оказался достаточно редким, от компании GlidePoint:

dmesg |grep psm0
psm0: model GlidePoint, device ID 0

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

Для исправления добавил для него вот такую настройку :

cat /usr/local/etc/X11/xorg.conf.d/30-touchpad.conf 
Section "InputClass"
  Identifier "touchpad"
  MatchIsTouchpad "on"
  Driver "libinput"
  Option "Tapping" "on"
  Option "NaturalScrolling" "on"
EndSection

Беспроводная сеть

Карта нашлась сразу, драйвер ath ее успешно подцепил:

pciconf -lv | grep Wire
    device     = 'AR242x / AR542x Wireless Network Adapter (PCI-Express)'

Дальше никаких нареканий и проблем замечено не было.

Тюнинг ОС

Тюнинг FreeBSD традиционно заключается в изменении нескольких конфигурационных файлов с последующей молитвой и перезагрузкой.

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

/boot/loader.conf

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

Добавление, удаление или изменение этих настроек требует перезагрузки системы.

Ниже будет список настроек с описанием.

Max shared memory segments per process (максимальное число общих сегментов памяти на процесс):

kern.ipc.shmseg=1024

Max number of shared memory identifiers (максимальное число идентификаторов в общей памяти):

kern.ipc.shmmni=1024

Пропуск ожидания инициализации USB-устройств для загрузки корневой файловой системы:

hw.usb.no_boot_wait=1  

/etc/rc.conf

Этот файл содержит настройки запускаемых при загрузке ОС сервисов.

Включение WiFi карты вместе с всей обвязкой: wpa_supplicant, dhcp и тд:

wlans_ath0="wlan0"
ifconfig_wlan0="WPA DHCP"

Запрос времени по протоколу NTP при запуске

ntpdate_enable="YES"

Запуск сервиса управления питанием (это все же ноутбук):

powerd_enable="YES"

Запуск SDDM — графического менеджера авторизации (рисует окошко ввода логина и пароля):

sddm_enable=YES

Запуск DBus сервиса:

dbus_enable=YES

Очистка каталога /tmp при запуске:

clear_tmp_enable="YES"

Автоматическое подтверждение при запуске fsck утилиты (исправление ошибок диска, актуально для старых машин):

fsck_y_enable=YES

Запрет для syslog на открытие сетевых сокетов:

syslogd_flags="-ss"

Отключение демона sendmail, поскольку это ноутбук:

sendmail_enable="NONE"

Отключение создания «kernel crash dumps» — специальных файлов для отладки ядра ОС:

dumpdev="NO"

Включаем эффект «залипания» при вводе:

keyrate=fast

Отключаем «Message of the day (MOTD)»:

update_motd=NO

Отключение генерации уникального ID машины:

hostid_enable=NO

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

powerd_enable="YES"

на:

powerdxx_enable="YES"

Не забыв его установить:

pkg install powerdxx

Теперь переходим к настройкам параметров самой ОС.

/etc/sysctl.conf

Данный файл содержит настройки системы, которые применяются во время работы.

Большая часть этих настроек может быть изменена без перезагрузки.

Увеличение буфера чтения UFS (UFS readahead):

vfs.read_max=128
Поскольку машина старая, ZFS запредельно медлителен и пришлось использовать более старую UFS.

Разрешить пользователям (без прав root) монтирование файловых систем:

vfs.usermount=1

Аналог «Linux swappiness», делает систему более отзывчивой под высокой нагрузкой CPU:

kern.sched.preempt_thresh=224

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

Еще одна тонкая настройка для большей отзывчивости системы:

For lower latency you can decrease schedulers maximum time slice
default: stathz/10 (~ 13)
kern.sched.slice=3

Отключение бипера (чтоб не пищало):

# disable annoying system beep
hw.syscons.bell=0
kern.vt.enable_bell=0

Специальная настройка для работы Chromium:

kern.ipc.shm_allow_removed=1

Не дает переводить в swap все общие страницы памяти:

shm_use_phys Wires all shared pages, making them unswappable
Use this to lessen Virtual Memory Manager's work when using Shared Mem.
Useful for databases
kern.ipc.shm_use_phys=1

Еще одна важная настройка для старой машины:

vm.swap_idle_enabled=1

Вот что это такое:

The vm.swap_idle_enabled sysctl is useful in large multi-user systems where you have lots of users entering and leaving the system and lots of idle processes. Such systems tend to generate a great deal of continuous pressure on free memory reserves. Turning this feature on and adjusting the swapout hysteresis (in idle seconds) via vm.swap_idle_threshold1 and vm.swap_idle_threshold2 allows you to depress the priority of pages associated with idle processes more quickly then the normal pageout algorithm. This gives a helping hand to the pageout daemon. Do not turn this option on unless you need it, because the tradeoff you are making is to essentially pre-page memory sooner rather than later, eating more swap and disk bandwidth. In a small system this option will have a detrimental effect but in a large system that is already doing moderate paging this option allows the VM system to stage whole processes into and out of memory more easily.

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

Тюнинг Chrome

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

Ungoogled Chromium

Практически с самого своего появления в виде открытого проекта, существовало две версии Chrome:

Google Chrome — официальная версия, со всеми сервисами от Гугла, глубоко интегрированными в браузер. Автоматический поиск из адресной строки, защита от фишинга, проверка ошибок DNS — это все там.

Chromium — официальная, но неподдерживаемая версия, с частично отключенными сервисами Гугла. Типа для разработчиков. Выкладывается в виде исходных кодов, бинарные сборки поддерживаются исключительно в рамках (и силами) ментейнеров конкретного дистрибьютива или ОС.

Все бинарные сборки Chromium под Windows являются неофициальными и не поддерживаются Google.

В Chromium по прежнему присутствует телеметрия и используются некоторые сервисы Гугла, что разумеется сильно не нравилось некоторым фанатам компьютерной безопасности.

Поэтому в 2015м году появляется проект Ungoogled Chromium:

The ungoogled-chromium project was founded by a hobbyist with the user name Eloston in 2015. It was first developed for Linux, then for other operating systems.[10][11] Eloston used to release builds, but eventually he stopped doing so and allowed others to provide builds with his patches.[12]

С прошлого года сборка Ungoogled Chromium стала версией «по-умолчанию» в FreeBSD, в самой современной 14й версии из пакетов ставится именно она. Вообщем ставим:

pkg install ungoogled-chromium

запускаем:

/usr/local/bin/ungoogled-chromium 

и начинаем настройку.

Раздел chrome://settings/system

Отключаем и «Continue running background apps when Chromium is closed» и «Use hardware acceleration when available»:

Да, замечательные WebGL сцены с шейдерами работать не будут, но на таком железе это и так подразумевалось.

Раздел chrome://settings/performance

Тут нужно обязательно включить «Memory Saver»:

Раздел chrome://settings/cookies

Дальше, необходимо отключить «Clear cookies and site data when you close all windows», иначе будут сбрасываться все сессии по закрытию браузеа и придется заново каждый раз входить во все ваши соцсети и почту:

На этой же странице нужно отключить «Preload Pages», выбрав вариант «No preloading»

Проблема с расширениями

В какой-то момент видя нарастающую популярность сначала Chromium, а затем и Ungoogled Chromium, Гугол решил ограничить доступ к магазину расширений «Web Store» из «сторонних браузеров» — при заходе из такого браузера пропадает кнопка установки.

Разумеется столь наивное ограничение очень быстро обошли, реализовав специальное расширение.

Но чтобы его поставить надо сначала выставить еще один магический флаг настройки:

chrome://flags/#extension-mime-request-handling

Выглядеть должно вот так:

После этого необходимо перезапустить браузер, после перезапуска появится возможность установить расширение вот отсюда:

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

В результате в chrome://extensions/ у вас должно быть такое (правый блок):

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

Скрипт запуска

Но это было не самое веселое, самое самое это строка запуска Хрома:

/usr/local/bin/ungoogled-chromium  --single-process --disable-features=UseSkiaRenderer 

Вот где начинается черная магия и колдовство!

Теперь подробнее про каждый ключ.

--single-process

Выдержка из документации:

Single process: Chromium also allows a single process model which runs all of the browser and renderer code in a single OS process. This is generally not a safe or robust process model, since it prevents the use of the sandbox and cannot survive any crash in renderer process code. It is mainly used for older low-resource Android WebView scenarios, and for debugging or testing.

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

Но именно он позволяет впихнуть 20 вкладок браузера с картинками, видео и вебсокетами в меньше чем 1 Гб используемой памяти (столбец RES):

--disable-features=UseSkiaRenderer

Второй магический ключ, который отключает использование Skia. Обязательно использовать оба ключа вместе, поскольку браузер в режиме «single process» с включенным Skia падает.

Выводы

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

Но не стоит заблуждаться:

все это очень и очень сложно.

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

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

Если вы простой пользователь, которого нужда загнала на столь древнее железо то ничего не получится, даже не пытайтесь. Лучше копите 50-60к на нормальный современный ноутбук с Windows — для обычного «вкатывальщика в ИТ» это практически единственный возможный вариант.