четверг, 17 декабря 2015 г.

Комплексная оптимизация и ускорение системы для дома


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

Примечание: я использую для редактирования и создания конфигов терминал, так как на мой взгляд это гораздо быстрее и удобнее. Вы же можете использовать привычный вам графический текстовый редактор (gedit, kate, kwrite и прочие).

Графическое окружение.


Графические окружения GNOME, KDE и Cinnamon используют различные графические эффекты, а также потребляют ощутимое количество оперативной памяти. Поэтому если у вас слабый компьютер или ноутбук, то лучше всего использовать легковесные окружения, такие как Lxde, Xfce, MATE, "голые" оконные менеджеры, типа Openbox, Fluxbox, i3 либо легковесные дистрибутивы, в составе которых идут не менее легковесные графические окружения. Также используйте менее ресурсоёмкие программы.

Создайте в домашнем каталоге, пустую директорию .compose-cache . Это позволит задействовать кэширование информации, распарсенной Xorg и в результате немного увеличит скорость запуска графических приложений.

Если вы используете графическое окружение KDE, то:

  • Отключите лишние графические эффекты в настройках;
  • Выставьте движок отрисовки OpenGL 2.0 (если у вас не совсем древняя видеокарта, в противном случае лучше выбрать OpenGL 1.2 или вовсе Xrender) и тип отрисовки Растровая (Raster);
  • Отключите композитинг для полноэкранных оконо (Параметры системы - Эффекты - Дополнительно);
  • В KDE 4 используйте стиль отрисовки QtCurve, так как он меньше грузит видеокарту, чем Oxygen;
  • Параметры системы - Оформление приложений - вкладка Тонкая настройка - Графические эффекты. Выберите вариант с наименьшей нагрузкой на процессор;
  • Если вы не используете программы из состава KDE, такие как  KMail, то отключите службу Akonadi, дабы сэкономить память. Для этого откройте файл ~/.config/akonadi/akonadiserverrc. Измените строку StartServer=true на StartServer=false ;

Если вы используете графическое окружение Unity (только для Ubuntu):

  • Установите утилиты настроки Compizconfig Settings Manager и Unity Tweak Tool;
  • Запустите Compizconfig. Отключите ненужные графические эффекты.
  • Запустите Unity Tweak Tool. В настройках Dash отключите фоновое размытие и online-поиск. Также можете изменить некоторые другие параметры по своему вкусу.

Для ноутбуков: в окружениях МАТЕ, Xfce и других легковесных, используется программная отрисовка (композитинг). Это разгружает видеокарту, но дополнительно нагружает процессор, а также появляются артефакты отрисовки, известные как тиринг. Если вы запускали, например, игру с выключенной вертикальной синхронизацией (Vsync), то вы знаете что это такое. Если видеокарта ноутбука позволяет задействовать аппаратное ускорение через OpenGL, то желательно установить композитный менеджер. Я рекомендую Compton, так как он очень легковесный, не перегружает систему и отлично выполняет свои обязанности. Установка в Debian-based дистрибутивах:

sudo apt install compton

В Linux Mint с графической средой MATE, есть возможность включить Compton в настройках сразу, так как он идёт в комплекте. Поэтому рекомендую. Для остального, после установки, создаём конфигурацию:

touch ~/.config/compton.conf
nano ~/.config/compton.conf

Вставляем следующее содержимое:

backend = "glx";
vsync = "opengl-swc";
# Не использовать буфер ???трафаретов (--glx-no-stencil)
glx-no-stencil = true;
# ??? (--glx-swap-method) (возможны значения от -1 до 6)
glx-swap-method = 1;
# Копировать неизменившиеся области из первичного буфера (--glx-copy-from-front)
glx-copy-from-front = false;

# Копировать неизменившиеся области при помощи MESA_copy_sub_buffer (-- glx-use-copysubbuffermesa)
#При использовании проприетарного видеодрайвера, возможны проблемы. Поэтому в случае их использования, лучше закоментировать данный параметр (поставить перед ним #)

glx-use-copysubbuffermesa = true;

# Использовать шейдеры GL_EXT_gpu_shader4
glx-use-gpushader4 = true;
# Отрисовка на оверлейных окнах X Composite вместо окна рута (--paint-on-overlay)
paint-on-overlay = true;


#Если нужна только вертикальная синхронизация, то остальное не копируем!!!


# Включить тени (-c)
shadow = true;
# Тень на окнах Drag-and-Drop (-G)
no-dnd-shadow = true;
# Тень на окнах доков/панелей (-C)
no-dock-shadow = true;
# Радиус тени (-r)
shadow-radius = 7;
# Смещение тени слева (-l)
shadow-offset-x = -7;
# Смещение тени сверху (-t)
shadow-offset-y = -7;
# Непрозрачность теней (-o)
shadow-opacity = 0.7;
# Значение красного цвета тени (--shadow-red)
shadow-red = 0.0;
# Значение зеленого цвета тени (--shadow-green)
shadow-green = 0.0;
# Значение синего цвета тени (--shadow-blue)
shadow-blue = 0.0;
# Очищает маску тени позади окна (-z)
clear-shadow = true;
# Игноирировать тени на фигурных окнах (--shadow-ignore-shaped)
shadow-ignore-shaped = false;

