Bash Days | Linux | DevOps
23.3K subscribers
155 photos
24 videos
676 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Фиксим кривой Exit Code в docker

Во время работы с docker контейнером наткнулся на неочевидный код выхода (exit code).

Про exit codes (коды выхода) писал тут


Суть проблемы: Когда программа внутри контейнера падает с abort(), Docker возвращает неправильный код выхода. Вместо ожидаемого 134 (128 + SIGABRT), контейнер отдаёт 139 (128 + SIGSEGV).

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

Давай проверим:

#include <cstdlib>

int main() {
std::abort();
return 0;
}


Пишем Dockerfile:

FROM ubuntu:22.04

RUN apt-get update \
&& apt-get -y install \
build-essential \
&& rm -rf /var/lib/apt/lists/*

COPY ./ /src/
WORKDIR /src/
RUN g++ main.cpp -o app

WORKDIR /
CMD ["/src/app"]


Собираем и запускаем:

docker build -f ./Dockerfile -t sigabort_test:latest .
docker run --name test sigabort_test:latest ; echo $?


А на выходе у нас код: 139.

В примере выше код выхода — 139 = 128 + 11, где 11 соответствует SIGSEGV (ошибка сегментации), а не 134 = 128 + 6, что был бы SIGABRT (аварийное завершение).

Чтобы это пофиксить, нужно захерачить хак:

CMD ["bash", "-c", "/src/app ; exit $(echo $?)"]


docker run --name test sigabort_test:latest ; echo $?
bash: line 1: 6 Aborted /src/app
134


После этого контейнер будет возвращать корректный код 134.

Вариант рабочий, но костыльный. Правильнее использовать ключ --init.

Если запустить контейнер с флагом --init, используя исходную команду CMD ["/src/app"], мы получим ожидаемый 134 код. Что нам и нужно.

docker run --init --name test sigabort_test:latest ; echo $?

134


Почему init все починил?

Давай копнём глубже. В Linux процесс с PID 1 (init) имеет нестандартную семантику сигналов:

- Если у PID 1 для сигнала стоит действие «по умолчанию» (никакого обработчика), то сигналы с действием terminate игнорируются ядром. Это сделано, чтобы случайным SIGTERM/SIGINT нельзя было «уронить» init.

- PID 1 должен забирать зомби-процессы (делать wait() за умершими детьми). Если этого не делать, накопятся зомби.

- PID 1 обычно пробрасывает сигналы дальше — тому «настоящему» приложению, которое оно запускает.

Когда мы запускаем контейнер без --init, приложение становится PID 1.

Большинство обычных приложений (на C/C++/Go/Node/Java и т.д.) не написаны как «инит-системы», они не настраивают обработку всех сигналов, не занимаются «реапингом» детей и не пробрасывают сигналы. В результате вылазиют баги.


Наш сценарий с abort() (который поднимает SIGABRT) упирается именно в правила для PID 1. abort() внутри процесса поднимает SIGABRT.

Для обычного процесса с PID ≠ 1 это приводит к завершению с кодом 128 + 6 = 134. Но если процесс — PID 1, ядро игнорирует «терминирующие» сигналы при действии по умолчанию. В результате стандартные ожидания вокруг SIGABRT ломаются.

Ну а дальше вступают в силу детали реализации рантайма/сишной библиотеки, как именно контейнерный рантайм считывает статус.

На практике это может приводить к тому, что ты видишь 139 (SIGSEGV) вместо ожидаемого 134 (SIGABRT).

И тут проблема не в docker, а в том, что приложение неожиданно оказалось в роли init-процесса и попало под его особые правила.

Вот и вся наука. Изучай.

🛠 #docker #devops #linux #debug

@bashdays @linuxfactory @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
569
Fedora Post Install

Набрёл тут на Bash поделку CRIMS0NH4T.

В двух словах — делает за тебя необходимую рутину после чистой установки Fedora.

— Настройка DNF
— Установка RMP Fusion
— Установка кодеков
— GPU драйвера (Intel, Nvidia, AMD)
— Тюнинг производительности
— Оптимизация Gnome

Как я понял, версия прям ранняя альфа-альфа и активно допиливается автором.

Я бы минимально запатчил так:

- set -u
+ set -euo pipefail
+ IFS=$'\n\t'

- readonly LOG_FILE="/tmp/crimsonhat_$(date +%Y%m%d_%H%M%S).log"
+ LOG_FILE="$(mktemp /tmp/crimsonhat.XXXXXX.log)"
+ readonly LOG_FILE

- run_with_progress() { local message="$1" shift log INFO "$message" if "$@" >/dev/null 2>&1; then return 0 else return 1 fi }
+ run_with_progress() {
+ local message="$1"; shift
+ log INFO "$message"
+ if "$@" >>"$LOG_FILE" 2>&1; then
+ return 0
+ else
+ return 1
+ fi
+}

- disk_type=$(lsblk -d -o name,rota | awk 'NR==2 {print $2}')
- primary_disk=$(lsblk -d -o name,rota | awk 'NR==2 {print $1}')
+ read -r primary_disk disk_type < <(lsblk -dn -o NAME,ROTA | head -n1)
...
- current_scheduler=$(cmd < "$scheduler_path" 2>/dev/null | grep -o '\[.*\]' | tr -d '[]')
+ current_scheduler=$(tr -d '\n' < "$scheduler_path" | sed -n 's/.*\[\(.*\)\].*/\1/p')


