Bash Days | Linux | DevOps
23.4K subscribers
157 photos
24 videos
1 file
683 links
Авторский канал от действующего девопса

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

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

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Чтоб тебе такого интересного рассказать… а давайка я научу тебя весьма полезной теме. Сегодня будем резать аппетиты.

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


Создаем синтетику

#!/bin/bash

while :; do :; done


Чмодим и запускаем. По итогу твой проц начинает хуярить как не в себя, выжирая на 100500% все свободные ресурсы. Хуита!

Давай это исправим и разрешим скрипту хуячить лишь на 50%.

Для начала проверяем, сможем ли мы это сделать

mount | grep cgroup2
cat /sys/fs/cgroup/cgroup.controllers


Если получил выхлоп, то в большинстве случаев у тебя всё получится.

Создадим клетку «bashdays.slice»:

sudo su
cd /sys/fs/cgroup
mkdir bashdays.slice
echo "+cpu +memory +io" > cgroup.subtree_control
cd bashdays.slice
echo $$ > cgroup.procs

echo "50000 100000" > cpu.max


Здесь мы включаем нужные контроллеры для дочерних директорий, запихиваем туда текущий shell и в последней строчке выставляем 50% для CPU.

Снова запускаем первый скрипт-пожиратель и наблюдаем как проц перестал хуярить как не в себя и ограничен теперь половинкой (50%). Отличная работа!

Что такое cgroups — это такая комната наказаний в ядре Linux. Ты создаёшь группу процессов, ядро начинает следить за их CPU, памятью, диском, IO и карать, если они жрут больше положенного.


Аналогично можно сделать и с RAM и с IO.

echo $((512*1024*1024)) > memory.max


Создаем еще одну синтетику:

#!/bin/bash
blocks=()
while true; do
blocks+=("$(head -c 104857600 </dev/zero | tr '\0' 'A')")
echo "Allocated ${#blocks[@]}00 MB"
sleep 1
done


Жрём память пачками по 100 МБ. Сначала увидишь замедление (reclaim), потом — пиздец! Нас выкинет локальный OOM, но только внутри cgroup, а не всей системы.

Посмотреть статистику в реальном времени:

cat memory.current
cat memory.events


Ну и давай посмотрим IO (тормозим винт и превращаем его в флешку USB1.1). Цель — мы хотим, чтобы процесс читал с диска не быстрее 10 МБ/с:

Узнаем major:minor:

lsblk --output NAME,MAJ:MIN


Допустим, диск — 8:0 (типичное для /dev/sda).

echo "8:0 rbps=10485760" > io.max


И запускаем:

#!/bin/bash

dd if=/dev/sda of=/dev/null bs=1M


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

Кстати это отличные способы заподлостроения либо как вариант подойдут для технических собеседований.

Например, говоришь кандидату — найди почему тормозит винт, либо — объясни почему скрипт жрет 50% процессора, а не 100%. Сразу вычислишь бродяг вайтишных, им даже ГПТ не поможет.


Короче такие вот приколы! Изучай!

🛠 #linux #cgroup #debug

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