Иногда прод падает не из-за zero-day, не из-за DDoS и не из-за кривого кода. Иногда его кладет… обычный rsync.
прод-сервер
staging
cron-задача синхронизации
и уверенность «я же сто раз так делал»
Команда выглядела примерно так:
rsync -av --delete /data/ backup@storage:/prod-data/
Или еще лучше:
rsync -av --delete /data/ /mnt/nfs/prod/
Все работало годами. Пока однажды:
/data не примонтировалсяNFS отвалился
переменная с путем оказалась пустой
кто-то перепутал source и destination
И rsync честно сделал то, что должен был сделать.
С --delete.
Особенно опасные кейсы:
/data - пустая локальная папкаrsync --delete удаляет все на целевом хранилище.
SRC=""
rsync -av --delete $SRC /backup/
Подставится / или текущая директория. И дальше - лотерея.
rsync -av --delete backup:/data/ /data/
Удаляем прод, потому что backup оказался пустым.
inode удаляются
файловая система занята
приложения падают
БД начинают ругаться
контейнеры теряют volume
А вы смотрите на логи и видите, как rsync методично чистит прод.
rsync -av --delete --dry-run ...
Если видите тысячи deleting - остановитесь.
mountpoint -q /data || exit 1
--max-delete=100
Если удалений больше - rsync аварийно завершится.
LVM, ZFS, btrfs - спасают карьеры.
Бэкап не должен иметь права удалять прод-данные.
#linux #rsync
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😱1
Знакомая ситуация: приложение держит постоянное TCP-соединение (к БД, API, брокеру), все работает… а потом внезапно «connection reset» или таймаут. Особенно часто это происходит через 5–30 минут простоя. Причина обычно не в приложении, а в сети.
Между клиентом и сервером почти всегда есть:
NAT
firewall
балансировщик
облачный LB
Эти устройства хранят таблицы состояний соединений. Если трафика нет - запись удаляется. Со стороны приложения соединение живое, но по факту его уже нет.
TCP keepalive - это механизм, при котором стек TCP периодически отправляет служебные пакеты, чтобы подтвердить, что соединение ещё активно.
По умолчанию в Linux:
tcp_keepalive_time = 7200 (2 часа!)
tcp_keepalive_intvl = 75
tcp_keepalive_probes = 9
Для современных инфраструктур это слишком долго - NAT обычно живет 300–900 секунд.
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=5
Теперь проверка пойдет через 5 минут простоя, а не через 2 часа.
#linux #networking
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Файловая система Btrfs умеет делать снапшоты - мгновенные снимки состояния файловой системы. Это позволяет быстро откатывать систему или данные назад без использования LVM, внешних бэкапов или сложных схем.
Снапшоты в Btrfs работают по принципу Copy-on-Write (CoW): данные не копируются сразу. Создается только метаданные-ссылка на текущие блоки. Реальное место начинает занимать только то, что изменяется после создания снимка.
btrfs subvolume create /data
btrfs subvolume snapshot /data /data_snapshot
Это занимает доли секунды независимо от размера данных.
Можно сделать snapshot только для чтения:
btrfs subvolume snapshot -r /data /snapshots/data_2026-04-20
btrfs subvolume list /
btrfs subvolume delete /data
И возвращаем snapshot:
btrfs subvolume snapshot /snapshots/data_2026-04-20 /data
Система или сервис сразу получают прежнее состояние файлов.
снапшот не является полноценным Бэконом
повреждение диска уничтожит и данные, и снапшоты
для защиты данных используйте отдельные бэкапы (например restic или borg)
#linux #btrfs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🤡1
Инструмент незаменимый, возможностей у него огромное количество, но на практике чаще всего хватает небольшого набора команд. Ниже краткая шпаргалка из того, что реально используется в работе.
-nn, чтобы tcpdump не резолвил IP-адреса в домены и не подменял номера портов именами сервисов. В отладке это только мешает.
tcpdump -D
Если запускать tcpdump без параметров, он будет слушать первый активный интерфейс из списка.
tcpdump -nn -i any
Или конкретный:
tcpdump -nn -i eth0
tcpdump -nn -i any not port 22
Или наоборот смотреть только нужный порт:
tcpdump -nn -i any port 443
tcpdump -nn dst 1.1.1.1
Несколько адресов:
tcpdump -nn dst 1.1.1.1 or dst 9.9.9.9
Комбинация адреса и порта:
tcpdump -nn dst 1.1.1.1 and port 443
Фильтры можно комбинировать через and / or / not.
tcpdump -nn -i any arp
Или исключить его:
tcpdump -nn -i any not arp
tcpdump -nn -i any > ~/traffic.log
tcpdump -nn -i tun0 src 10.10.0.25 and dst 10.10.0.5 and port 443
Несмотря на пугающий вывод, tcpdump довольно простой инструмент.
Чаще всего достаточно увидеть строки вроде:
IP 10.0.0.12.53422 > 10.0.0.5.443
Где указаны источник, порт, получатель и порт назначения. Этого уже хватает, чтобы понять, что происходит в сети.
#network #tcpdump
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Многие привыкли к тому, что лимиты CPU и памяти - это что-то из мира docker и k8s. Но на самом деле механизм один и тот же:
cgroups. И если у вас обычный linux-сервер без контейнеров, вы все равно можете жестко ограничивать ресурсы для systemd-сервисов.Это удобно, когда один процесс начинает съедать всю память, душить CPU или мешать остальным сервисам на хосте.
В современных дистрибутивах используется cgroups v2, а systemd умеет работать с ним из коробки.
Память. Чтобы сервис не выедал весь RAM и не отправлял сервер в OOM.
CPU. Чтобы процесс не занимал все ядра и не мешал соседям.
Число процессов. Чтобы защититься от fork-бомб и неконтролируемого роста дочерних процессов.
systemctl edit myapp.service
Добавим:
[Service]
MemoryMax=500M
CPUQuota=50%
TasksMax=200
MemoryMax=500M - сервис не сможет использовать больше 500 МБ памятиCPUQuota=50% - максимум половина одного CPUTasksMax=200 - не более 200 процессов/потоковПосле этого применяем изменения:
systemctl daemon-reload
systemctl restart myapp.service
Проверить лимиты можно так:
systemctl show myapp.service | grep -E "MemoryMax|CPUQuota|TasksMax"
Или посмотреть, в какой cgroup живет процесс:
systemctl status myapp.service
Если хотите ограничить уже запущенный сервис без ручного редактирования unit-файла, можно использовать runtime-свойства:
systemctl set-property myapp.service MemoryMax=300M CPUQuota=25%
Это удобно для быстрого придушивания прожорливого процесса на боевом сервере.
[Service]
MemoryHigh=400M
MemoryMax=500M
CPUWeight=200
IOWeight=200
Тут разница такая:
MemoryHigh - мягкий порог, после которого ядро начинает сильнее давить процесс по памятиMemoryMax - жесткий пределCPUWeight - относительный приоритет по CPU среди других cgroupIOWeight - относительный приоритет по дисковому I/OCPUQuota=50% - это не половина всех ядер, а квота CPU-времени. На многоядерных системах поведение нужно понимать внимательно.
И еще: если сервис уже упирается в лимит памяти, он может начать падать, а не магически оптимизироваться. Лимиты защищают систему, но не исправляют плохое приложение.
#systemd #cgroups
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
Когда речь заходит о файловой системе на Windows Server, многие смотрят на ReFS как на новый NTFS. Но в реальной эксплуатации все не так просто.
NTFS - это универсальный и самый совместимый вариант.
ReFS - это специализированный инструмент под определенные сценарии, а не замена везде и для всего. Microsoft прямо позиционирует NTFS как файловую систему по умолчанию, а ReFS - как вариант для задач, где важны целостность данных, масштабирование и отдельные storage-оптимизации.
Но вот где начинается практика.
У него до сих пор не такая универсальная совместимость, как у NTFS. Для части сценариев microsoft сама рекомендует NTFS: например, SAN-тома в Failover Cluster обычно форматируют в NTFS, а для Azure File Sync серверный endpoint вообще поддерживается только на NTFS. Для S2D/Storage Spaces Direct, наоборот, ReFS - рекомендуемый вариант.
То есть выбор обычно выглядит так:
#windowsserver #refs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16❤3💩2
Теория без практики - не даст большого результата. Наткнулся на hands-on челлендж:
В кластере есть Pod, который не может нормально стартануть.
Он пытается подняться, но постоянно падает.
Причина: в спецификацию недавно добавили новый контейнер, и после этого init-последовательность стала некорректной.
Задачей является найти, что именно сломали, и починить, чтобы Pod снова запускался.
Внутри будет:
Ссылка
#kubernetes #devops
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Если обратиться к Nginx-серверу по IP-адресу, а не по доменному имени, то обычно откроется либо первый virtual host в конфиге, либо тот, где указан default_server в listen. Чаще всего показывать что-то реальное на таком запросе не хочется, поэтому на IP обычно вешают заглушку.
server {
listen 80 default_server;
server_name _;
return 404;
}
С обычным HTTP все понятно.
server {
listen 443 ssl default_server;
server_name _;
return 404;
}
не решает проблему полностью.
Что увидит пользователь: сначала предупреждение браузера о том, что сертификат не соответствует адресу, а потом, если продолжить, в сертификате можно будет увидеть домен реального сайта
Получается, что даже заглушка на IP все равно может засветить боевой домен.
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/certs/nginx.key \
-out /etc/nginx/certs/nginx.crt
И подключаем в default server:
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/certs/nginx.crt;
ssl_certificate_key /etc/nginx/certs/nginx.key;
return 404;
}
Такой подход уже лучше: реальные домены не светятся, но браузер все равно покажет предупреждение о недоверенном сертификате.
Для многих этого достаточно. Я и сам долго делал именно так. Но есть более аккуратный вариант:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 404;
}
Здесь ключевая директива -
ssl_reject_handshake on.Она позволяет сразу отклонять TLS-handshake, не отдавая пользователю чужой сертификат и не доводя дело до стандартного браузерного предупреждения о несовпадении имени.
Что это дает на практике:
запросы по IP на 443 сразу режутся;
сертификаты реальных виртуальных хостов не светятся;
пользователь сразу получает ошибку соединения, без лишних переходов и предупреждений.
В итоге это выглядит чище, чем схема с самоподписанным сертификатом-заглушкой.
ssl_reject_handshake on удобно использовать именно в default server для HTTPS-запросов, которые не должны попадать ни в один нормальный виртуальный хост. Если задача - не просто вернуть 404, а вообще не раскрывать ничего лишнего по IP, это один из самых аккуратных вариантов.#nginx #webserver
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19👍2🤡1
📘 На платформе Mentorix вышел курс — «Nginx на практике: от деплоя до production»
Практический курс по настройке Nginx для реальных задач: от базовой конфигурации до использования в production.
В курсе:
• настройка и конфигурация Nginx
• работа как reverse proxy
• SSL и HTTPS
• балансировка нагрузки
• подготовка конфигурации для production
Начать можно сразу — вводная часть курса доступна без оплаты.
🎁 Промокод: NGINX_20
Скидка 20% — действует 48 часов
👉 Пройти курс
Практический курс по настройке Nginx для реальных задач: от базовой конфигурации до использования в production.
В курсе:
• настройка и конфигурация Nginx
• работа как reverse proxy
• SSL и HTTPS
• балансировка нагрузки
• подготовка конфигурации для production
Начать можно сразу — вводная часть курса доступна без оплаты.
🎁 Промокод: NGINX_20
Скидка 20% — действует 48 часов
👉 Пройти курс
Когда на сервере внезапно заканчивается место, первое желание - запустить что-нибудь вроде
du -sh * и начать вручную искать, кто сожрал диск. Рабочий способ, но неудобный. Особенно если каталогов много, структура глубокая, а проблема уже горит.В таких ситуациях выручает
ncdu - консольная утилита для быстрого анализа использования диска. По сути это удобная оболочка над du, но с нормальной навигацией по каталогам в терминале.
apt install ncdu
или
yum install ncdu
ncdu /
После сканирования увидите дерево каталогов, отсортированное по размеру. Дальше можно просто ходить стрелками по директориям и сразу смотреть, что именно занимает место.
Почему это удобно:
не нужно вручную гонять du по каждому уровню
сразу видно самые тяжелые каталоги
можно быстро проваливаться внутрь и искать источник проблемы
работает прямо в терминале, без GUI и лишних зависимостей
ncdu /var
и почти сразу видите, кто виноват: разросшиеся логи, старые бэкапы, кэш пакетов, временные файлы или мусор в home-директориях.
ncdu /var
исключить файловые системы mount points (будет полезно, если не хотите случайно уйти в примонтированные тома и сетевые FS):
ncdu -x /
работать тише и быстрее на больших системах:
ncdu -q /data
Если запускать от root, картина будет полной, потому что утилита сможет читать все каталоги.
#ncdu #disk
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Когда в инфраструктуре нужен локальный DNS-кэш, выбор обычно сводится к трем вариантам: Unbound, BIND и systemd-resolved. Все они умеют работать с DNS, но подходят под разные задачи.
systemd-resolved - это в первую очередь локальный stub-resolver для хоста.
Unbound - легкий рекурсивный и кэширующий резолвер.
BIND - большой комбайн, который умеет и рекурсию, и authoritative DNS, и сложные серверные сценарии.
нужен DNS-кэш для сервера или небольшой сети - это Unbound
нужен DNS-комбайн с authoritative-зонами и сложной серверной логикой - это BIND
нужен просто нормальный локальный резолвер на Linux-хосте - это systemd-resolved
Поэтому перед выбором инструмента лучше честно ответить на вопрос: вам нужен локальный резолвер для одного хоста, кэширующий DNS для сети или полноценный DNS-сервер. И вот от этого уже выбирать: systemd-resolved, Unbound или BIND.
#dns #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Когда сервер начинает тормозить, первая ошибка - сразу лезть в логи и гадать, что что-то жрет ресурсы. Гораздо полезнее сначала быстро ответить на три вопроса: кто грузит CPU, кто долбит диск, и где именно начинается узкое место.
Для такой первичной диагностики очень хорошо работают три утилиты:
iotop, dstat и pidstat. Они не заменяют полноценный мониторинг, но отлично помогают, когда нужно быстро понять, что происходит прямо сейчас.Запуск:
iotop
Полезный вариант:
iotop -o
Ключ
-o оставляет только процессы, у которых прямо сейчас есть дисковая активность.dstat хорош тем, что показывает сразу несколько метрик в одном месте:
CPU
disk I/O
network
memory
swap
interrupts
Пример запуска:
dstat
Более полезный вариант:
dstat -cdngym
Что здесь видно:
загрузка CPU
чтение/запись на диск
сетевой трафик
использование памяти
swap
активность файловой системы
Например, по CPU:
pidstat 1
По дисковой активности:
pidstat -d 1
По памяти:
pidstat -r 1
По отдельному процессу:
pidstat -p 1234 1
Где 1234 - это PID нужного процесса.
pidstat особенно полезен, когда нужно смотреть динамику: не просто кто сейчас наверху, а как процесс ведет себя во времени.
1. Сначала смотрим общую картину
dstat -cdngym
Понимаем, куда система упирается: CPU, диск, память или сеть.
2. Если подозрение на диск
iotop -o
Сразу ищем, кто генерирует I/O.
3. Если нужен разбор по процессам
pidstat -d 1
pidstat 1
Смотрим поведение процессов в динамике.
Такой набор часто дает ответ быстрее, чем долгие догадки и хаотичный запуск всего подряд.
#linux #sysadmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Стандартный ping - полезный инструмент, но в реальной админской жизни его часто не хватает. Иногда хочется быстро увидеть задержку на графике, а иногда - массово проверить десятки или сотни адресов без лишней возни с выводом.
Для этого есть как минимум две полезные утилиты:
gping и fping. Они не заменяют классический ping, а скорее дополняют его под разные задачи.Установка:
apt install gping
Пример запуска:
gping 1.1.1.1 8.8.8.8 8.8.4.4
На выходе получаете наглядное сравнение задержек между несколькими хостами. Например, сразу видно, какой DNS отвечает быстрее и насколько стабилен отклик во времени.
Практической пользы для серверной рутины тут не всегда много, но для личного терминала, быстрой проверки канала или просто наглядной диагностики - вещь приятная.
gping скорее из категории удобных и визуально понятных инструментов, чем must-have на каждом сервере.
Установка:
apt install fping
Например, быстро найти активные узлы в сети можно так:
fping -g 192.168.13.0/24 -qa
На выходе получите только адреса тех хостов, которые ответили:
192.168.13.1
192.168.13.2
192.168.13.17
192.168.13.50
192.168.13.186
Очень удобно, потому что формат вывода уже готов для скриптов: одна строка - один IP.
Можно проверять и диапазон явно:
fping -s -g 192.168.13.1 192.168.13.50 -qa
Если нужен обычный пинг одного хоста:
fping 10.20.1.2
Результат будет простой и понятный:
10.20.1.2 is alive
Еще один полезный сценарий - использовать fping в скриптах через код возврата. Например:
fping 10.20.1.2 -q
echo $?
Если хост доступен, получите: 0
Если нет:
fping 10.20.1.3 -q
echo $?
Результат: 1
Это удобно, потому что не нужно парсить лишний текст, обрезать вывод или городить grep.
Команда либо успешна, либо нет и этого уже достаточно для автоматизации.
Обе утилиты полезны, но в разных сценариях.
gping - больше про удобство и визуализацию.
fping - про практичность, автоматизацию и реальные админские задачи.
#ping #network
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🫡1
📘 На платформе Mentorix вышел курс — «DevOps-инженер: от основ до продакшена»
Если вы хотите не просто изучить инструменты, а понять, как собирается реальная DevOps-инфраструктура — этот курс даёт полный системный подход.
🔧 Что внутри:
• Linux, администрирование и bash
• Docker и Kubernetes (реальная оркестрация)
• Terraform и Ansible (Infrastructure as Code)
• CI/CD: GitLab CI, GitHub Actions, Jenkins
• мониторинг и логирование: Prometheus, Grafana, ELK
• безопасность, сети, балансировка нагрузки
• облака (AWS/GCP/Azure)
📊 Формат:
— 82 урока и 784 шага
— 320 теорий, 325 тестов, 139 задач практических задач
— практика в каждом блоке
💡 Важно:
вы не просто изучаете инструменты — вы собираете end-to-end инфраструктуру, которую можно положить в портфолио и показывать на собеседованиях.
💰 скидка 40%, действует 24 часа
👉 Пройти курс
Если вы хотите не просто изучить инструменты, а понять, как собирается реальная DevOps-инфраструктура — этот курс даёт полный системный подход.
🔧 Что внутри:
• Linux, администрирование и bash
• Docker и Kubernetes (реальная оркестрация)
• Terraform и Ansible (Infrastructure as Code)
• CI/CD: GitLab CI, GitHub Actions, Jenkins
• мониторинг и логирование: Prometheus, Grafana, ELK
• безопасность, сети, балансировка нагрузки
• облака (AWS/GCP/Azure)
📊 Формат:
— 82 урока и 784 шага
— 320 теорий, 325 тестов, 139 задач практических задач
— практика в каждом блоке
💡 Важно:
вы не просто изучаете инструменты — вы собираете end-to-end инфраструктуру, которую можно положить в портфолио и показывать на собеседованиях.
💰 скидка 40%, действует 24 часа
👉 Пройти курс
❤2👍1
Многие админские bash-скрипты со временем превращаются в свалку из if, grep, awk, sed и случайных команд, склеенных по принципу: работает - не трогай. Проблема в том, что через месяц такой скрипт уже тяжело читать. Через полгода - страшно менять. А если его откроет другой админ, он вообще решит, что это археология, а не автоматизация.
Один из рабочих подходов - писать bash не как набор команд, а как маленький DSL: domain-specific language, то есть мини-язык под свою задачу.
Идея простая: вместо простыни команд вы собираете скрипт из понятных функций с говорящими именами.
Например, не так:
useradd -m -s /bin/bash "$name"
mkdir -p "/home/$name/.ssh"
cp ./authorized_keys "/home/$name/.ssh/authorized_keys"
chown -R "$name:$name" "/home/$name/.ssh"
chmod 700 "/home/$name/.ssh"
chmod 600 "/home/$name/.ssh/authorized_keys"
А так:
create_user "$name"
install_ssh_keys "$name"
harden_ssh_dir "$name"
Внутри этих функций может быть что угодно, но снаружи скрипт начинает читаться как сценарий действий, а не как трассировка мыслей уставшего админа.
Например:
create_user() {
useradd -m -s /bin/bash "$1"
}
install_ssh_keys() {
local user="$1"
mkdir -p "/home/$user/.ssh"
cp ./authorized_keys "/home/$user/.ssh/authorized_keys"
chown -R "$user:$user" "/home/$user/.ssh"
}
harden_ssh_dir() {
local user="$1"
chmod 700 "/home/$user/.ssh"
chmod 600 "/home/$user/.ssh/authorized_keys"
}
Теперь верхний уровень скрипта выглядит уже не как набор случайных действий, а как понятный workflow:
create_user "$name"
install_ssh_keys "$name"
harden_ssh_dir "$name"
скрипт легче читать: сразу видно, что делает логика, без погружения в детали.
проще сопровождать: меняете реализацию внутри функции, не ломая структуру всего скрипта.
меньше копипасты: повторяющиеся куски уезжают в функции.
проще дебажить: если сломалось install_ssh_keys, вы уже знаете, где искать проблему.
require_root
check_dependencies
backup_config "/etc/nginx/nginx.conf"
deploy_new_config "./nginx.conf" "/etc/nginx/nginx.conf"
test_nginx_config
reload_nginx
Такой bash уже напоминает не набор shell-команд, а язык операций для конкретной задачи.
Пример плохого Bash-скрипта:
cp "$src" "$dst" &&
nginx -t &&
systemctl reload nginx ||
echo "something failed"
Пример более читаемого подхода:
deploy_config "$src" "$dst"
validate_nginx
reload_service nginx
Да, bash не станет от этого python. Но даже в shell можно писать так, чтобы скрипт был похож на понятную инструкцию, а не на клубок из условий, пайпов и боли.
#bash #scripting
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍9💩2
Когда говорят о балансировке, то чаще вспоминают L4/L7-балансировщики. Но распределять трафик можно и ниже - прямо на уровне маршрутизации. Для этого существует ECMP - Equal-Cost Multi-Path.
Суть простая: если до одной и той же сети есть несколько маршрутов с одинаковой метрикой, роутер может использовать их параллельно, а не держать один основным, а остальные про запас.
Что это дает:
распределение нагрузки между несколькими линками;
лучшее использование полосы;
отказоустойчивость - при падении одного пути трафик уходит в оставшиеся.
Важный момент: ECMP обычно балансирует не каждый пакет как попало, а по хэшу потока. Например, учитываются source IP, destination IP, порты, протокол и весь конкретный flow идет по одному пути.
Это нужно, чтобы не получить reordering пакетов и не сломать TCP-сессии.
То есть два клиента могут уйти разными маршрутами, но один и тот же TCP-flow обычно будет идти стабильно по одному next-hop.
ECMP хорошо работает там, где сеть и маршрутизация изначально под это спроектированы. Если просто включить ради баланса, можно получить странное распределение, проблемы с firewall state tracking и сложную диагностику.
#network #routing
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Как только в linux заходит разговор про QoS, shaping и управление трафиком, у многих сразу одна реакция: tc - это боль, страдание и странные команды из 2009 года. И это недалеко от правды. Утилита мощная, но синтаксис у нее такой, будто она не хочет, чтобы ей пользовались. При этом tc - это стандартный инструмент linux для управления очередями, задержками, полосой и приоритетами трафика.
Что с его помощью обычно делают:
ограничивают скорость;
дают приоритет важному трафику;
режут шумные сервисы;
эмулируют плохую сеть: delay, loss, jitter;
наводят порядок на WAN-линках и VPN.
Самое главное, что нужно понять:
QoS в linux почти всегда про исходящий трафик (egress). Входящий поток контролировать сложнее, обычно его либо полируют через IFB, либо ограничивают уже на стороне отправителя.
tc qdisc add dev eth0 root tbf rate 50mbit burst 32kbit latency 400ms
tbf - Token Bucket Filterrate - лимит скоростиburst - допустимый всплескlatency - максимальная задержка очереди
tc qdisc del dev eth0 root
Если нужен вариант без магии, для большинства случаев, чаще смотрят в сторону fq_codel или cake. Например:
tc qdisc add dev eth0 root fq_codel
fq_codel хорош тем, что помогает бороться с bufferbloat и в целом делает очередь более адекватной без сложной ручной настройки.
tc qdisc add dev eth0 root cake bandwidth 100mbit
Почему tc кажется страшным:
qdisc
class
filter
parent
handle
flowid
На первый взгляд это выглядит как отдельная религия. Но на практике часто хватает 3 сценариев:
ограничить скорость
сделать очередь адекватной
эмулировать плохую сеть для тестов
Например, добавить задержку в 100 мс:
tc qdisc add dev eth0 root netem delay 100ms
Или сделать "плохую" сеть с потерями:
tc qdisc add dev eth0 root netem delay 100ms loss 2%
Это уже очень полезно для тестирования приложений, API, VoIP, VPN и всего, что в локалке работает идеально, а в реальной сети нет.
#tc #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2