Апгрейди ПК / Нові розробки
Технології 21-го століття стрімко рухаються вперед. Одна з таких технологій - SSD, покликана змінити (а на практиці доповнити) застарілу дискову технологію HDD.
Основні переваги SSD перед HDD вже знайомі всім, це - швидкість доступу, швидкість доступу до довільних блокам, зменшені габарити, зменшене енергоспоживання і як наслідок нагрівання.
Незважаючи на переваги SSD перед традиційними дисками, цієї технології дуже багато років. Я б навіть сказав більше ніж жорстких дисків, проте в силу дорожнечі, тоді (в кінці 70-хх - 80-е) вони коштували не в півтора-два рази більше звичайних дисків, а раз в двадцять. При цьому дуже швидко зношувалися і займали мало не стільки ж, скільки і материнська плата.
На даний момент SSD - це фактично флешка з інтерфейсом ... а ось ми і плавно підійшли до головної теми. Якщо коротко, то інтерфейс носія інформації - це шина зі своїми стандартами, плюсами і мінусами, зі своїм набором команд, за допомогою якої девайс підключається до комп'ютера (центрального процесора, або південному мосту - не має значення). Цей інтерфейс - рівень між пристроєм і операційною системою, з яким однаково успішно працює і пристрій і операційна система. Не варто плутати інтерфейс з форм-фактором роз'єму, оскільки інтерфейс - програмна штука, а роз'єм - апаратна, і скажімо так, вам ніщо не завадить зробити кабель з'єднання вашого жорсткого диска з LAN-кабелю з роз'ємами RJ-45, правда мережевим від цього ваш диск не стане. Отже, роз'єм (або форм-фактор, хоча не зовсім коректно) - це всього лише реалізація підключення пристрою. Інтерфейс, він же протокол - набір програмних стандартів для роботи ОС з пристроєм, підключеним через цей роз'єм.
Досить старий інтерфейс для роботи з носіями інформації - ATA. На даний момент ванільна версія цього інтерфейсу-протоколу безнадійно застаріла, і витіснена більш новими стандартами тим же самим ATA, оброслим милицями, які дозволяють адресувати більше простору, додають чергу команд та інші нововведення, актуальні для сучасного світу.
Одним з таких інтерфейсів є SATA, а точніше AHCI. В цьому випадку найменування взагалі заплутані. Спочатку SATA - був повноцінним стандартом, потім з нього зробили загальну назву для системи носіїв інформації, що підключається за допомогою шести проводів, послідовним підключенням (тобто один пристрій на порт) і набором AHCI-команд, які в свою чергу підтримують стандарт NCQ - чергу, якщо на нашу.
Щоб пристрою бути SATA, йому не обов'язково мати SATA-роз'єм, воно може бути виконано в форматі eSATA, в форматі mSATA (більше нагадує MiniPCI), навіть в форматі повноцінного PCI і підключатися через цю шину. Просто воно буде емулюватися, і система не буде його бачити як PCI, а буде бачити як SATA і працювати з ним як з SATA.
На даний момент максимальна швидкість читання через SATA - 600 Мбс, і це продиктовано в першу чергу електричними обмеженнями, не так легко передати через 4 дроти на високих швидкостях. І 600 Мбс - цілком собі відмінна швидкість, з огляду на що швидкість віддачі інформації з млинця жорсткого диска - фізично близько 90 Мбс, а швидкість читання флешки взагалі 60 Мбс, теоретична, максимальна. Загалом 600 Мбс цілком вистачало з головою для жорстких дисків. Поки не з'явилися SSD. Набір мікросхем пам'яті віддає інформацію на дуже високих швидкостях, крім усього йому не властиво велике час пошуку, і не властиві простої під час запису. Прогресу знадобився всього лише рік, щоб наблизитися впритул до обмеження порту, і ще рік, щоб в кілька разів перегнати його.
Щоб нівелювати ці простої, був придуманий новий інтерфейс - NVM Express. Компанії які його розробляли, продумали все до дрібниць. Зменшення затримок, стандартизація всіх милиць, управління доступом, паралельний доступ (багатоядерні CPU схвалюють), механізм черг, обробка переривань, спрощення керуючих команд, і багато чого іншого. Отримана солянка цілком здатна здивувати народилися в 20-м столітті людей: середня швидкість читання - 2.5 ГБС. Приголомшливо.
Однак дуже скоро виявився той же самий недолік що і в разі мікросхем пам'яті з SATA-інтерфейсом, і в тому місці, де його зовсім не чекали - в архітектурі програмного забезпечення.
Уявіть собі двох людей, один слухає, другий вголос читає книгу. Кількість часу, за яке слухач встигне пізнати цю книгу, спочатку залежить від швидкості читає, і це звичайне положення речей. А тепер уявіть, що читає книгу, прискорює читання. Книга буде почута швидше. Якщо читає ще постарається - то введення цієї книги в вуха слухача відбудеться ще швидше. Але якщо швидкість збільшити ЩЕ, то потік слів стане нескладним, і слухач його просто не зрозуміє. Виходить, що насправді кількість часу на введення книги в вуха слухача, залежить не тільки від швидкості читає, а ще й від можливості слухача розрізняти слова. Подібна ситуація сталася і з Linux. Той, хто читає книгу (суть носій інформації) став передавати інформацію дуже швидко, слухач (система введення-виведення) перестала за ним встигати, в результаті вся система працює на максимальних можливостях слухача, при уміє швидше читача. Нічого страшного в цьому немає, така система буде працювати в три рази швидше, ніж системи дворічної давності. Погано те, що фізично вона може працювати швидше в п'ять разів. І буде.
Отже, тема статті - прискорення Linux на SSD NVM Express - Samsung N950 Pro
Вхідні дані:
Материнська плата MiniITX MSI B150I Gaming Pro
Процесор Intel Pentium G4400 Skylake
ОЗУ 8Gb DDR4 2133MHz
SSD M.2 NVME Samsung 950Pro, швидкість читання - 2500 Мб / c, швидкість запису - 1500 Мб / c
Операційна система Debian 8.4 (насправді не має значення)
Моторошні гальма при завантаженні, і при роботі. З встановленим DE Cinnamon, ця конфігурація відкриває Firefox за 2-3 секунди, що не їсти гут. Повинна миттєво.
Розглянемо послідовно процес завантаження від початку і до готовності роботи:
Спершу завантажується BIOS. Або UEFI - не має значення. Ця мікропрограма инициализирует пристрою і шукає завантажувач на одному з носіїв інформації. Цей завантажувач - MBR або файл UEFI, в свою чергу завантажує повноцінний лоадер, в нашому випадку це GRUB. Лоадер читає свій конфігураційний файл, /boot/grub/grub.cfg і завантажує субмодуля, шрифти і виконує скрипти, виводячи список можливих ОС і їх меню.
Коли ми натискаємо введення на тому чи іншому меню (з Лінукс, зрозуміло), наш GRUB підвантажує додаткові модулі необхідні для доступу до розділу диска, деякі графічні модулі. Потім він завантажує в пам'ять ядро з рядком параметрів, і так званий ramdisk, initrd - стиснений набір модулів і бібліотек, необхідний для початкового старту. Після завантаження рамдіска, ядро передає управління файлу / init, який знаходиться на тому розділі, який був зазначений параметром root = в рядку параметрів ядра. Система ініціалізації, вона ж init - набір скриптів різного ступеня збоченості в різний час, що по суті є Автозавантажувач сервісів, пристроїв, і так далі. Останнім з цих скриптів є менеджер дисплеїв, або менеджер консолей. Подальша завантаження залежить від налаштувань конкретної ОС, вони бувають різними, але найчастіше два варіанти - або видається запрошення в разі менеджера консолей, або видається графічне запрошення у випадку з дисплейним менеджером. Але не завжди. Обидва способи можуть мати Автологін (тобто буде залягання під користувачем без запрошення). Потім вантажиться інтерпретатор (як правило це bash) в випадку з консольної завантаженням, або віконний менеджер (робочий стіл) у випадку з графічної завантаженням. Ці програми є практично кінцевими, за винятком їх власних автозагрузок, які можуть містити в собі підключаються смакоту на зразок докбара, панелей, забарвлень, і іншого сміття. Але це вже не важливо.
Як бачимо, етапів завантаження багато. Насправді їх ще більше, оскільки багато драйвери пристроїв можуть бути вбудовані в ядро, але багато лежать у вигляді окремих модулів і завантажуються в міру необхідності.
Отже, перше що ми повинні усвідомити, як і в випадку з HDD, краще один великий файл, ніж багато дрібних. "Краще" тут може варіюватися в широких межах: десятімегабайтний файл завантажиться швидше, ніж десят стокілобайтних (в сумі дають всього лише мегабайт). Як цього досягти - ми дізнаємося пізніше.
Друге - принцип KISS не завжди хороший, і відсутність принципу KISS не завжди добре теж. Нагадаю, цей принцип говорить робити одну річ одним інструментом, не вигадуючи комбайни. У нашому випадку завантаження, навіть не вдаючись в подробиці видно, що деякі нюанси робляться по кілька разів. Приклад - завантаження драйверів на диск і ФС. Ну маячня ж, якщо GRUB завантажився, значить диск ВЖЕ доступний, і не потрібно довантажувати драйвери в initrd, а потім в ядрі. Як від цього позбутися - ми теж дізнаємося пізніше.
Третє - завжди потрібно усвідомлювати що базове ядро і взагалі базова система побудована на основі найбільш поширених конфігурацій, і з одного боку роздуте для якомога більшої сумісності, а з іншого боку, не підтримує багато фичи знову ж для якомога більшої сумісності. Драйвери відео, драйвери дисків, драйвери USB працюють на середньої арифметичної оптимізації та швидкості. А це найчастіше повільно. Туди ж відносяться і всякі нові технології, на кшталт нашого nvme
Що ж нам потрібно зробити?
По-перше, позбутися від прокладок. Прокладки від яких найлегше позбутися без зайвого головного болю - це як не дивно initrd і дисплейний менеджер. Для того щоб позбутися від першого - потрібно всього лише закомментировать одну сходинку. Щоб позбутися від другого - його потрібно просто не ставити, або видалити якщо вже поставили. Тобто домогтися консольної завантаження.
По-друге, змусити нашу ОС вантажити все фічі для прискорення роботи.
По-третє, зробити так, щоб по можливості все вантажилось тільки одним файлом.
Оскільки просте позбавлення від initrd призведе до неможливості завантаження (ядро не зможе завантажитися), та й фичи просто так не з'являться, єдиний спосіб зробити це - пересобрать ядро.
Це легко. Особливо на debian-based системах, Debian, Ubuntu, Elementary, Mint і інших. На інших конфігурація буде точно таким же, але збірка може трохи відрізнятися. Які пакети потрібно качати і ставити, я пояснювати не буду, про це можна почитати тут (Відкриється в новому вікні)
Нам варто створити початкову конфігурацію командою make localyesconfig - ця команда створить попередню конфігурацію на основі працюють в даний момент модулів, з опцією включення цього всього в ядро (пам'ятаємо, ми формуємо один великий файл). Тому буде краще якщо на цьому етапі ви вставите в ваш комп'ютер всі пристрої, які потенційно можуть використовуватися - вебки, флешки, мережеві карти.
Далі я просто напишу які параметри потрібно конфігурувати для більшого прискорення і підтримки фич на пристроях NVM Express:
General setup ---> Kernel compression mode ---> вибираємо XZ. Цей алогорітм стиснення найбільш швидкий, нехай і не дуже економний.
General setup ---> T imers subsystem ---> Вибираємо Periodic timer ticks (constant rate, no dynticks) - наш процесор сам розбереться як йому працювати з завданнями, не потрібно йому заважати
Processor type and features ---> Вибираємо максимально наближений процесор до нашого, і його деякі фічі, підтримку Hyperthreading, або просто багатоядерності.
P reemption Model ---> Preemptible Kernel (Low-Latency Desktop) - це дозволить максимально швидко обробляти всі завдання
Timer frequency ---> 300 HZ - вище немає сенсу, процесор буде даремно смикатися, нижче - теж, інакше реакція системи буде запізнілою.
Device Drivers ---> <*> NVM Express block device - ставимо зірочку, цей драйвер повинен бути вкомпільовані в ядро
Device Drivers ---> SCSI device support ---> [*] SCSI: use blk-mq I / O path by default - обов'язково. Це дозволить системі введення виведення використовувати паралелізм при читанні або запису на NVM-носії
Інші параметри ви повинні виставити самі, виходячи з наявності або відсутності пристроїв на вашому комп'ютері
Йдемо далі.
File systems ---> <*> The Extended 4 (ext4) filesystem - в разі якщо ви використовуєте ext4 або ext3. Іншими словами, ви повинні вкомпільовані в ядро ту ФС, яка встановлена у вас.
File systems ---> <*> FUSE (Filesystem in Userspace) support - це дозволить монтувати диски в графічних оболонках
File systems ---> DOS / FAT / NT Filesyste ms ---> Тут можна поставити все зірочки, або всі модулі, це потрібно тільки якщо у вас є файлові системи відмінні від кореневої. Флешки, диски, і так далі.
Не забудьте так само виставити необхідні вашим НЕлінукс ФС, кодування в меню Native language support --->
Після компіляції і установки нового ядра, нам варто відредагувати файл /boot/grub/grub.cfg і закомментировать рядок з викликом нашого initrd. Якщо ви його залишите - нічого страшного не трапиться, але система буде завантажувати два рази одні і ті ж модулі. Якщо ви його закомментіруете - нічого страшного так само не станеться, адже вся ваша інформація нікуди не піде. Після цього в рядку завантаження вашого ядра, потрібно змінити параметр root з символьного UUID-пристрої, на його блоковий шлях, наприклад root = / dev / nvme0n1p2
Після перезавантаження по ідеї, нове ядро і в цілому система, повинні завантажуватися відчутно швидше, і займати менше місця на диску і в пам'яті. Якщо ви не змогли завантажити ядро (точніше воно не змогло примонтировать системний розділ і впало в "kernel panic-not syncing: VFS: unable to mount root fs" - це означає що ви невірно вказали системний розділ в параметрах ядра, або забули вкомпільовані драйвер, специфічний для вашої ОС (наприклад вкомпліліровалі підтримку ext4, але забули btrfs, і саме на ньому розташована ваша система).
Далі буде...
Мітки тексту: Linux NVM PCI-E SSD
https://minidevices.info/images/ava.png

https://minidevices.info/images/ava.png
2016-06-03 14:53 2016-06-03 14:53 2016-06-03 14:53 root Linux NVM PCI-E SSD