Хотя set -euo pipefail тут конечно спорный вариант, можно наступить на грабли.

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


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

🛠 #linux #tweaks

@bashdays @linuxfactory @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
523
Сегодня поделюсь историей, которая началась плохо, но закончилась хорошо.

🔤🔤🔤🔤🔤🔤🔤

В общем, у меня домашний шлюз - mini PC на debian. А поскольку мощность для шлюза избыточна, приходится использовать ее не по прямому назначению.

Поставил туда transmission-daemon, и рулю в консоли через transmission-remote.

Сами понимаете, что каждый раз в консоли набирать transmission-remote да еще с ключами — кнопки сотрутся, поэтому пользуюсь алиасами.

И вот сегодня я накосячил с алиасом настолько знатно, что bash упал и я покинул чат. И после этого не смог подключиться по ssh.

Если бы я правил sshd_config, я бы, конечно, подключился двумя сессиями, и все восстановил. Кто ж знал, что правка .bashrc тоже опасна.

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

1. Выполнить ssh user@host -t /bin/sh

Вместо /bin/sh можно указать любую оболочку (их примерный список можно глянуть в /etc/shells). Понятно, что оболочка должна быть установлена на удаленной машине.

2. Подключиться по sftp, скачать .bashrc, локально отредактировать и залить обратно.

В общем, все сработало нормально. Алиас исправил. Все работает.

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

Кстати, использование именно первого пункта позволяет обходить тривиальные защиты ssh (типа скриптовой двухфакторной аутентификации или использование sleepshell для пользователя, которому только разрешен проброс портов), основанные на простой замене оболочки пользователя в /etc/passwd.

При выполнении скрипта, хакер уже аутентифицирован в системе, и может просто заменить оболочку.

🛠 #linux #ssh #fix

@bashdays @linuxfactory @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
553
Вот не пойму, это оно мне жопу нарисовала или сиськи? Радоваться или плакать? Но похоже больше на жопу...

🛠 #рабочиебудни #мониторинг

@bashdays @linuxfactory @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1252
В сентябре Selectel запустил OpenFix – программу для тех, кто хочет делать open source безопаснее, чище и надежнее. Там пул задач по рефакторингу на Rust, пакетизацию приложений, исправление багов с оплатой от 30 000 до 350 000 ₽.

При этом – ПО распространяется по пермиссивной лицензии, мейнтейнером остается автор, а код — в свободном доступе.

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

Весь движ – на странице проекта. Следите за тем, как идет работа над задачами, делитесь своим мнением и ждите дроп новых активностей!

Реклама, АО «Селектел», erid: 2VtzqwEKGLE
14
Имба — Mail Archiver.

В двух словах: Агрегатор и бекапер всех твоих почтовых ящиков с удобным поиском.

Ставишь как self-hosted, добавляешь любые учетки по IMAP (+ M365) и вся твоя почта бекапится на локальный NAS или S3.

Фича — можешь зачистить всю почту на серверах и потом одной кнопкой из бекапа обратно восстановить все письма. Как вариант если закончилось место, но письма удалять жалко.