# Включить затухание (-f)
fading = true;
# Скорость затухания (-D)
fade-delta = 10;
# "Шаг" прозрачности при проявлении (-I)
fade-in-step = 0.2;
#  "Шаг" прозрачности при затухании (-O)
fade-out-step = 0.2;
# Отключить затухание окнон при открытии/закрытии (--no-fading-openclose)
no-fading-openclose = true;

# Прозрачность меню (-m)
menu-opacity = 1.0;
# Непрозрачность неактивных окон (-i)
inactive-opacity = 0.65;
# Непрозрачность активных окон
active-opacity = 1.0;
# Непрозрачность строки заголовка и границ окна (-e)
frame-opacity = 1.0;

# Определяет окна со скругленными углами (--detect-rounded-corners)
detect-rounded-corners = true;
# Определяет параметр _NET_WM_OPACITY на клиентских окнах (--detect-client-opacity)
detect-client-opacity = true;
# Группировать окна приложения на основе параметра WM_TRANSIENT_FOR (--detect-transient)
detect-transient = true;
# Группировать окна приложения на основе параметра WM_CLIENT_LEADER (--detect-client-leader)
detect-client-leader = true;
# Затемнение неактивных окон (--inactive-dim)
inactive-dim = 0.1;
# Игнорировать при затемнении прозрачность окон (--inactive-dim-fixed)
inactive-dim-fixed = true;
# Использовать параметр EWMH _NET_ACTIVE_WINDOW для определния активного окна (--use-ewmh-active-win)
use-ewmh-active-win = true;

wintypes:
{
# Подсказки
  tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; };
# Уведомления
  notify = { fade = true; shadow = true; opacity = 0.9; focus = false; };
};


Сохраняем. Осталось добавить его в автозапуск. Это можно сделать как в графической оболочке (в настройках), так и через терминал. Нужно добавить команду compton -b в автозагрузку. Конфиг будет подхватываться на лету.

Раз уж мы затронули тему ноутбуков, то давайте заодно и оптимизируем их энергопотребление. По умолчанию, ноутбучное энергопотребление в Linux не слишком оптимально, потому батарея будет садиться немного быстрее, чем в Windows (а на некоторых ноутбуках и намного быстрее). На помощь придёт TLP. TLP - это более продвинутая альтернатива утилите laptop-mode-tools, которя следит за различными аппаратными компонентами, подбирает для них оптимальные параметры и знает о многих дистрибутивах Linux и специфичных для них настройках. Установка в Ubuntu и производных:

sudo apt-get remove laptop-mode-tools
sudo add-apt-repository ppa:linrunner/tlp
sudo apt-get update
sudo apt install tlp tlp-rdw
sudo tlp start

Дополнительно для ноутбуков ThinkPad:

sudo apt install tp-smapi-dkms acpi-call-dkms

Для Debian:

Доступен в тестовой ветке (будущий Debian 9). Для 8:

echo "deb http://repo.linrunner.de/debian jessie main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update && sudo apt install tlp tlp-rdw

Настройки находятся в файле /etc/default/tlp

1. Если в Kubuntu (KDE) есть явные проблемы в управлении питания при смене источника, то в System Settings -> Power Management -> Edit Profile.

Профиль "Powersave" (для батареи): отметить.
Профиль "Performance" (от сети): снять галку.

2. На ядрах 3.x система кажется медленной.
Обходной путь - SATA_LINKPWR_ON_BAT=medium_power

3. При изменении частоты процессора проблемы.
Пробуйте удалить ondemand sudo update-rc.d -f ondemand remove

4. Если на ядрах 3.х ноутбук не может уснуть.
Пробуйте BAY_POWEROFF_ON_BAT=0

5. Если жёсткий диск слишком часто хлопает головками при парковке, то успокойте его DISK_APM_LEVEL_ON_BAT=128

6. У меня твердотельный Crucial M4 SSD и от батареи всё тупит.
Для Crucial отключите APM
DISK_APM_LEVEL_ON_AC="255 255"
DISK_APM_LEVEL_ON_BAT="255 255"


7. При любых проблемах со звуком во время смены источника питания пробуйте SOUND_POWER_SAVE=0


Оптимизация интернет-соединения.


1) Можно увеличить скорость загрузки страниц, а также стабильность соединения, проведя кое-какие твики в сетевой подсистеме. Первым делом:

sudo nano  /etc/nsswitch.conf

Находим строку

