Linux speedup!

Решил я попробовать новомодный BTRFS. Погонял его на 10.10, а также третьей альфе 11.04. Тесты не делал. Субьективно - капец. При работе dpkg iowait редко опускается ниже 40. В общем, тормозит сильно. Апдейт из 40 пакетов можно устанавливатся по 30-40 минут. 10.10 превращалась в 11.04 (внимание!) 25 часов без учета времени загрузки файлов.

В связи с чем, обе системы были перенесены корнями и домами на ext4.
10.10 установлена на Pentium Dual Core 1.6, 2Gb, 80Gb Sata.
11.04 стоит на Dell Vostro, C2D 1.8, 2Gb, 160Gb Sata
Так вот.. После BTRFS на Ext4 действительно залетало, но..


Так уж сложилось, что в современных компьютерах горлышком в производительности чаще всего оказывается дисковая подсистема. Но если в случае с продукатами MS очень тяжело от нее отвязатся, то в Linux есть настраиваемые варианты, которые позволяют не замечать медленный винт.

Оба подопытных ПК имеют защиту от сбоев электропитания. Первый имеет упс, второй - аккумулятор. В таком случае было бы хорошо писать не на винт, а в ОЗУ, и читать по возможности оттуда же. Итак, что можно сделать, если у нас от 1.5 Gb ОЗУ:

1. После установки сразу же


sudo apt-get install preload, prelink
sudo nano /etc/default/prelink
PRELINKING устанавливаем в yes

2. Настраиваем использования подкачки системой.
По умолчанию Ubuntu начинает использовать swap если свободно менее 60% оперативной памяти. Реально можно ставить 10% - 0% без каких либо проблем.

В файл /etc/sysctl.conf добавьте:

vm.swappiness = 0
vm.vfs_cache_pressure = 1000

3. Отложенная запись
Ext4 умеет делать отложенную запись. При отложенной записи, изменения попадают не на винт, а в кеш, т.е. скорость записи нивелируется. Этим мы и воспользуемся. Происходит сее действо в несколько этапов (первый из которых - обеспечение компьютера ИБП в любом виде).
Стоит помнить, что если до того, пока изменения не записаны на винт, произойдет что либо не предвиденное - изменения не будут сохранены, также могут произойти ошибки в ФС. И я не зря третий раз напоминаю об ИБП, он очень желателен.

Смена типа журналирования ФС для разделов с ext4, вместо sda3 подставьте свои значения.

sudo tune2fs -o journal_data_writeback /dev/sda3

 Правка FSTAB: /etc/fstab Переключаем режим журнала, отключаем обновление времени последнего доступа при чтении, тюнинг отложенной записи. Получится должно что то такого вида:

UUID=3c78a883-959c-49a1-b0dd-870cb9eba78c  /  ext4   defaults,data=writeback,errors=remount-ro,relatime,commit=60,nobh,barrier=0  0  1

Далее, правка параметров загрузки Grub /etc/default/grub

В параметр GRUB_CMDLINE_LINUX_DEFAULT нужно добавить rootflags=data=writeback чтобы получилось как то так:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=data=writeback"

4. Куча настроек ядра. Теперь можно подправить задержки перед записью на винт, максимальный обьем кешей и сетевые параметры, которые я сборной солянкой нашел в сети и не все могу обьяснить:

sudo nano /etc/sysctl.conf
Вставьте в конец:
# синхронизируем кеш с винтом раз в 60 сек.
vm.dirty_writeback_centisecs=60000
vm.dirty_expire_centisecs=60000

# Как только кешем будет занято 60% ОЗУ, начнется принудительная синхронизация
vm.dirty_ratio=60
# Фоновая синхронизация начнется по заполнению кешем 40% ОЗУ
vm.dirty_background_ratio=40

###
## Включаем защиту от IP спуфинга, и проверку маршрута от источника
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

## Отключаем  маршрутизацию TCP пакетов от источника
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

##Рекомендуется увеличить размер backlog до 1000 или выше (для 10Gb линка можно поставить 30000)
net.core.netdev_max_backlog = 10000

##Увеличиваем число входящих соединений, которые могут стоять в очереди, прежде чем будут отброшены
net.core.somaxconn = 262144

##Переменная определяет максимальное время хранения SYN-запросов в памяти до момента получения третьего, завершающего установление соединения, пакета
net.ipv4.tcp_max_syn_backlog = 1024

##Максимальное число сокетов, находящихся в состоянии TIME-WAIT одновременно. При превышении этого порога «лишний» сокет разрушается и пишется сообщение в системный журнал. Цель этой переменной – предотвращение простейших разновидностей DoS-атак.
net.ipv4.tcp_max_tw_buckets = 720000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 7
net.ipv4.tcp_keepalive_intvl = 30

##Размер буферов по умолчанию для приема и отправки данных через сокеты
net.core.wmem_default = 4194394
net.core.rmem_default = 8388608

##Увеличиваем максимальный размер памяти отводимой для TCP буферов
net.core.wmem_max = 33554432
net.core.rmem_max = 33554432

##Тюнинг буферов для TCP и UDP соединений (min, default, max bytes)
net.ipv4.tcp_rmem = 4096 8388608 16777216
net.ipv4.tcp_wmem = 4096 4194394 16777216

##Отключаем перенаправление пакетов с одного сетевого интерфейса на другой.
net.ipv4.ip_forward = 0

##Фильтр обратного пути, защита от спуфинга (подмены адресов)
net.ipv4.conf.default.rp_filter = 1

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

##Защита  от TCP SYN Cookie
net.ipv4.tcp_syncookies = 1

В итоге
  • Система начала загружатся секунд на 10 быстрее.
  • Логин действительно ускорился.
  • Программы запускаются визуально быстрее.
  • Винт используется ОЧЕНЬ реже. Например при копировании кучи мелких файлов  с флешки на винт, винт может даже не раскручиватся.
  • При работе с программами, требующими много памяти, swap не используется. Начинает использоватся только после того, как память заполняется полностью. Я этого добится не смог.
  • Нет задержек при переключении между программами.
  • При интенсивной работе с винчестером ничего не начинает тормозить.

Коментарі

Популярні публікації