Приветствую. Несколько лет назад я написал большую статью об оптимизации большинства 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 - это так называемый 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. Чем они отличаются:
Для того чтобы смонтировать /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 или как увеличить эффективность оперативной памяти"
Оптимизация дисковых операций.
На многих системах (в том числе моей) наблюдаются весьма ощутимые подтормаживания системы при копировании файлов на медленные носители, в частности флешки. Проявляется это как подвисания курсора и заикание работающей фоном музыки. Исправить ситуацию поможет уменьшение дискового кэша до разумной величины. Также стоит уменьшить кэш файловых систем. Открываем /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" "игра"
Привет. Можешь объяснить как в дебиане настроить автобновление?
ОтветитьУдалитьПривет. Можешь объяснить как в дебиане настроить автобновление?
ОтветитьУдалитьСпасибо, Алексей, ты настоящий друг чайников (каковым я и являюсь))
ОтветитьУдалитьСпасибо, Алексей, ты настоящий друг чайников (каковым я и являюсь))
ОтветитьУдалить