hosts:          files mdns4_minimal [NOTFOUND=return] dns

Снизу подписываем:

hosts:          files dns

Должно получиться так:

hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          files dns


Сохраняем и перезагружаемся. Теперь страницы должны открываться быстрее.

2) Также для быстрого открытия сайтов, можно включить кэширование DNS. В этом нам поможет локальный кэширующий DNS-прокси - pdnsd. Устанавливаем:

sudo apt install pdnsd

В окне выбора параметров указываем "Ручное". Далее:

sudo nano /etc/default/pdnsd

Меняем START_DAEMON=no на START_DAEMON=yes . Теперь осталось настроить:

sudo nano /etc/pdnsd.conf

Пример конфига:

global {
 perm_cache=30000; // Максимальный размер кэша в килобайтах
 cache_dir="/var/cache/pdnsd";
 run_as="pdnsd";
 server_ip = 127.0.0.1; // Если планируется раздавать интернет и на другие машины в локальной сети, то укажите здесь адрес нужного сетевого интерфейса (например eth1)
 status_ctl = on;
 paranoid=on;
 min_ttl=60m; // Минимальное время сохранения записи в кэше
 max_ttl=1w; //  Максимальное время сохранения записи в кэше
 timeout=6; // Максимальный тайм-аут
 par_queries=2; // Количество одновременно опрашиваемых DNS серверов
}

source {
  owner=localhost;
  file="/etc/hosts";
 }

rr {
  name=localhost;
  reverse=on;
  a=127.0.0.1;
  owner=localhost;
  soa=localhost,root.localhost,42,86400,900,86400,86400;
 }

server {
  label = "darkdns";
  ip = 82.151.98.162 // DNS сервера вашего провайдера 1
   ,   82.151.104.80 // DNS сервера вашего провайдера 2
   ,   8.8.8.8 // DNS сервер Google Public DNS 1
   ,   8.8.4.4 // DNS сервер Google Public DNS 2
   ,   208.67.222.222 // DNS сервер OpenDNS 1
   ,   208.67.220.220 // DNS сервер OpenDNS 2
   ,   156.154.70.1 // DNS сервер DNS Advantage 1
   ,   156.154.71.1 // DNS сервер DNS Advantage 2
   ;
  timeout = 3; // Минимальный тайм-аут
  uptest = query;
  interval = 5m;
  ping_timeout = 300; // 30 seconds.
  purge_cache = off;
  exclude = .localdomain;
  policy = included;
  preset = off;
  }


Сохраняем. Запускаем:

sudo /etc/init.d/pdnsd start

3) Дополнительные твики для TCP/IP (использовать с осторожностью!)

sudo nano /etc/sysctl.conf

Добавляем в конец строки:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0


Сохраняем. Далее:

sudo sysctl -p

Повышаем скорость загрузки системы.


1) Можно задействовать при включении все доступные ядра процессора. В большинстве дистрибутивов эта фича уже включена. Для того чтобы проверить её наличие, выполните:

cat /etc/init.d/rc | grep CONCURRENCY

Если значение CONCURRENCY будет makefile - значит ничего трогать не нужно. Если none, то:

sudo nano /etc/init.d/rc

Находим эту строку и меняем на  CONCURRENCY=makefile Сохраняем и перезагружаемся.

2) В Ubuntu используется технология ureadahead, которая позволяет ускорить загрузку системы за счёт кэширования всех файлов начальной загрузки. Именно поэтому первый запуск Ubuntu происходит весьма медленно. Для дистрибутива Arch Linux есть патчи с ureadahead (доступны в AUR), также доступен оверлей для Gentoo. Но. Можно заменить ureadahead на E4rat - специальную утилиту созданную только для файловой системы Ext4 и имеющую схожий принцип работы с ureadahead. В репозиториях Debian и Ubuntu её нет, но есть готовые deb-пакеты на Sourceforge.

Все происходит в три этапа:
  • e4rat-collect - собирает статистику по используемым файлам в течении определенного времени (по умолчанию 120 секунд, но может быть скорректировано)
  • e4rat-realloc - перераспределяет файлы из списка (помещает их в одну область диска)
  • e4rat-preload - заранее загружает нужные файлы в память
Для установки качаем пакет: для 32-х битной системы; для 64-х битной системы. Далее, если вы делаете это в Ubuntu, то сначала нужно удалить ureadahead, иначе они будут конфликтовать:

sudo dpkg --purge ureadahead
sudo apt-get update

Далее устаналвиваем пакет (двойным кликом либо через sudo dpkg -i  e4rat_0.2.3_amd64.deb), и включаем параметр ядра init=/sbin/e4rat-collect

sudo nano /etc/default/grub

В строку GRUB_CMDLINE_LINUX_DEFAULT= добавляем init=/sbin/e4rat-collect сохраняем, далее:

sudo update-grub

