среда, 28 августа 2019 г.

Оптимизация Linux для дома (2019 edition)

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

Оптимизация дисковых операций.


На многих системах (в том числе моей) наблюдаются весьма ощутимые подтормаживания системы при копировании файлов на медленные носители, в частности флешки. Проявляется это как подвисания курсора и заикание работающей фоном музыки. Исправить ситуацию поможет уменьшение дискового кэша до разумной величины. Также стоит уменьшить кэш файловых систем. Открываем  /etc/sysctl.conf и в конец добавляем строки:

vm.dirty_bytes = 10485760
vm.dirty_background_bytes = 2621440

vm.vfs_cache_pressure = 50

Прошу обратить внимание на последнюю строку: этот параметр отвечает за кэширование объектов файловой системы в оперативную память. При значении 0, объекты не высвобождаются и так и остаются в оперативной памяти. Чем больше значение, тем чаще ядро будет проводить "зачистку" оперативной памяти. Поэтому если у вас оперативной памяти меньше 2 гигов, то оставьте значение 50, дабы сократить число дисковых операций в разделе подкачки. Это также полезно в случае если у вас SSD. Но если у вас больше 2 гигов оперативки, и обычный жёсткий диск, то выставьте значение этого параметра на 1000. Это позволит более агрессивно кэшировать дисковые операции, тем самым повысив быстродействие при достаточном количестве оперативной памяти. По умолчанию значение этого параметра равно 100.

Tmpfs.


Tmpfs - это так называемый RAM-диск, то есть виртуальный диск, расположенный в оперативной памяти. В располагают какие-нибудь кэши или временные файлы, для мгновенного доступа к ним. В Линуксе (да и в других Unix-подобных ОС), в нём чаще всего располагают каталог с временными файлами - /tmp. Это позволяет очень значительно повысить скорость работы, например, пакетного менеджера или любой другой программы, которая складывает туда временные файлы. Командой df можно посмотреть какие каталоги куда смонтированы:

 Файловая система 1K-блоков Использовано  Доступно Использовано% Cмонтировано в
udev                 10240            0     10240            0% /dev
tmpfs              1607944        10240   1597704            1% /run
/dev/sdc1         25065036     17858216   5910440           76% /
tmpfs              4019852        59996   3959856            2% /dev/shm
tmpfs                 5120            8      5112            1% /run/lock
tmpfs              4019852            0   4019852            0% /sys/fs/cgroup
/dev/sda3        828078076    527223576 300854500           64% /media/DISK_D
/dev/sdc6        202464704      5138012 187018984            3% /media/LINUX_OTHER_DATA
/dev/sdc3        374818504    348099716   7656016           98% /home
/dev/sdc5        100666964     33621380  61908888           36% /media/KVM
tmpfs               803972            8    803964            1% /run/user/1000



Как видим, в tmpfs уже по умолчанию смонтированы некоторые каталоги, к которым часто обращается система или программы. К слову, Tmpfs - не единственная реализация рамдиска в Linux. Популярной альтернативой ему является Ramfs. Чем они отличаются:

  • Ramfs никогда не использует подкачку, а заполняет оперативку до предела;
  • Ramfs, в отличии от Tmpfs, не поддерживает никаких параметров монитрования и всегда монтируется с правами root;
  • Tmpfs может использовать подкачку, поддерживает параметры монтирования и позволяет жёстко указать размер файловой системы.

Для того чтобы смонтировать /tmp в Tmpfs, делаем так:

sudo nano /etc/fstab

В конец добавляем строку (обратите внимание, что вместо пробелов используется табуляция. То есть нужно нажимать клавишу Tab):

tmpfs   /tmp    tmpfs   defaults,size=2G,mode=1777      0       0

Таки образом мы смонтировали /tmp в tmpfs, указали ему размер в 2 гига, после чего он начнёт использовать подкачку, а также выставили права доступа 1777, чтобы не было проблем в работе некоторых приложений. Сохраните и перезагрузитесь. После перезагрузки, снова введите df

 Файловая система 1K-блоков Использовано  Доступно Использовано% Cмонтировано в
