Fedora Speed Up. Теперь аппаратный.

Posted: 2015-10-12 in IT, Software
Метки:

Подумывая об апгрейде, решил наконец-то заменить одну из наиболее медленных частей в своем компутере. Ну а поскольку я специально не искал лёгких путей — то мне есть что рассказать. 😀

Если вы уже читали мой блог, то могли догадаться, что я использую основной системой Linux Fedora — это очень активно развивающийся линуксовый дистриб, в котором можно как просто сидеть на вполне актуальном софте и не париться, так и искать на свою пятую точку острых ощущений. Мои ранние статьи про настройку ИБП и прочие общие словеса — это скорее из первого, а вот SELinux — это скорее из второго =)

На этот раз я решил помониторить использование жестких дисков, и обнаружив множественные чтения кучи мелких файлов при загрузке и старте приложений, решил таки заценить твердотельный накопитель в качестве носителя корневой ФС. Однако чтобы разница была более ощутимой, я решил не связываться с SATA-накопителями (на текущей системе нет SATA-3), и поставить систему вот на такую дрыну:

Plextor M6e 128Gb [PCI-E AIC]

Видится он как дополнительный контроллер, и материнка Asus P5Q Pro Turbo прекрасно умеет с него бутиться. Не все материнки могут уметь грузиться с PCI-Express контроллеров — лучше уточнить у производителя материнки. У асуса саппорт прекрасен — мне оперативно ответили, что загрузка с таких девайсов на моей материнке поддерживается.
Осталось перенести систему. Конечно, можно было бы просто с помощью dd скопировать раздел посекторно с восстановлением загрузчика или тривиально переставить систему, указав новые точки монтирования для старых дисков. Но в этом случае мне пришлось бы заново развернуть кучу своих конфигов, да и такой путь неспортивен.

Но перед тем, как я начну перенос системы, немного картинок для фанатов «unboxing-а».
Поставляется дрына вот в такой коробке:
M6e_1_Box
При её открытии первой попадается бумажная дирюлька на тему «вип-хуип» для чесания ЧСВ линуксоидам-нищебродам ч0тким пацанам:
M6e_2_VIP
Предположу, что вип-дирюлька какгбе намекает нам на срок гарантийных обязательств.
Дальше видим инструкцию по вкручиванию в корпус и пакет с девайсом:
M6e_3_in_packet
Вид самого девайса вы уже видели выше =)

Вставляем девайс в корпус (важный момент — для сохранения мани-бэка не прикручиваем винт — девайс должен быть не поцарапанным, если планируется его вернуть!).

Я решил перенести систему прямым копированием по F5 с правкой fstab, grub.cfg и последующим восстановлением загрузчика. Ну а поскольку это труъ-праноидальная федора — то и с восстановлением меток SELinux и сменой типа файловой системы на BTRFS, у которой есть весьма примечательная опция монтирования «ssd». Дополнительная идея-фикс была в том, чтобы перенести систему, принципиально не прибегая к другим источникам загрузки типа установочных дисков, rescue-флешек и прочего.

Действия по шагам.

1). Дрына видится линуксом как обычные диски. В моём случае это был /dev/sdd Запускаем GParted, создаём MBR-запись и разделы. Я сделал один под корень, второй под прочее. Тип ФС — btrfs. Причина выбора BTRFS — наличие оптимизаций под SSD. Размеры — по желанию, но чтобы влезло. 20Gb под корень обычно хватает с изрядным запасом. Можно использовать внутренние слайсы btrfs-а, но я решил эти опыты оставить на будущее, а сейчас сделать на классических статик-разделах.

2). Монтируем в /mnt/sdd1 наш будущий корень и копируем туда тупо миднайтом или cp все каталоги, кроме /home /tmp /proc /sys /run и /dev. Эти каталоги просто создаём пустыми.

3). В новом корне (/dev/sdd1) создаем пустой файл с именем .autorelabel , в конфиге /mnt/sdd1/etc/selinux/selinux.conf ставим режим permissive. Это надо для корректного восстановления SELinux-меток при ребуте и правильного старта системы.

4). Узнаём UUID нового корня командой
blkid /dev/sdd1
Всяких ID там будет пачка: LABEL, UUID, UUID_SUB, PARTUUID.
Копируем основной UUID (не SUB* и не PART* !!) в буфер обмена.

5). Правим /mnt/sdd1/etc/fstab таким образом, чтобы по новому UUID монтировался корень (опции noatime,nodiratime,ssd), а старая корневая ФС монтировалась куда-нить в укромный /mnt/old_root (не забыть создать!). Остальные разделы оставим как были. Вообще монтирование и адресация дисков по UUID — это совершенно чумовая штука. Вы можете перепутать диски даже в софтовых RAID-массивах, воткнув их не в те контроллеры, где они были изначально, можете как угодно менять типы и порядок дисков в биосе — система этого даже не заметит. Офигенно удобно. Да, вы можете со всем дисковым хозяйством и mdadm-овскими рейдами переехать на другую материнку, просто от балды воткнув все диски и указав в биосе лишь диск с загрузчиком.

