HDD присвячується: усмиряем додаток, ненажерливе на дисковий час

Корінь всіх зол
Довгий час у мене була проблема — система дуже сильно гальмувала після старту. У мене ноутбук з жорстким диском (HDD) і Ubuntu 14.04.
Як з'ясувалося, причина крилася в одній лише програмі — демона Dropbox. Dropbox — це онлайнове файлове сховище, а його демон — програмка, синхронізуюча файли, розташовані в певній папці, з онлайн-сховищем. На старті демон починає зчитувати свій кеш. У мене він займає не одну сотню мегабайт, а видаляти його не варто — є ймовірність втратити дані. Враховуючи, що у мене жорсткий диск — пристрій з механічними частинами — демон починав споживати час доступу до нього настільки, що користуватися комп'ютером та запускати програми ставало малореально, поки він не прогрузится. Прибрати його з автозапуску і запускати вручну? Неприємне рішення, у мене і так є речі, які я на старті змушений запускати сам (наприклад, iotop, він без прав суперкористувача не запускається). Потрібно було знайти спосіб зробити додаток менш ненажерливим саме на диск.

ionice нам в допомогу. Чи ні?
Перше, про що я почув по цій темі, була утилітка ionice. Вона дозволяє змінювати пріоритет доступу до жорсткого диска для заданого процесу. Згідно мануали, існують три класи пріоритетності введення/виводу. Мене цікавив idle, оскільки він, як я зрозумів з опису, нейтралізує ненажерливість програми, пропускаючи завжди вперед нього процеси інших класів пріоритету. Здавалося, справа в капелюсі, і все, що потрібно зробити, це:
ionice -c3 -p $(pgrep dropbox)
Зроблено. Ефекту — нуль. Як же так? Гаразд, роєм далі.

Scheduler'и, або «я нічого не зрозумів, але звучить круто»
з'ясувалося, за замовчуванням ionice на моїй системі взагалі не функціонує, оскільки повинен бути включений планувальник CFQ. А за замовчуванням в нових Убунтах включений планувальник deadline. Не буду вдаватися в подробиці, чим вони відрізняються, бо сам не до кінця в'їхав. Загалом, читаю коротке пояснення по цій справі, а потім міняю планувальник командою (вірніше, я додав цю команду /etc/rc.local, щоб планувальник GFQ виставлявся на старті автоматично):
echo cfq > /sys/block/sda/queue/scheduler
Приміткадо Речі, в розділі «зауваження» мануала зазначено, що підтримка класів і пріоритетів працює на CFQ. Але оскільки туди все одно ніхто не дочитує… XD

Що-то в системі злегка змінилося. Індикатор load при старті системи став підніматися вище 11, а процесорна навантаження стала складатися здебільшого з wait. Не впевнений, що це все значить в довгостроковій перспективі, але проблема залишилася — перемикання на CFQ і подальше застосування ionice на процес dropbox на продуктивність системи на старті ніякого помітного ефекту не мало: ні позитивного, ні негативного.

Ну хто стільки потоків запускає?! Про специфіку демона Dropbox.
Я вже було розчарувався, але тут я помітив, що у top показаний тільки один процес dropbox, а iotop показує кілька. І до речі, чому в top колонка ідентифікаторів процесів називається PID, а в iotop — TID? У чому різниця між ними? Відповідь швидко знайшовся. У моєму ж випадку саме важливе відкриття: демон Dropbox для своїх справ запускає кілька потоків. Багато потоків. З'ясувалося, що не один десяток. І диск починають читати іноді по кілька одночасно. Так ось звідки такі гальма! А ionice не працював тому, що, присвоївши клас пріоритету основного процесу, він не передає цей клас пріоритету дочірнім потоків. Тому вони були зі стандартним класом пріоритету, так з ним і залишилися.
Що ж, як кажуть британці, будемо застосовувати bodging. По-нашому, «милиці». Зробимо скриптик, який буде засікати процес dropbox і всі його дочірні потоки, брати їх ідентифікатори (PID або TID, в даному випадку ionice'у це изофаллично до лампочки без особливої різниці), і давати всім клас idle час від часу (на випадок, якщо dropbox вбиває частина дочірніх потоків та/або створює нові).
#!/bin/bash

while true
do
#збираємо список дочірніх потоків
TIDS=( $(ps -L --pid $(pgrep -x dropbox) -o tid=) )

for i in "${TIDS[@]}"
do
echo $i
#присвоюємо пріоритет idle
ionice -c3 -p $i
done

sleep 5

done

Додаємо в автозапуск, перезавантажуємося.
І все заробило майже як ніби демона Dropbox взагалі немає. Еврика!

Підсумки
Таким чином можна працювати з будь-яким процесом, що споживають багато вільного часу. Досить встановити пріоритет за допомогою ionice і не забувати про підводні камені, зокрема:

  • стежити, чи не запускає процес ненажерливі дочірні потоки
  • мати на увазі, що на деяких системах планувальник вводу/виводу — не CFQ (який підтримує класи і пріоритети)


Які ще речі слід враховувати? Розкажіть про свій досвід в коментарях.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.