udev                 10240            0     10240            0% /dev
tmpfs              1607944        10240   1597704            1% /run
/dev/sdc1         25065036     17858216   5910440           76% /
tmpfs              4019852        59996   3959856            2% /dev/shm
tmpfs                 5120            8      5112            1% /run/lock
tmpfs              4019852            0   4019852            0% /sys/fs/cgroup
tmpfs              2097152         4732   2092420            1% /tmp
/dev/sda3        828078076    527223576 300854500           64% /media/DISK_D
/dev/sdc6        202464704      5138012 187018984            3% /media/LINUX_OTHER_DATA
/dev/sdc3        374818504    348099716   7656016           98% /home
/dev/sdc5        100666964     33621380  61908888           36% /media/KVM
tmpfs               803972            8    803964            1% /run/user/1000


Как видим, /tmp смонтирован в tmpfs и работает. Если вы используете дистрибутив Gentoo, можете смонтировать туда кэш portage (/var/tmp/portage).

Улучшение отзывчивости системы.


Начиная с ядра Linux 3.16 доступна новая многопоточная подсистема блочных устройств - blk-mq, а с версии 4.19 - включена по умолчанию. Ранее разработчики не включали её по умолчанию по причине отсутствия планировщиков ввода-вывода для классических однопоточных устройств, таких как HDD или SATA SSD. Однако теперь она стабильна, а начиная с ядра Linux 5.0 старая подсистема удалена полностью. Если ранее пользователю были доступны CFQ (по умолчанию в большинстве дистрибитивов), Deadline (по умолчанию в Ubuntu/Mint) и No-Op, то теперь это mq-deadline (порт классического deadline на новую подсистему), долгожданный BFQ и Kyber, разработанный компанией Facebook специально для современных высокоскоростных SSD, а также режим работы без планировщика вообще - none. Что из этого выбрать? По умолчанию теперь используется mq-deadline, а для высокоскоростных NVMe SSD планировщик не используется вообще (none). Однако как показывают тесты, BFQ показывает куда более впечатляющие результаты, нежели mq-deadline, и потому его включили по умолчанию в ChromeOS и Fedora 31. Поэтому я рекомендую также включить его. Для наилучшего результата рекомендую использовать ядро 5.2 и новее, ибо там влили огромное количество оптимизаций для BFQ. На моей системе это привело к гораздо более быстрой загрузке рабочего стола и более быстрому открытию программ когда система чем-то серьёзно загружена (например рендерингом видео). Для этого нужно создать файл с правилами для udev, который будет включать BFQ после загрузки системы. Если у вас Debian или производные - нужно будет сперва подгрузить модуль BFQ и прописать его в автозагрузку:

sudo modprobe bfq
sudo echo "bfq" >> /etc/initramfs-tools/modules
sudo update-initramfs -u
sudo touch /etc/udev/rules.d/60-scheduler.rules

Откройте последний созданный файл 60-scheduler.rules и добавьте в него строку:

ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"

Сохраните и перезагрузитесь. Признак того, что всё получилось:

sunderland93@Debian-PC:~$ cat /sys/block/*/queue/scheduler
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none
mq-deadline [bfq] kyber none


Для того чтобы система не становилась раком при исчерпании всей оперативной памяти, а также для предотвращения подобных ситуаций - установите демон EarlyOOM, который будет автоматически следить за процессами и в критической ситуации убивать наиболее прожорливых:

sudo apt install earlyoom

ZRAM и ZSWAP


См. "Zram и Zswap или как увеличить эффективность оперативной памяти"

Оптимизация игр.

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

gamemoderun "игра"

для более старых версий:

LD_PRELOAD="$LD_PRELOAD:/usr/\$LIB/libgamemodeauto.so.0"  "игра"

4 комментария:

  1. Привет. Можешь объяснить как в дебиане настроить автобновление?

    ОтветитьУдалить
  2. Привет. Можешь объяснить как в дебиане настроить автобновление?

    ОтветитьУдалить
  3. Спасибо, Алексей, ты настоящий друг чайников (каковым я и являюсь))

    ОтветитьУдалить
  4. Спасибо, Алексей, ты настоящий друг чайников (каковым я и являюсь))

    ОтветитьУдалить