6). Загрузчик. Сперва открываем /mnt/sdd1/boot/grub2/grub.cfg текстовым редактором и автозаменой меняем старый UUID корня на новый, проверяем, что старого UUID нету. Иначе с SSD будет стартовать только загрузчик, а система будет использована со старого диска.

7). Важный момент — базовый образ Init-RD не умеет btrfs! Из-за этого я сперва несколько подзатупил, какого фига не монтировался корень =)

M6e_5_initrd_failed1

Смотрим лог прямо из аварийного шелла (journalctl -xe):

M6e_6_initrd_failed2

Для исправления в /mnt/sdd1/etc/dracut.conf приводим параметр filesystems вот к такому виду:
filesystems+="btrfs"

8). Жжом напалмом:
mount -o rbind /proc /mnt/sdd1/proc
mount -o rbind /dev /mnt/sdd1/dev
mount -o rbind /sys /mnt/sdd1/sys
chroot /mnt/sdd1
grub2-install /dev/sdd
dracut -f

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

9). Ребутимся, выбираем в биосе загрузку с SSD, тихо офигеваем и радуемся.

Способ гораздо сложнее, чем тупо переставить, зато даёт гораздо больше бесценного опыта. =)
Поскольку все изменения я делал на sdd, то риск запороть основную систему крайне мал. Если что не так — возвращаем в биосе старый диск в качестве загрузочного и грузимся с обычного старого диска, как и раньше. Фиксим дальше.

Немного итогов.

770 Мб/сек оказались чистого маркетинговыми — это пиковое значение в каких-то там идеальных условиях каким-то хитрожопым тестировщиком, о чем написано как на коробке, так и на сайте плекстора. Реально получилось вот что:

# hdparm -t /dev/sdd
/dev/sdd:
Timing buffered disk reads: 1828 MB in 3.00 seconds = 608.72 MB/sec
Timing buffered disk reads: 1830 MB in 3.00 seconds = 609.73 MB/sec
Timing buffered disk reads: 1822 MB in 3.00 seconds = 606.69 MB/sec

Цифры 605-620 Мб/сек воспроизводимы и держатся стабильно. Скорость записи гораздо менее критична на системном томе, поэтому я не стал покупать более дорогие версии SSD — и 300 Мб/сек на запись это очень и очень много, тем более для системного раздела. Да и сама технология SSD подразумевает, что нагрузку на запись для SSD лучше снизить.

Громадные значения в десятки тысяч IOPS тоже весьма полезны — даже при куче установленных сервисов система грузится буквально пару секунд. Запуск гимпа, либреоффиса, самом системы, выгрузка данных из MySQL, запуск игрушек, профили которых я вытащил на второй раздел SSD — всё это стало несопоставимо быстрее.

У меня есть ещё три недели мани-бэка и возможность вернуть девайс, если мне что-то не понравится.
Из дополнительных приятных бонусов — гарантия 5 лет, как на старые добрые сигейты =) .

Ну и последний штрих:
Чтобы свести фоновую активность на запись к околонулевым значениям, я вынес /var/log и /var/tmp в отдельыне ФС.
Делается это так:
На обычном диске (не SSD) создаём файл-контейнеры под новые ФС:


dd if=/dev/null of=./var_log.fs bs=1G seek=1
dd if=/dev/null of=./var_tmp.fs bs=8G seek=1

Делаем их блочными устройствами:


losetup /dev/loop1 ./var_log.fs
losetup /dev/loop2 ./var_tmp.fs

Форматим:


mkfs.ext4 /dev/loop1 -L VAR_LOG
mkfs.ext4 /dev/loop2 -L VAR_TMP

Прописываем в fstab:


/mnt/HDD1/var_log.fs /var/log ext4 rw,auto,loop 0 0
/mnt/HDD1/var_tmp.fs /var/tmp ext4 rw,auto,loop 0 0

Теперь просто монтируем loop-девайсы во временные каталооги, переносим файлы по F6 или командой mv, и либо просто ребутимся, либо делаем отмонтирование из временных каталогов, mount -a, рестарт syslog / systemd-journald. Вуаля, теперь журналы пишутся на обычный диск, да ёщё и в отдельную маленькую ФС внутри контейнера.

Через пару дней случайно заметил, что данная дрына оснащена ядрёными светодиодами и освещает половину кузова:

M6e_7_in_case

Светодиоды настолько яркие и жгучие, что засвечивали матрицу на фотике — более-менее сносно сфоткать удалось не с первого раза.
Для озадаченных моддингом это может быть важно.