Например, можно перелить почту из одного сервиса в другой в пару кликов. А главное — Бесплатно!

Короче знатная штука, однозначно оставляю у себя в proxmox, да и движение селф-хостеров её прям зарекомендовали на фоне других подобных решений.

Можешь на ютубе глянуть, там обзорчики уже наснимали.


🛠 #utilites #backup

@bashdays @linuxfactory @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
378
Хорошие девопсы копируют, великие — воруют

Я тут чет ёба дал и решил потихоньку расковыривать Макса, пока только начинаю, но до кишочков тоже доберемся.

Под это дело, я завел отдельный телеграм канал. В котором мы с тобой создадим канал в Максе, раскрутим его с минимальными вложениями и выйдем на доход > 200к рублей в месяц.

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

План надежный, как швейцарские часы.


Все шаги буду подробно описывать, можешь повторять и глядишь сможешь выйти на пассивный доход.

😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Кстати сегодня закинул пост про создание канала без наличия 10к подписчиков. Пока хак работает, так что не проебись.


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

Подписаться: Макс на Максимум
Please open Telegram to view this post
VIEW IN TELEGRAM
1225
Вчера сижу, проверяю домашки. Приходит СМС, мол Роман спасибо, что совершили покупку, с вашего бонусного счета списано 2450 рублей.

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

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

Первым делом написал в саппорт, меня по шаблону послали нахуй. Окей… Ну раз так, значит найдем директора и позвоним ему.

Звонить не стал, чет зассал. Но написал в мессенджере. Описал ситуацию, скрины приложил.

На той стороне солидный мужчина (по аватарке) знатно охуел, но ответил — Принято, свяжусь с вами позже.

Часа через три, звонок — Зрасти, так и так, сотрудник компании спустя месяц после испытательного, получил доступы в базу клиентов и теперь активно списывает баллы с клиентов, кто больше полугода не обращался в компанию. Списывает в свою пользу, то есть оплачивает баллами товары для себя любимого.

Охуительный план! Надежный!

Спустили на тормозах, поржали. Сотрудник был выкинут на улицу.

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

Человека банально уволили из-за автоматического СМС, которое прикрутил какой-то айтишник в рамках рутинного спринта.

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

Кстати потом следом пошел и еще одну компанию разъебал, давно хотел, тоже впарили услугу, но услугу не предоставили. Сегодня уже возврат упал на карточку.


Как говорится — с миру по нитке. Не давай себя в обиду 😲

🛠 #рабочиебудни

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
9143
У меня Obsidian бекапится в git, естественно он торчит наружу жопой. Репа конечно же приватная, но чем черт не шутит.

Каких-то критичных данных я в заметках не храню, ну спиздят и спиздят, пусть читают как на bash программировать. Мне не жалко.

Но недавно понадобилось мне зашифровать некоторые заметки. Поизучал я различные варианты и остановился на плагине — Meld Encrypt.

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

Слева появляется иконка — New Encrypt Note, забиваешь туда пароль, подсказку. Создается исходный файл в формате mdenc, а не нативный markdown с расширением .md.