и перезагружаемся. В течении 120 секунд будет собираться информация о файлах загрузки. После истечения 120 секунд, система сама перезагрузится, далее заходим в терминал, снова открываем

sudo nano /etc/default/grub

Ниже параметра GRUB_CMDLINE_LINUX_DEFAULT есть параметр GRUB_CMDLINE_LINUX="", между кавычками вставляем параметр /sbin/e4rat-preload сохраняем, делаем sudo update-grub и перезагружаемся. Вот и всё. Теперь система будет запускаться значительно быстрее, чем раньше.

Увеличиваем доступную память.


Недавно я написал статью о технологиях ZRAM и ZSWAP. Повторять то, что там написано смысла нет, вы можете просто перейти по ссылке. Напомню только для чего всё это. ZRAM - это модуль ядра Linux, который позволяет создать и разместить в оперативной памяти файл подкачки со сжатием, дабы не использовать для него медленный жёсткий диск или, в случае использования SSD-накопителя - не мучить его большими циклами записи. В памяти создаются несколько файлов подкачки, по числу процессорных ядер. При исчерпании доступной оперативной памяти, начинает использоваться подкачка, но так как она находится в оперативке, то данные просто сжимаются очень эффективными алгоритмами lzo и lz4, и жмутся, жмутся, покуда окончательно не исчерпается лимит памяти. Это позволяет разместить в 2 гигабайтах оперативки, до 4 или 5 гигов информации, потому с точки зрения приложений, памяти становится больше. ZSWAP похож на ZRAM, но здесь используется уже существующий на жёстком диске раздел или файл подкачки, а в оперативной памяти создаётся пул, в который помещаются и сжимаются данные перед их отправкой в раздел подкачки (swap). В результате, в ситуации, когда должна начать задействоваться подкачка, данные просто жмутся в этот пул, пока он не заполнится (по умолчанию он может разрастись на всю память, потому лучше установить ограничение). Как только пул заполнился сжатыми данными, он очень быстро сбрасывается в подкачку и снова начинает принимать данные. Это позволяет крайне сильно увеличить производительность при интенсивном использовании оперативной памяти. Если у вас 2 или 4 гига оперативки, и медленный жёсткий диск - воспользуйтесь ZRAM, если памяти больше и нужен запас на случай активного её использования - используйте ZSWAP.

Регулировка порога включения подкачки.


Настроим использование раздела подкачки - параметр swappiness. Значение swappiness, варьирующееся от 0 до 100, является степенью, при которой система поддерживает анонимную память или кеш страниц. Высокое значение повышает производительность файловой системы, при агрессивной подкачке наименее активных процессов. Низкое значение позволяет избежать подкачки процессов из памяти, что обычно снижает время ожидания за счет производительности ввода-вывода. Значение по умолчанию равно 60. Открываем файл:


sudo nano /etc/sysctl.conf


и в конец пишем vm.swappiness = 10


сохраняем и применяем: sudo sysctl -p

Это значение рекомендуется для повышения производительности, когда в системе достаточно оперативной памяти. Внимание: при значении vm.swappiness = 0 подкачка будет полностью отключена, что может привести к запуску OOM Killer при переполнении оперативной памяти.


Preload и Prelink.


1) Preload - это демон, который считывает статистику часто используемых приложений, и заранее готовится их подгрузить, поэтому запуск становится быстрее. Установка на примере Debian-based дистрибутивов:

sudo apt install preload

Настройка не требуется.

2) Prelink - утилита для связывания исполняемых файлов с разделяемыми библиотеками. Дело в том, что обычно программа не содержит в себе весь необходимый для работы код. Вместо этого, данный код помещается в так называемые разделяемые библиотеки (файлы с расширением .so, то есть shared object), которые могут использовать сразу несколько запущенных программ. Но при запуске программы, она начинает искать на диске и подгружать эти библиотеки, и в зависимости от их размера и количества, время запуска программы может оказаться весьма большим. Тут и поможет Prelink, который заранее "свяжет" все исполняемые файлы и необходимыми им библиотеками. Установка в Debian:

sudo apt install prelink
sudo prelink -avfmR

В случае возникновения проблем, можно отключить линковку:

sudo prelink -au

Запускать prelink нужно после каждого обновления или установки программ. Можно включить периодическую перелинковку:

sudo nano /etc/default/prelink

Меняем параметр PRELINKING=unknown на PRELINKING=yes. Сохраняем и запускаем:

sudo /etc/cron.daily/prelink

В Ubuntu и её производных необходимости в Prelink нет, так как там используется другой механизм линковки под названием DT_GNU_HASH.

Если вы используете графическое окружение KDE, то можно ощутимо увеличить скорость его загрузки, если сообщить ему что его библиотеки слинкованы и запускать kdeinit не нужно. Для этого нужно создать малюсенький скрипт:

touch ~/.kde4/env/kde_prelink.sh

Вписываем туда:

#!/bin/bash

export KDE_IS_PRELINKED=1

Сохраняем и даём права на выполнение:

chmod +x ~/.kde4/env/kde_prelink.sh

Увеличение отзывчивости системы в пиковые нагрузки.


1) Бывают ситуации, когда в момент очень высоких нагрузок, система ведёт себя не слишком отзывчиво, вплоть до подвисания курсора. Особенно это актуально если на компьютере весьма слабый процессор, а также мало оперативной памяти. Но можно улучшить ситуацию. Начиная с ядра Linux 2.6.38, в его состав включён знаменитый 200-строчный патч, который серьёзно повышает отзывчивость системы, путём динамической регулировки приоритетов процессорного времени для интерактивных и фоновых процессов. Что это значит? Допустим вы запустили компиляцию программы, и в этот момент включили плеер. Плеер получит больший приоритет процессорного времени, так как является интерактивным процессом, с которым работает пользователь, в то время как компиляция будет являться фоновым процессом, и если она начнёт "тянуть на себя одеяло", то ей понизится приоритет, в результате чего, плеер (либо другое интерактивное приложение) не будет тормозить от нехватки ресурсов процессора. Таким образом, даже при сильной загрузке системы, вы можете без проблем запускать любые ваши программы, такие как плееры, браузеры и даже игры. Однако несмотря на наличие этого патча в ядре, функция, которую он обеспечивает, не включена по умолчанию в некоторых дистрибутивах. Убедиться в её включении можно командой:

cat /proc/sys/kernel/sched_autogroup_enabled

Если вывод 1 - то всё включено, если 0 - то нет. Включается она просто. Открываем файл /etc/sysctl.conf

sudo nano /etc/sysctl.conf

и в конец добавляем строку:

kernel.sched_autogroup_enabled = 1

Теперь выполните:

sudo sysctl -p

и снова проверьте включение. Вывод должен быть 1.

2) Демон ulatencyd. Как и "ядерный патч", ulatencyd использует механизм cgroups для группировки интерактивных процессов и изменения их приоритетов, но на этом его работа не заканчивается. Демон использует эвристические алгоритмы для выявления «наиболее интерактивных» процессов, а также явных вредителей системы, таких как форк-бомбы и программы с большими утечками памяти. При этом первые получают еще больший приоритет, а вторые жестко урезаются в возможностях (получая низкий приоритет, ограничения на доступную память), изолируются или уничтожаются. Но что самое главное, в любой момент демон можно обучить новым правилам отбора процессов, так что теперь можно назначать высокие (даже приоритеты реального времени) приоритеты любимым играм, видеоплеерам и браузерам.

Демон поддерживает плагины, поэтому можно очень сильно расширить его функционал. Например, уже сейчас доступен плагин (причем в стандартной комплектации), который следит за работой пользователя в графическом интерфейсе и назначает самые высокие приоритеты вновь открытым приложениям и процессам, окна которых находятся на переднем плане. Нечто подобное есть в Windows, но работает на том же уровне, что и сама Windows :) Данный демон доступен в большинстве дистрибутивов, в Debian и Ubuntu ставится командой:

sudo apt install ulatency ulatencyd

Правила пишутся на языке LUA. Если вы писали скрипты для какой-нибудь игры, например Warcraft, то вы его знаете :). По умолчанию параметры оптимальны для большинства задач. Если запустить ulatency с параметром --gui, то откроется окно со статистикой процессов, а также станет возможным сменить профиль на game, default или desktop как с самого интерфейса, так и с панели задач:


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


1) Это самое узкое место любой системы, не только Linux. Дело в том, что жёсткий диск является самым медленным устройством в компьютере. Если у вас установлен SSD, то это решает многие проблемы, но кое-что всё равно остаётся. Первой оптимизацией, является изменение размеров дискового кэша. При операциях копирования или перемещения, данные сначала записываются в оперативную память, а затем кучей скидываются на диск. В результате, особенно при нехватке памяти, это может привести к сильным задержкам. Исправить ситуацию поможет уменьшение дискового кэша до разумной величины. Также стоит уменьшить кэш файловых систем. Открываем уже знакомый нам /etc/sysctl.conf и в конец добавляем строки:

vm.dirty_bytes = 2097152
vm.dirty_background_bytes = 2097152

vm.vfs_cache_pressure = 50

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

2) Следующим шагом может стать смена стандартного планировщика ввода-вывода. В Ubuntu по умолчанию задействован Deadline, в Debian - CFQ. Посмотреть какой планировщик используется, можно командой:

cat /sys/block/sda/queue/scheduler

Вместо "sda" подставьте значение вашего диска (это может быть sdb, sdc и т.д.). Вывод будет таким:

noop deadline [cfq]

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