Отдельное спасибо передаю участникам jabber-конфы linux@conference.jabber.ru , оказавшим существенную помощь в борьбе с BTRFS =)

Ну и немного диагностики, конечно же.

# smartctl --all /dev/sdd
smartctl 6.4 2015-06-04 r4109 [i686-linux-*********.*****.*******] (local build)
Copyright (C) 2002-15, Bruce Allen, Christian Franke, http://www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model: PLEXTOR PX-AG128M6e
Serial Number: *************
LU WWN Device Id: * ******* *************
Add. Product Id: V27020E0
Firmware Version: 1.05
User Capacity: 128 035 676 160 bytes [128 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: ATA8-ACS, ATA/ATAPI-7 T13/1532D revision 4a
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Wed Nov 11 01:02:52 2015 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 10) seconds.
Offline data collection
capabilities: (0x15) SMART execute Offline immediate.
No Auto Offline data collection support.
Abort Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
No Selective Self-test supported.
SMART capabilities: (0x0002) Does not save SMART data before
entering power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 1) minutes.
Extended self-test routine
recommended polling time: ( 10) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x0003 100 100 070 Pre-fail Always - 0
5 Reallocated_Sector_Ct 0x0003 100 100 000 Pre-fail Always - 0
9 Power_On_Hours 0x0002 100 100 000 Old_age Always - 525
12 Power_Cycle_Count 0x0002 100 100 000 Old_age Always - 56
177 Wear_Leveling_Count 0x0003 100 100 000 Pre-fail Always - 415
178 Used_Rsvd_Blk_Cnt_Chip 0x0003 100 100 000 Pre-fail Always - 0
181 Program_Fail_Cnt_Total 0x0003 100 100 000 Pre-fail Always - 0
182 Erase_Fail_Count_Total 0x0003 100 100 000 Pre-fail Always - 0
187 Reported_Uncorrect 0x0002 100 100 000 Old_age Always - 0
192 Power-Off_Retract_Count 0x0003 100 100 000 Pre-fail Always - 25
196 Reallocated_Event_Count 0x0003 100 100 000 Pre-fail Always - 0
198 Offline_Uncorrectable 0x0003 100 100 000 Pre-fail Always - 0
199 UDMA_CRC_Error_Count 0x0003 100 100 000 Pre-fail Always - 0
232 Available_Reservd_Space 0x0003 100 100 010 Pre-fail Always - 0
241 Total_LBAs_Written 0x0003 100 100 000 Pre-fail Always - 1350
242 Total_LBAs_Read 0x0003 100 100 000 Pre-fail Always - 4739

SMART Error Log Version: 0
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]

Selective Self-tests/Logging not supported

И ещё одна утилита:


# hdparm -I /dev/sdd

/dev/sdd:

ATA device, with non-removable media
Model Number: PLEXTOR PX-AG128M6e
Serial Number: ***************
Firmware Revision: 1.05
Transport: Serial, ATA8-AST, SATA II Extensions, SATA Rev 2.6, SATA Rev 3.0
Standards:
Used: ATA/ATAPI-7 T13 1532D revision 4a
Supported: 8 7 6 5 & some of 8
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 250069680
LBA48 user addressable sectors: 250069680
Logical Sector size: 512 bytes
Physical Sector size: 512 bytes
Logical Sector-0 offset: 0 bytes
device size with M = 1024*1024: 122104 MBytes
device size with M = 1000*1000: 128035 MBytes (128 GB)
cache/buffer size = unknown
Nominal Media Rotation Rate: Solid State Device
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 32
Standby timer values: spec'd by Standard, no device specific minimum
R/W multiple sector transfer: Max = 1 Current = 1
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
* SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* DOWNLOAD_MICROCODE
SET_MAX security extension
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* 64-bit World wide name
* Segmented DOWNLOAD_MICROCODE
* Gen1 signaling speed (1.5Gb/s)
* Gen2 signaling speed (3.0Gb/s)
* Gen3 signaling speed (6.0Gb/s)
* Native Command Queueing (NCQ)
* Host-initiated interface power management
* Phy event counters
* DMA Setup Auto-Activate optimization
Device-initiated interface power management
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT Write Same (AC2)
* SCT Error Recovery Control (AC3)
* SCT Features Control (AC4)
* SCT Data Tables (AC5)
* Data Set Management TRIM supported (limit 8 blocks)
Security:
supported
not enabled
not locked
not frozen
not expired: security count
supported: enhanced erase
6min for SECURITY ERASE UNIT. 6min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: ***************
NAA : *
IEEE OUI : *******
Unique ID : *************
Checksum: correct

P.S. Продолжение истории :

NVMe-SSD дома, ня

Реклама

Обсуждение закрыто.