Внутри исходного файла json`чик вида:

{
"version": "2.0",
"hint": "My Hint",
"encodedData": "tH/epIAOSgeGQQtO7FTcM="
}


Что прикольно, ты можешь зашифровать не всю заметку, а только её часть либо критические данные в каком-нибудь пайплайне. Выделяешь эти данные и слева жмешь иконку — Ecrypt Selection.

Теперь этот файл .mdenc заливает в git и не зная правильного пароля хуй кто прочтет твою заметку, даже если её спиздят. Аналогично с заметками где ты зашифровал часть данных.

Шифрованная часть внутри заметки выглядит так:

🔐β 💡My Hint💡ls92E5jV+HlAfZMML== 🔐


Короче полет нормальный. Хер знает насколько сильный там энкрипт, но от лишних глаз эта штука защищает.

В одном из issue в репе есть комментарий — «I have reviewed the code and noticed that it uses AES-GCM with a fixed IV and a password-derived key.»

Ну и по коду могу сказать что работает примерно так:

Пользователь задаёт пароль для шифрования.

Ключ генерится на основе пароля, скорее всего это PBKDF2.

Шифрование проходит по схеме AES-GCM. Шифр AES, режим Galois/Counter Mode с поддержкой аутентификации (В коде есть тэг MAC).

Не уверен, но возможно используется фиксированный IV инициализационный вектор.

Автор плагина походу сам не знает, что он написал. Поэтому подстраховался и добавил в ридми — «Use at Your Own Risk», мол идите нахуй, если вас подломят я тут не причем.

Присмотрись, штука довольно полезная. В хозяйстве сгодится.

🛠 #encrypt #obsidian #utilites

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1165
Дожились блядь, схватил погремуху на LF. (скрином поделился: Антон Жданов) публикую с его разрешения и с разрешения участника диалога. Так что все блядь прозрачно и согласовано!

- Каждому лектору в жопу по вектору
- Лучше в жопу сунуть глобус чем у ЦУМА сеть в автобус
- Если ты не голубой нарисуй вагон другой


Новый бренд чтоль мутитиль - Сёледка под Шубой?

Ладно хули, рутина. Дела, люди всем двором на LF идут, устраивают челеджи, кто на какой задачке вперед сдохнет ))

Всех с пятницей, хороших тебе предстоящих выходных, ну и по классике — береги себя!

🛠 #рабочиебудни

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
747
Олды могут помнить эту замечательную игруху, называлась она Star Trek, придумал и реализовал ее Майк Мэйфилд в 1971 году.

Короче некий энтузиаст запилил ее на чистом Bash и притащил в современный мир под названием Bash Trek.

Это пошаговая стратегия, да, прям в терминале.

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

Устанавливается просто:

cd /tmp
wget https://github.com/StarShovel/bash-trek/raw/main/bashtrek.sh
chmod +x bashtrek.sh
./bashtrek.sh


И погнали сводить скулы.

Как играть:

Нажми на цитату чтобы развернуть

— Галактика — это сетка 8×8 квадрантов, каждый квадрант — 8×8 позиций.

— При навигации тебе будет предложено направление (0-7 как «ферзь» в шахматах, восемь возможных направлений) и расстояние (количество шагов).

— Если есть препятствие (звезда, клингон, червоточина), то максимальная дистанция движения будет ограничена и интерфейс покажет это.

— Червоточины («wormholes») могут появляться в квадрантах, если ты войдешь в червоточину, тебя телепортирует в случайное место в галактики.

— При входе в квадрант с клингонами, они могут атаковать твой корабль. Щиты (SHI) защищают, но если они севшие — тебе пезда.

— У тебя есть база (starbase), если ты подлетишь к базе, торпеды, щиты и энергия восстанавливаются.

— Есть временные ограничения «stardate» (звёздная дата), до которой нужно уничтожить всех клингов, если не успеешь — тебе пезда.


Короче затягивает, протупил сегодня пару часов, ни разу так и не победил.

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

🛠 #games #игры

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
647
Как прокачать Minecraft сервер с помощью Angie

Накидал пост о том, как мы мигрировали minecraft сервер на выделенный сервер и защитились от ботов с помощью Angie, просто и эффективно.

Сюда по классике не влезло, всё в блоге 👇

Читать: https://two.su/bieb4

🛠 #angie #devops #security

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
550
This media is not supported in your browser
VIEW IN TELEGRAM
Ха! Сегодня будем тыкать палкой «Крокодила».

Croc — это кроссплатформенный CLI-тор. С помощью этой штуки можно передавать файлы/каталоги между устройствами. Без айпи, хуйни и лишнего гемора.

Работает по принципу «отправь, введи код, получи по ебалу».

Установка под всё:

curl https://getcroc.schollz.com | bash
brew install croc
scoop install croc
choco install croc
winget install schollz.croc


Начнем! Я буду передавать файлы c Linux сервера на свою виндовую машину.

На Linux сервере запускаю:

cd /tmp && echo "Hello BashDays" >> bashdays.txt
croc send bashdays.txt


Получаем:

Sending 'bashdays.txt' (15 B)
Code is: 2811-spray-cabinet

On the other computer run:
(For Windows)
croc 2811-spray-cabinet
(For Linux/macOS)
CROC_SECRET="2811-spray-cabinet" croc


Так, идем на Windows машину и запускаем:

croc 2811-spray-cabinet


То есть берем «секретную строку» и передаем её получателю. Получатель запускает команду выше и видит:

C:\Users\user>croc 2811-spray-cabinet
Accept 'bashdays.txt' (15 B)? (Y/n) Y

Receiving (<-92.52.131.227:10350)
bashdays.txt 100% |████████████████████| (15/15 B, 73 B/s)


А на Linux машине:

Sending (->92.52.131.227:9015)
bashdays.txt 100% |████████████████████| (15/15 B, 41 kB/s)


Вуаля! Проверяем файл на винде, всё прекрасно передалось!

«Крокодил» не требует VPN, SSH, SCP, FTP, использует end-to-end шифрование (AES-256), работает между любыми ОС.

Фича — можно передать каталог, не архивируя его. Ну и как self-hosted воткнуть, чтобы уж совсем не параноить, как истеричка.

Да, есть прикол, что при получении ты вводишь «секретный код» и он отпечатается в истории команд, это хуйня. Поэтому просто запускаем croc и оно в интерактиве запросит код, вводишь код и дело в шляпе. В историю команд ничего не попало.

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


Под капотом P2P протокол через relay-сервер — работает даже если устройства за NAT.

На Android кстати тоже порт есть в F-Droid.


🛠 #utilites #tools #selfhosting

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
265
Как «сократить» расходы

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

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

С одной стороны делал полезную работу, с другой стороны всегда было ощущение — а нахуя я этим занимаюсь?

Зачем я это делаю, это понятно, а вот нахуя я пытаюсь сократить расходы — непонятно. Деньги то всёравно не мои. Если я сокращу расходы, моя ЗП не вырастит.

Ну да ладно. Пост про другое.

Как бы ты не менял поставщиков гандонов, пока ты не придумаешь как выращивать эти гандоны в своём огороде — нихрена не поменяется.

Допустим ты придумал и начал выращивать гандоны в своём огороде.

Хотя их можно и не выращивать, позови 10 человек на собес и 9 из них будут гандонами. Неплохо? Ага!


Блядь, всё отвлекаюсь. Короче выращиваешь ты гандоны и сэкономил 1000 баксов. Охуенно? Охуенно!

Но в итоге ты получаешь — саппорт этого огородика, решение технических проблем, отбивка тикетов от орущих сучек и т.п. Но зато сэкономил 1000 баксов компании.

Видишь где наебалово? Знаю, видишь…

Теперь у тебя часть команды поддерживает производство гандонов, тратит на это время, в какой-то момент задачи из спринта перестают запиливаться вовремя. Ага, нужно нанять еще людей, нанимают человека за 1000 баксов в месяц.

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

Сэкономили, молодцы. Только вот эта сэкономленная тыща баксов идет на ЗП новому сотруднику + компания платит за сотрудника налоги, пенсионные и т.п. сборы в казну. 1000 баксов превращается в 1500 баксов.

Заебись сэкономили! Ну вот и я про тоже.

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

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

Чё еще сказать. Если что-то делаешь, подумай — а нахуя я это делаю? Сейчас да, разумно поднимать свои гандонные фабрики и свои сервисы, но это разумно лишь в текущих реалиях, когда загнивающие дрочепаки обложили нас санкциями.

Всё, иду я нахуй дальше диван продавливать. Удачи!

🛠 #трудовыебудни

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1254
Профессиональная деформация

Каждый раз когда вижу урл вида:

https://bashdays.ru/?p=4893


Невольно тянется рука поставить в конце символ ' и посмотреть что будет.

Башкой понимаю, что в современном мире такое сработает 1 раз на 100кк, но ничего поделать с собой не могу. Когда видишь потенциальную дырку — нужно попробовать вставить.

А какая у тебя деформация? Поделись своим скелетом в комментах 😲

Кстати LF подорожал, кто не успел или кого выперло, заходите, раздам 30 промокодов по 1000 рубасов. Для тех кто уже занимается, повышений не будет.


🛠 #трудовыебудни

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
25
Хотелось бы поговорить о гувернантках, но будем обсуждать губернаторов. (governors).

🔤🔤🔤🔤🔤🔤🔤

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

Так вот, управляют частотой/производительностью/энергопотреблением специальные алгоритмы, которые называются governors. Чтобы было проще выбирать, их наштамповали несколько видов:

performance — максимальная производительность (Ну, почти максимальная)
powersave — максимальное энергосбережение
ondemand — быстрое изменение частоты от нагрузки
conservative — медленное изменение частоты от нагрузки
schedutil — интеграция с планировщиком ядра Linux

К сожалению не все губеры доступны для вашей системы. Список доступных можно посмотреть так:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors


Вот, у меня на ноуте доступны только два: performance schedutil

Используемый в настоящее время:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor


Обратите внимание, governor задается для каждого ядра отдельно.

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

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

Делается это простым скриптом:

#!/bin/bash
declare -a KEEP_GOVERNOR
declare DIR_PREFIX=/sys/devices/system/cpu
declare SET_GOVERNOR='performance'
declare -i NPROC=$(nproc) # число ядер (процессоров)
declare -i PRESENT=0

#Проверка поддержки governor системой
for G in $(cat "$DIR_PREFIX/cpu0/cpufreq/scaling_available_governors");do
if [[ "$SET_GOVERNOR" == "$G" ]];then
PRESENT=1
break
fi
done

if !((PRESENT));then
echo GOVERNOR $SET_GOVERNOR not supported.
printf "Available governors : "
cat "$DIR_PREFIX/cpu0/cpufreq/scaling_available_governors"
exit 1
fi

# Keep current setting
I=NPROC
while ((I--));do
KEEP_GOVERNOR[$I]=$(cat "$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor")
done

# Set (Для установки требуются привилегии)
I=NPROC
while ((I--));do
echo "$SET_GOVERNOR">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor"
done

#Здесь ВАШ код

sleep 10

##############

# Restore settings
I=NPROC
while ((I--));do
echo "${KEEP_GOVERNOR[$I]}">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor"
done


Если все делать в ручном режиме. Поменять governor для всех ядер можно командой:

sudo echo performance| sudo tee /sys/devices/system/cpu/cpu{0..1}/cpufreq/scaling_governor


здесь performance - задаваемый governor

{0..1} - описание числа процессоров (ядер). Для шестнадцати {0..15}.

Такая установка проживет до перезагрузки. Если требуется постоянные настройки - можно поставить в cron @reboot, прописать в grub или воспользоваться специальными утилитами.

Продолжение следует.

🛠 #cpu #performance #frequency #governor

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
36
Здесь я рассказал, как просто управлять производительностью сервера с помощью governors.

🔤🔤🔤🔤🔤🔤🔤

Но есть еще один способ: Прямое управление частотой.

Дело в том, что governor задает только скорость нарастания и убывания частоты, в зависимости от нагрузки. Сами частоты заданы в файлах:

/sys/devices/system/cpu/cpu0/cpufreq/

scaling_min_freq
scaling_cur_freq
scaling_max_freq

Но и пределы частоты тоже можно менять.

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

/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

(это для нулевого ядра)

У меня на ноуте, например, 1350000 1200000 1000000

Посмотреть частоты можно здесь:

cpuinfo_min_freq - минимальная частота ядра
cpuinfo_cur_freq - текущая
cpuinfo_max_freq - максимальная

👆 Надеюсь, всем понятно, что разогнать проц данным способом не получится.

Таким образом, командой типа:

cp cpuinfo_max_freq scaling_min_freq

Любой governor превращается в performance. Пути к файлам я опустил, и на всякий случай напомню, что частоты задаются для каждого ядра отдельно.

Кстати, повышать частоты требуется не всегда.

Приведу пример:

У меня работает роутер на мини-PC. Если использовать его только как роутер - нагрузка максимум 5%.

Я поставил туда торрент-качалку. А она может загрузить проц, даже если использовать nice. Но я задал минимальную частоту в качестве максимальной:

cp cpuinfo_min_freq scaling_max_freq

Теперь мини-PC холодный, даже если прикидывается сервером и работает на 100% (В полку).

Код для установки максимальной производительности получается несколько проще, чем с governor:

#!/bin/bash
declare -a KEEP_MINFREQ
declare DIR_PREFIX=/sys/devices/system/cpu
declare -i NPROC=$(nproc) # число ядер (процессоров)

# Keep current setting
I=NPROC
while ((I--));do
KEEP_MINFREQ[$I]=$(cat "$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq")
done

# Set
I=NPROC
while ((I--));do
# Поднимаем минимальную частоту до максимума
cp "$DIR_PREFIX/cpu${I}/cpufreq/cpuinfo_max_freq" "$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq"
done

#Здесь ВАШ код

sleep 10

##############

# Restore settings
I=NPROC
while ((I--));do
echo "${KEEP_MINFREQ[$I]}">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq"
done

Всем стабильных серваков!

🛠 #cpu #performance #frequency #governor

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
38
CPU AFFINITY

По просьбе коллеги @dox89.


🔤🔤🔤🔤🔤🔤🔤

Предыдущие статьи по настройке производительности Здесь и Здесь:

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

Таким образом планировщик системы пытается балансировать нагрузку, ресурсы (и тепловыделение). Но это поведение можно изменить.

С помощью программы можно taskset можно запускать процессы на указанных ядрах.

Например:

taskset --cpu-list 0-2,6 thunderbird


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

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

Если использовать ключик -p PID, то аналогичную процедуру можно выполнить с уже запущенным процессом.

Современные процессоры имеют гибридную архитектуру. Т.е. они содержат и энергоэффективные и производительные ядра.

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

Ну, или для всей «шушеры» выделить пару ядер, освободив остальные для самых важных процессов.

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

Ну, и напоследок - вредный совет.

Однажды у моего коллеги на работе эффективные менеджеры ввели KPI.

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

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

А потом - о5-25.

Но как они этого добивались - я не знаю :-)

man taskset
man nice

🛠 #cpu #core #taskset #nice #perfomance

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
46
Борьба за производительность

В продолжение истории борьбы за производительность.

🔤🔤🔤🔤🔤🔤🔤🔤

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

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

Тут на помощь приходят 4 параметра ядра - isolcpus, nohz_full, rcu_nocbs и irqaffinity.

В рамках решаемого кейса сразу указал на них, что сократило поиск необходимых решений.

По сути, все 4 параметра решают одну задачу - ограничить использование указанных ядер (например 0-3) процессами, за исключением базовых - init, scsi и прочих.

Таким образом мы можем через тот же taskset указать вручную на ядра 0-3 те процессы, что нам нужны.

В данной картине мы защищаем этот сегмент от службы irqbalance, которая с завидным упорством будет ребалансировать процессы между ядрами.

Но будьте внимательны при изоляции, так как в случае количества процессоров > 1 нужно чуть иначе выставлять диапазоны, чтобы не угодить в яму NUMA. Там деление ядер от 0 до последнего происходит сегментами по очереди.

Конкретно мой случай изоляции был применен в рамках разделения нагрузки на сетевые прерывания и nginx, но в совокупности факторов - параметры ядра, отключенный + маскированный irqbalance, taskset и еще несколько твиков - давало профит только при утилизации сетевой карты лишь до 70%, дальше спецэффекты постепенно возвращались.

🛠 #cpu #core #taskset #nice #perfomance

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
20
Опять потерял заявку? Не ты один

Когда в компании появляются десятки или сотни запросов: на оборудование, доступы, оплату или закупку — без системы они начинают теряться. Кажется, что все под контролем, но на деле у каждого отдела складываются разные процессы: кто-то пишет в личку, некоторые отмечают в табличке, а кто-то “давай голосом”.

12 ноября в 17:00 пройдет вебинар «Как упорядочить работу со входящим потоком задач». Покажут, как один раз настроить все процессы в Яндекс Трекере и больше никогда не искать, куда пропала заявка. Расскажут, почему важно вести всё через Трекер, как документировать процессы в Вики, автоматизировать назначение ответственных и какие фишки автоматизации используют сами в Яндексе.

Ведут вебинар руководитель продуктового направления Трекера Данил Майорский и архитектор решений и амбассадор Трекера Татьяна Родина. Полезно всем, кто регулярно в работе использует таск-менеджеры: IT-руководителям, администраторам, HR, AХО и тем, у кого входящих задач больше, чем часов в сутках.

Регистрируйся по ссылке.

#workflow #автоматизация #трекер
10