#!/bin/bash
sudo clear
DISC="sda"; \
cat /sys/block/$DISC/queue/scheduler; \
for T in noop deadline cfq; do \
     echo $T | sudo tee /sys/block/$DISC/queue/scheduler; \
     cat /sys/block/$DISC/queue/scheduler; \
     sync; \
     echo 3 | sudo tee /proc/sys/vm/drop_caches; \
     sudo /sbin/hdparm -tT /dev/$DISC;\
     echo "----"; \
     sleep 10; \
done


Сохраните его под любым именем, например scheduler.sh, дайте права на выполнение (по правому клику в свойствах, вкладка Права) либо в терминале:

chmod +x scheduler.sh

Затем запустите. Вот результат:

noop deadline [cfq]
noop
[noop] deadline cfq
3

/dev/sda:
 Timing cached reads:   8646 MB in  2.00 seconds = 4323.92 MB/sec
 Timing buffered disk reads: 558 MB in  3.01 seconds = 185.41 MB/sec
----
deadline
noop [deadline] cfq
3

/dev/sda:
 Timing cached reads:   8436 MB in  2.00 seconds = 4218.59 MB/sec
 Timing buffered disk reads: 552 MB in  3.01 seconds = 183.37 MB/sec
----
cfq
noop deadline [cfq]
3

/dev/sda:
 Timing cached reads:   8194 MB in  2.00 seconds = 4097.49 MB/sec
 Timing buffered disk reads: 444 MB in  3.17 seconds = 140.11 MB/sec
----


Как видим, noop показал лучший результат, однако лучше всего протестировать на практике (к примеру у меня при переключении на Deadline, появлялись сильные задержки при открытии программ). Для того чтобы сменить планировщик по умолчанию:

sudo nano /etc/default/grub

В строку GRUB_CMDLINE_LINUX_DEFAULT= дописываем elevator=имя нужного планировщика. Сохраните и обновите загрузчик:

sudo update-grub

Для того чтобы указать другой планировщик одному из дисков (например noop для SSD), выполните:

echo noop | sudo tee /sys/block/sda/queue/scheduler

при условии что ваш SSD - это /dev/sda. Если вы не уверены, введите lsblk, для вывода иноформации обо всех дисках в системе.

Наилучшим вариантом при серьёзных дисковых нагрузках, считается планировщик BFQ (усовершенствованный CFQ). Но есть одна проблема - его пока нет в ядре (разработчики активно работают над патчами для добавления его в основную ветку ядра с плавной заменой CFQ). Нужно ставить патч и пересобирать ядро. Либо воспользоваться одним из кастомных ядер, таких как PF-Kernel или Zen-Kernel. Об этом чуть позже. Правда в некоторых дистрибутивах (например Manjaro и Calculate Linux), BFQ уже включён по умолчанию. Советую к прочтению мою старую статью об избавлении симптомов, похожих на баг 12309 (даже если такого у вас нет, рекомендую ознакомиться).

3) Начиная с ядра 3.16, доступна поддержка блочного слоя blk-mq (multiqueue block layer), рассчитанного на организацию многопоточного доступа к данным на многоядерных системах и позволяющего эффективно использовать возможности современных SSD-накопителей. Архитектура нового блочного слоя основана на двухуровневой модели очередей: на первом уровне функционируют очереди для передачи запросов ввода/вывода, привязанные к каждому процессорному ядру. Из данных очередей запросы направляются в очереди второго уровня, которые координируют обращение к оборудованию. В зависимости от конфигурации системы, числа ядер и накопителей соотношение между очередями первого и второго уровня может составлять от 1 к 1 до N к M. Таким образом значительно повышается скорость чтения/записи, а также равномерно распределяется нагрузка. Для включения:

sudo nano /etc/default/grub

В строку GRUB_CMDLINE_LINUX_DEFAULT= добавляем параметр scsi_mod.use_blk_mq=1


4) Дополнительно можно указать некоторые опции монтирования для файловых систем. Указывать их нужно в файле /etc/fstab. Например:

 #Entry for /dev/sdf3 :
UUID=980ee669-4a50-4035-a6d4-0d3c7ffc609e       /home   ext4    defaults        0       2


defaults - набор параметров, соответствующий набору rw, suid, dev, exec, auto, nouser, async. Подробнее о параметрах монтирования вы можете прочитать по ссылке. Для файловой системы Ext4, рекомендуется указать такие параметры (записывайте через запятую после defaults). Наличие источника бесперебойного питания крайне желательно.

