| 📋 Про цей довідник
Цей документ побудований на реальній сесії діагностики: система Ubuntu гальмувала, і я крок за кроком знаходив та усував всі причини. Кожен розділ містить команду → реальний вивід → пояснення → дію. |
Частина 1. Моніторинг ресурсів у реальному часі
Перший крок це зрозуміти, що саме навантажує систему.
1.1 Перегляд активних процесів
▶ Команди:
| top
# або зручніша кольорова версія: htop # Топ-10 процесів за CPU: ps -eo pcpu,pmem,user,args –sort=-pcpu | head -n 10 |
▶ Реальний вивід (приклад з сесії):
| %CPU %MEM USER COMMAND
61.2 0.9 alex ffmpeg -fflags nobuffer -rtsp_transport tcp … 61.0 0.8 alex ffmpeg -fflags nobuffer -rtsp_transport tcp … 14.7 2.1 alex /opt/google/chrome/chrome … 7.4 0.8 alex /opt/google/chrome/chrome –type=renderer … 6.5 1.0 alex /usr/share/code/code –type=zygote |
| 🔍 Що означає вивід
• %CPU — відсоток завантаження процесора. Два ffmpeg разом дають 120%+ (більше одного ядра). • %MEM — відсоток оперативної пам’яті. • У мому випадку виявлено: Python-скрипт запускав окремий ffmpeg на кожного клієнта! • Рішення: переписати скрипт так, щоб ffmpeg запускався один для всіх підключень. |
1.2 Стан оперативної пам’яті
▶ Команда:
| free -h |
▶ Реальний вивід:
| загалом використ. вільна спільна буфери/кеш дост.
Пам’: 31Gi 8,8Gi 16Gi 253Mi 5,6Gi 21Gi Своп: 2,0Gi 0B 2,0Gi |
| 🔍 Що означає вивід
• “дост.” (available) 21 ГБ — пам’яті більш ніж достатньо. • Своп = 0B — система навіть не торкнулась swap-розділу. Проблема не в RAM. • Якщо “дост.” близьке до нуля — система починає використовувати swap і гальмує. |
Частина 2. Діагностика дискової системи
2.1 Перевірка системних логів (dmesg)
▶ Команда:
| sudo dmesg -T | tail
# Тільки помилки: dmesg -T –level=err,warn |
▶ Реальний вивід (виявлено проблему):
| [пн бер 9 11:26:52 2026] FAT-fs (sdc1): Volume was not properly unmounted.
Some data may be corrupt. Please run fsck. [пн бер 9 11:26:54 2026] EXT4-fs (sdc2): recovery complete [пн бер 9 11:26:54 2026] EXT4-fs (sdc2): mounted filesystem r/w |
| ⚠️ Що означає вивід
• “Volume was not properly unmounted” — флешка/диск відключена некоректно. • Система намагається читати пошкоджені сектори → I/O wait → фризи. • Рішення: розмонтувати пристрій і запустити fsck для виправлення помилок. |
2.2 Виправлення файлової системи (fsck)
▶ Кроки:
| # 1. Розмонтувати розділи
sudo umount /dev/sdc1 sudo umount /dev/sdc2 # Якщо “target is busy”: sudo umount -l /dev/sdc2
# 2. Виправити FAT-розділ sudo fsck.vfat -a /dev/sdc1
# 3. Виправити EXT4-розділ sudo e2fsck -p /dev/sdc2 |
▶ Реальний вивід (успішне виправлення):
| fsck.fat 4.2 (2021-01-31)
Dirty bit is set. Automatically removing dirty bit. *** Filesystem was changed *** /dev/sdc1: 599 files, 261648/516190 clusters
/dev/sdc2: без помилок, 332906/1937712 файлів, 3385954/7740923 блоків |
| ✅ Результат
• “без помилок” — файлова система тепер чиста. • Після виправлення фізично витягніть пристрій і перевірте, чи зникли фризи. |
2.3 Перевірка вільного місця
▶ Команди:
| # Місце на дисках
df -h
# Кількість файлів (inodes) df -i |
▶ Реальний вивід (знайдено критичну проблему):
| Ф. система Розм Вик Дост Вик% змонтований на
/dev/sdb3 439G 396G 21G 96% / tmpfs 16G 240M 16G 2% /dev/shm /dev/sdb2 512M 6,1M 506M 2% /boot/efi |
| 🚨 Критично: 96% заповнення системного диску!
• Коли на SSD менше 10% вільного місця — контролер не може виконувати TRIM. • Це призводить до різкого падіння швидкості запису і мікрофризів. • Рішення: звільнити місце (кеш, логи, перенос файлів на HDD). |
2.4 Пошук великих папок
▶ Команда:
| sudo du -h –max-depth=1 /home/alex | sort -h |
▶ Реальний вивід (топ найбільших):
| 141G /home/alex/www
25G /home/alex/Музика 19G /home/alex/.cache 16G /home/alex/.local 12G /home/alex/.config 9G /home/alex/Android 5G /home/alex/snap |
| 🔍 Аналіз
• www (141 ГБ) — основний робочий каталог розробника. Кандидат для переносу на HDD. • .cache (19 ГБ) — можна безпечно видалити, він перествориться автоматично. • Музика/Відео — медіафайли краще зберігати на великому HDD. |
2.5 Швидке звільнення місця
▶ Безпечні команди для очищення:
| # Видалити кеш завантажених пакетів
sudo apt clean
# Обрізати системні логи до 500 МБ sudo journalctl –vacuum-size=500M
# Очистити кошик rm -rf ~/.local/share/Trash/*
# Очистити кеш програм (перествориться автоматично) rm -rf ~/.cache/* |
Частина 3. Перевірка фізичного стану дисків (S.M.A.R.T.)
3.1 Встановлення та визначення дисків
▶ Команди:
| # Встановити smartmontools
sudo apt install smartmontools
# Побачити список дисків lsblk |
▶ Реальний вивід lsblk:
| sda 8:0 0 1,8T 0 disk ← великий HDD 1.8 ТБ
├─sda1 … 579M ├─sda2 … 846,8G ├─sda3 … 466,9G └─sda5 … 548,8G sdb 8:16 0 447,1G 0 disk └─sdb3 8:19 0 446,6G 0 part / ← системний SSD! sdc 8:32 1 29,8G 0 disk ← флешка/зовнішній диск |
3.2 Перевірка здоров’я диска
▶ Команди:
| # Загальний стан (PASSED / FAILED)
sudo smartctl -H /dev/sdb
# Деталі для SSD sudo smartctl -A /dev/sdb | grep -E “Percentage|Media|Error”
# Критичні параметри для HDD sudo smartctl -A /dev/sda | grep -E “Reallocated|Pending|Offline” |
▶ Реальний вивід (здоровий SSD):
| smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-101-generic]
=== START OF READ SMART DATA SECTION === SMART overall-health self-assessment test result: PASSED |
| 📖 На що дивитися в smartctl -A
Для HDD: • Reallocated_Sector_Count > 0 → диск починає “сипатися”, плануйте заміну. • Current_Pending_Sector → сектори, які не вдалося прочитати. • UDMA_CRC_Error_Count росте → проблема в кабелі SATA. Для SSD: • Percentage Used → знос пам’яті у відсотках. • Media and Data Integrity Errors → мають бути нулями. |
3.3 Тест реальної швидкості диска
▶ Команда:
| sudo hdparm -tT /dev/sdb |
▶ Реальний вивід (відмінний результат):
| /dev/sdb:
Timing cached reads: 21824 MB in 1.99 seconds = 10962.49 MB/sec Timing buffered disk reads: 1558 MB in 3.00 seconds = 519.05 MB/sec |
| 📊 Орієнтири для порівняння
• SSD SATA — 400–550 MB/s (наш результат 519 MB/s — відмінно!). • SSD NVMe — 2000–7000 MB/s. • HDD — 80–160 MB/s. • Якщо SSD показує < 200 MB/s — можливі проблеми з контролером або перегрів. |
Частина 4. Монтування великого диска та перенос даних
4.1 Визначення та монтування розділу
▶ Команди:
| # Дізнатися тип файлової системи
blkid /dev/sda2
# Якщо ext4 — монтувати так: sudo mkdir -p /mnt/storage sudo mount /dev/sda2 /mnt/storage
# Якщо NTFS (Windows-диск) — отримаємо помилку: # “Mount is denied because the NTFS volume is already exclusively opened” # → перевірити, куди вже змонтовано: lsblk | grep sda2 |
| ⚠️ Увага: NTFS
• Якщо диск NTFS (Windows), Linux не може монтувати його двічі. • Перевірте: lsblk — можливо, система вже автоматично змонтувала диск у /media/alex/… • Використовуйте цей шлях замість /mnt/storage. |
4.2 Автомонтування через fstab
▶ Команди:
| # Дізнатися UUID розділу
blkid /dev/sda2
# Відкрити fstab для редагування sudo nano /etc/fstab
# Додати рядок (для ext4): UUID=ВАШ-UUID /mnt/storage ext4 defaults 0 2
# Перевірити без перезавантаження sudo mount -a |
4.3 Безпечний перенос папки через rsync
▶ Команди (БЕЗПЕЧНИЙ метод):
| # rsync покаже прогрес і не видалить оригінал
sudo rsync -avP ~/www /mnt/storage/alex/
# ТІЛЬКИ після перевірки, що дані скопійовані! ls -la /mnt/storage/alex/www
# Видаляти оригінал тільки після підтвердження rm -rf ~/www
# Створити символічне посилання ln -s /mnt/storage/alex/www ~/www |
| 🛡️ Правило безпеки при переносі даних
• НІКОЛИ не видаляйте оригінал перед тим, як перевірити копію. • Використовуйте rsync -avP — він показує прогрес і перевіряє цілісність. • Після переносу перевірте: ls -la і розмір папки (du -sh). • Символічне посилання (ln -s) дозволяє системі “бачити” папку на старому місці. |
Частина 5. Оптимізація Python MJPEG-проксі
Це реальний кейс: скрипт для трансляції RTSP-камери в браузер запускав окремий ffmpeg для кожного підключеного клієнта.
5.1 Проблема: N клієнтів = N процесів ffmpeg
| 🔴 Архітектурна помилка
• Оригінальний код: метод _stream() запускав subprocess.Popen(FFMPEG_CMD) при кожному підключенні. • 2 відкриті вкладки браузера = 2 ffmpeg = 120%+ CPU. • При 5 вкладках система “лягала” повністю. • Рішення: один глобальний ffmpeg, всі клієнти читають з нього. |
5.2 Оптимізована команда ffmpeg
▶ Зміни в параметрах:
| FFMPEG_CMD = [
“ffmpeg”, “-fflags”, “nobuffer”, “-rtsp_transport”, “tcp”, “-i”, RTSP_URL, “-f”, “mjpeg”, “-q:v”, “5”, “-r”, “10”, # ← було 15, знижено до 10 FPS “-preset”, “ultrafast”, # ← новий параметр: мін. навантаження на CPU “-vf”, “scale=1280:-1”, # ← -1 замість 960: зберігає пропорції “pipe:1” ] |
5.3 Патерн StreamManager: один ffmpeg для всіх
▶ Ключовий код:
| class StreamManager:
def __init__(self): self.last_frame = b”” self.lock = threading.Lock() self.running = True
def start(self): threading.Thread(target=self._run_ffmpeg, daemon=True).start()
def _run_ffmpeg(self): while self.running: proc = subprocess.Popen( FFMPEG_CMD, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, preexec_fn=lambda: os.nice(10) # Низький пріоритет ) # … читаємо кадри і зберігаємо в self.last_frame
def get_frame(self): with self.lock: return self.last_frame
# Глобальний менеджер — один для всього сервера manager = StreamManager() manager.start() |
| ✅ Результат після оптимізації
• ffmpeg завжди запущений в одному екземплярі. • 10 відкритих вкладок браузера = навантаження CPU таке ж, як при одній. • os.nice(10) — процес поступається ресурсами системі та іншим програмам. • Кадри оновлюються в єдиній змінній, клієнти читають з неї без запуску нових процесів. |
Частина 6. Підсумок діагностики
| Що перевіряли | Що знайшли | Рішення |
| Процесор | Python-скрипт запускав окремий ffmpeg на кожного клієнта (120%+ CPU) | Переписано на SharedStreamManager + os.nice(10) |
| Оперативна пам’ять | 32 ГБ, зайнято 8 ГБ, Swap = 0 — проблем немає | Не потребує дій |
| Зовнішній диск (sdc) | Пошкоджена FAT і EXT4 файлова система | fsck.vfat + e2fsck виправили помилки |
| Системний SSD (sdb) | 96% заповнення — критично! | Перенос www/Музики на HDD, очищення кешу |
| S.M.A.R.T. SSD | PASSED, швидкість 519 MB/s | Диск справний, нічого не потрібно |
Швидкий чеклист діагностики
- ps -eo pcpu,pmem,user,args –sort=-pcpu | head -n 10 — хто їсть CPU
- free -h — стан RAM та Swap
- df -h — вільне місце на дисках (критично якщо > 90%)
- sudo dmesg -T | tail — помилки обладнання в логах
- sudo smartctl -H /dev/sdX — здоров’я диска (PASSED/FAILED)
- sudo hdparm -tT /dev/sdX — реальна швидкість читання
- sudo du -h –max-depth=1 /home/USER | sort -h — де зайняте місце
Сформовано на основі реальної сесії діагностики Ubuntu · Березень 2026