relatime - Включает запись информации о последнем времени доступа при чтении файла, если предыдущее время доступа (atime) меньше времени изменения файла (ctime). Включено по умолчанию на Linux начиная с v.2.6.30
barrier=0 Код файловой системы обязан перед созданием записи фиксации [журнала] быть абсолютно уверенным, что вся информация о транзакции помещена в журнал. Просто делать запись в правильном порядке недостаточно; современные диски имеют кэш большого объёма и меняют порядок записи для оптимизации производительности. Поэтому файловая система обязана явно сообщить диску о необходимости записать все журнальные данные на носитель перед созданием записи фиксации; если сначала будет создана запись фиксации, журнал может быть повреждён. Блокирующая система ввода-вывода ядра предоставляет такую возможность благодаря использованию механизма «шлагбаумов» (barriers); проще говоря, «шлагбаум» запрещает запись любых блоков, посланных после него, до того момента, как всё, что было прислано перед «шлагбаумом», будет перенесено на носитель. При использовании «шлагбаумов» файловая система может гарантировать, что всё, что находится на диске, целостно в любой момент времени. Отключая шлагбаум barrier=0, мы ускоряем операции записи на разделы ext4.
commit – время между сбросами буферов на диск. Рекомендуется commit=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).

Ядро.


Вот мы и подошли к самой главной части системы - ядру. Здесь я снова дам ссылку на недавнюю статью по самостоятельной сборке и конфигурированию ядра, и дам небольшой комментарий. Для большинства пользователей, более чем достаточно стандартного дистрибутивного ядра. Кое-какие настройки ядра можно проводить через /etc/sysctl, без необходимости в его пересборки. Ядро - это центральный и самый важный компонент системы, поэтому в него нужно лезть с крайней осторожностью и только если вам это действительно нужно. В каких ситуациях предпочтительно использовать кастомное ядро:

  • Если вы работает со звуком и видео, то вам лучше собрать ядро с патчами для работы в режиме реального времени (PREEMPT_RT);
  • В случае если необходимо добавить патч (например на вышеописанный BFQ), либо включить какой-либо дополнительный функционал;
  • В случае если вы хотите выкинуть из ядра всё лишнее и оставить только то, что нужно вашему компьютеру;
  • В случае если дистрибутивное ядро работает плохо и вы хотите использовать "ванильное" ядро без дистрибутивных патчей;
  • Для "заточки" ядра под конкретное оборудование (к примеру сервер).

Ядра PF-Kernel и Zen-Kernel создаются для десктопов, и их применение на серверах нежелательно. Потому вы можете собрать PF-Kernel и иметь в наличии многие компоненты, которые не входят в стандартное ядро Linux, плюс бОльшую отзывчивость за счёт дополнительных "ядерных" оптимизаций. Готовых пакетов с ядром PF-Kernel к сожалению нет (раньше были, если вы готовы помочь мне с репозиторием и сборкой - пишите, буду рад взяться за эту работу), а вот с Zen-Kernel для Debian-подобных доступен репозиторий Liquorix Kernel.

Вот в принципе и всё. Используя рекомендации из этой статьи, можно добиться максимум производительности особо не напрягаясь. Разумеется, я не мог здесь учесть всё, поэтому если я что-то упустил - пишите в комментариях и я добавлю это в статью. Только прошу не писать про использование USE-флагов в Gentoo, так как уже есть для этого хендбук :)

Ссылки:

Сборник рецептов оптимизации Linux

15 комментариев:

  1. Отличная статья, спасибо за проделанную работу

    ОтветитьУдалить
  2. Как только вы это все помните :)

    ОтветитьУдалить
  3. Здравствуйте!
    Меня интересует такой вопрос. Какой дистрибутив лучше выбрать для работы с копьютерной графикой (Unreal, Blender, substance Painter и т.д.). Дело в том, что пока я не наткнулся на Ваш блог, был почти уверен, что ArchLinux с его легковесностью и производительностью самый оптимальный вариант для этих задач, не смотря даже на те танцы с будном, которые придётся устраивать во время установки новичку. Но вот полистал Ваши статьи и создаётся впечатление, что и Debian можно настроить очень гибко. Но правда такие словосочетания для меня как "компиляция ядра", вообще тёмный лес. Поэтому и спрашиваю, есть ли смысл заморачиваться с этим в Debian? Ну и если можно хоть в двух словах (примерно) возможности этих двух дистрибутивов именно с позиции испольования их в СG. Потому как ютубовские обзоры в основном направленны на обсуждение, какой дистрибутив красивее.
    Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Скажите, пожалуйста, что такое CG?

      Удалить
  4. Я сам (в качестве хобби) занимаюсь графикой в Blender, Krita и GIMP в Debian. Также я собирал в нём Maya, здесь даже статья есть. Всё работало замечательно. Что касается оптимизации - ну, вы же не на калькуляторе будете работать с CG? :) Даже если заморочиться со сборкой ядра, выкидыванием из него лишнего и так далее - ну от силы 2% прироста производительности получите. То, что описано в этой статье - это устранение всех возможных узких горлышек, которые могут возникнуть на том или ином оборудовании. Мне на рабочем компе повезло, и ничего из статьи использовать не пришлось. Debian вы поставите и всё. С Арчем ещё повозиться придётся. К тому же что бы не говорили его фанаты, что мол он стабилен и никогда не разваливается - учитывая его природу (роллинг-дистрибутив) это невозможно. А думаю стабильность системы для вас критична. Да и Debian действительно можно очень гибко настроить. Также я могу порекомендовать CentOS, много профессионального софта собирается в rpm-пакетах для него (та же Maya). Дистрибутив не менее хорош. Однако из минусов - весьма скудные репозитории. Нужно будет подключать дополнительные. Да и некоторый софт значительно старее, чем в Debian. Но в плане стабильности - как скала.

    ОтветитьУдалить
  5. Спасибо за ответ!
    Да, стабильность - основная характеристика.
    Цитата:
    "Что касается оптимизации - ну, вы же не на калькуляторе будете работать с CG? :)"
    Ну конечно), машина у меня не самая передовая, но "боец" ещё крепкий (6 физ. ядер, 12 потоков, оперативки - 32Гб). графикой занимаюсь уже 5 лет и что касается Windows, то в ней я с самого начала пользуюсь стандартной темой рабочего окружения т.е. без каких-либо красивостей, прозрачностей и улучшателей, т.к. производительность, это вторая важная характеристика при выборе дистрибутива. Именно поэтому рассматривал арчик, как наиболее перспективный для себя, поскольку в паре обзоров видел как быстро в нём открываются приложения. Даже предпринимал попытку поставить его на виртуалку) Видимо поспешил))
    А вот про RPM - пакеты знаю очень немного, из различных обзоров успел понять, что ими грешит Fedora и RedHad (хотя могу ошибаться). Но в чём их преимущество или недостаток - понятия не имею).
    Кстати, не сразу обратил внимание, что это Ваш какнал на YouTube, очень интересные обзоры и главное - информативные, без лишней воды!

    ОтветитьУдалить
    Ответы
    1. Ну, скорость открытия программ на самом деле одинаковая в любом дистрибутиве. Если вы поставите систему ещё и на SSD - то вообще молниеносно всё будет работать. Касаемо RPM - он просто другой :) Со своими достоинствами и недостатками. Просто промышленным стандартом является Red Hat Enterprise Linux/CentOS, потому некоторый профессиональный софт и распространяется в RPM. Но как я писал - это не проблема установить его в Debian или Ubuntu. Для CG Linux - идеальный выбор. Не зря ведь Голливуд на нём сидит. За отзыв о канале спасибо :) Буду стараться и дальше!

      Удалить
  6. А теперь мне надо провести такую же оптимизацию на manjaro. Многие пункты только для бубунтоподобных и дебиановых.

    ОтветитьУдалить
    Ответы
    1. Я этим заниматься не стану. Я ненавижу Arch и все его производные, и меня в конец достали его пользователи. Без обид

      Удалить
    2. Статья очень понравилась, многими пунктами воспользовался, благодарю за труды. Вообще я недавно использую Linux, начал с дистрибутива Debian, система понравилась, вспоминаю win, как страшный сон, но часто слышу, что многие хорошо отзываются об Arch (всё можно сделать самому с нуля, продвинутая работа с пакетами, самые свежие версии софта). Было бы интересно послушать ваше мнение по этому поводу, как минимум для общего развития, чем плох данный продукт?

      Удалить
    3. Ну если для общего развития. Арч - это не дистрибутив. Это просто свалка ПО без какого либо тестирования и контроля качества. Вышла новая программа - прямиком отправляется туда. И пофигу что там будет критический баг, который разработчик не заметил. При обновлении, что бы там кто ни говорил, Арч может полностью развалиться. Или отломаться какая-то его часть, которая не проявит себя до последней минуты. Я пользовался этим "дистрибутивом", могу сказать лишь что это как сидеть на пороховой бочке, будучи облитым бензином и с сигаретой в зубах. Не ведитесь на весь этот фанатичный бред, что "Нет дистрибутива кроме Арча". Если вам нужна стабильная и надёжная система, с которой не нужно нянчиться как с маленьким ребёнком - Арч однозначно не для вас. Он больше подходит разработчикам ПО, которым нужны самые свежайшие версии компонентов для тестирования. Я знаю многих людей, которые тоже весьма тепло отзывались о Manjaro или чистом Арче. Почти все они сейчас кто на Linux Mint, кто на KDE Neon, кто на Debian. Свежий софт - это не повод ставить Арч. Эта проблема может быть решена сторонними репозиториями - PPA в Убунтоподобных, RPM Fusion в Fedora и так далее

      Удалить
  7. Посоветуйте хорошую альтернативу для собственного DNS-сервера. pdnsd исключён из stable репозитория debian 9, он есть только в olstable и sid, а не хотелось бы терять стабильность системы подключая данные репы или остаться без обновления установив пакет собственноручно.

    ОтветитьУдалить
  8. Добрый День. А не пора ли обновить статью, т.к. вышел Debian 9?

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