Сборка ядра под себя

Зачем:

Думаю многие слышали про дистрибутив gentoo, как и про то, что его обновление может занимать часы (дни, месяцы, годы, …). Такой геморрой определён политикой дистрибутива, так называемый source-based. То есть компиляция всего и вся из исходников. И в этом есть свой профит. Если вы собираете программу на своём компьютере и прописываете  определённые флаги компиляции, то конечный исполняемый файл оптимизируется именно под ваш процессор. Да, прирост производительности может быть небольшим, незаметным глазу, но за счёт количества пересобранных приложений достигается ощутимый выигрыш в скорости работы системы (по идее).

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

Их огромное количество и я при всём желании не смогу описать их все. Тем более что они описаны на  арчевики.

Мой рандомайзер выстрелил в список и попал в патч linux-pf.

Кстати вот статейка на хабре, ему посвящёна. В этой статье приведены какие-то таблицы, созданные с помощью UnixBench. Я не поленился и прогнал этот бенчмарк у себя. Так как выхлоп слишком большой я заменю его ссылочками на pastebin.

Ядро mainline — типа экспериментальная версия, которая в манжаре уже собрана (но без драйверов и важных финтифлюшек), и которую я собрал на арче сам чисто по приколу.

linux-mainline

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: archlinux: GNU/Linux
   OS: GNU/Linux -- 5.3.0-rc4-mainline -- #1 SMP PREEMPT Mon Aug 12 18:38:59 MSK 2019
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (4790.4 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   03:37:14 up 2 min,  1 user,  load average: 3.10, 1.90, 0.76; runlevel unknown

------------------------------------------------------------------------
Benchmark Run: Вс авг 18 2019 03:37:14 - 04:05:37
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       34169001.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     5421.1 MWIPS (9.4 s, 7 samples)
Execl Throughput                               3016.0 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        410703.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           96583.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1148064.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                              503500.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  49623.9 lps   (10.0 s, 7 samples)
Process Creation                               2992.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2130.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    764.0 lpm   (60.0 s, 2 samples)
System Call Overhead                         271406.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   34169001.9   2927.9
Double-Precision Whetstone                       55.0       5421.1    985.7
Execl Throughput                                 43.0       3016.0    701.4
File Copy 1024 bufsize 2000 maxblocks          3960.0     410703.4   1037.1
File Copy 256 bufsize 500 maxblocks            1655.0      96583.2    583.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    1148064.9   1979.4
Pipe Throughput                               12440.0     503500.0    404.7
Pipe-based Context Switching                   4000.0      49623.9    124.1
Process Creation                                126.0       2992.2    237.5
Shell Scripts (1 concurrent)                     42.4       2130.3    502.4
Shell Scripts (8 concurrent)                      6.0        764.0   1273.4
System Call Overhead                          15000.0     271406.7    180.9
                                                                   ========
System Benchmarks Index Score                                         621.9

------------------------------------------------------------------------
Benchmark Run: Вс авг 18 2019 04:05:37 - 04:33:56
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables       80371026.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    35358.2 MWIPS (10.8 s, 7 samples)
Execl Throughput                               7521.7 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        196291.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           64360.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        733168.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                              873622.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  92215.8 lps   (10.0 s, 7 samples)
Process Creation                               9947.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  10548.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1492.0 lpm   (60.1 s, 2 samples)
System Call Overhead                        1201385.6 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   80371026.4   6887.0
Double-Precision Whetstone                       55.0      35358.2   6428.8
Execl Throughput                                 43.0       7521.7   1749.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     196291.0    495.7
File Copy 256 bufsize 500 maxblocks            1655.0      64360.9    388.9
File Copy 4096 bufsize 8000 maxblocks          5800.0     733168.9   1264.1
Pipe Throughput                               12440.0     873622.1    702.3
Pipe-based Context Switching                   4000.0      92215.8    230.5
Process Creation                                126.0       9947.5    789.5
Shell Scripts (1 concurrent)                     42.4      10548.6   2487.9
Shell Scripts (8 concurrent)                      6.0       1492.0   2486.7
System Call Overhead                          15000.0    1201385.6    800.9
                                                                   ========
System Benchmarks Index Score                                        1229.7

 

Патченное ядро linux-pf.

linux-pf

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: archlinux: GNU/Linux
   OS: GNU/Linux -- 5.2.5-pf -- #1 SMP PREEMPT Sun Aug 18 01:54:40 MSK 2019
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz (15963.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   02:27:30 up 14 min,  1 user,  load average: 3.07, 2.62, 1.87; runlevel unknown

------------------------------------------------------------------------
Benchmark Run: Вс авг 18 2019 02:27:30 - 02:55:26
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       28102565.1 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     5322.5 MWIPS (7.7 s, 7 samples)
Execl Throughput                               3065.8 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        424274.1 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          111489.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1216662.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                              614354.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 146982.7 lps   (10.0 s, 7 samples)
Process Creation                               6229.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3328.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1092.1 lpm   (60.0 s, 2 samples)
System Call Overhead                         348862.5 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   28102565.1   2408.1
Double-Precision Whetstone                       55.0       5322.5    967.7
Execl Throughput                                 43.0       3065.8    713.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     424274.1   1071.4
File Copy 256 bufsize 500 maxblocks            1655.0     111489.1    673.7
File Copy 4096 bufsize 8000 maxblocks          5800.0    1216662.6   2097.7
Pipe Throughput                               12440.0     614354.3    493.9
Pipe-based Context Switching                   4000.0     146982.7    367.5
Process Creation                                126.0       6229.7    494.4
Shell Scripts (1 concurrent)                     42.4       3328.3    785.0
Shell Scripts (8 concurrent)                      6.0       1092.1   1820.2
System Call Overhead                          15000.0     348862.5    232.6
                                                                   ========
System Benchmarks Index Score                                         805.9

------------------------------------------------------------------------
Benchmark Run: Вс авг 18 2019 02:55:26 - 03:23:44
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables       77432227.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    22659.5 MWIPS (8.4 s, 7 samples)
Execl Throughput                               8654.5 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        684336.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          199066.7 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1899537.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                             3647132.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 222343.4 lps   (10.0 s, 7 samples)
Process Creation                              50463.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15001.1 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1018.2 lpm   (60.2 s, 2 samples)
System Call Overhead                        2216016.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   77432227.4   6635.2
Double-Precision Whetstone                       55.0      22659.5   4119.9
Execl Throughput                                 43.0       8654.5   2012.7
File Copy 1024 bufsize 2000 maxblocks          3960.0     684336.4   1728.1
File Copy 256 bufsize 500 maxblocks            1655.0     199066.7   1202.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    1899537.2   3275.1
Pipe Throughput                               12440.0    3647132.9   2931.8
Pipe-based Context Switching                   4000.0     222343.4    555.9
Process Creation                                126.0      50463.7   4005.1
Shell Scripts (1 concurrent)                     42.4      15001.1   3538.0
Shell Scripts (8 concurrent)                      6.0       1018.2   1697.0
System Call Overhead                          15000.0    2216016.2   1477.3
                                                                   ========
System Benchmarks Index Score                                        2298.0

Насколько я понял, тест прогонялся в однопоточном и восьмипоточном режимах. И если для одного потока конечный балл не сильно различается (621 для mainline и 805 для pf), то для многопоточного режима разница уже ппц как ощутима (2298 для pf и 1229 для mainline).

Опишу немного что было протестировано:

  • Dhrystone — используется для измерения и сравнения производительности компьютеров. (и сами понимайте что это значит, я не понял).
  • Double-Precision — используется для измерения скорости и эффективности операций с плавающей запятой.
  • Execl Throughput — используется для измерения количества вызовов execl, которые могут быть выполнены в секунду.
  • File Copy — используется для измерения скорости, с которой данные могут передаваться из одного файла в другой. При тестировании изменяется размер блоков для копирования и их количество.
  • Pipe Throughput — сколько раз (в секунду) процесс может записать 512 байт в канал и прочитать их обратно.
  • Process creation — время создания потока
  • Shell scripts — сколько раз в секунду можно запустить скрипты на shell
  • Systyem call overload — задержки системных вызовов

На стандартном ядре арча я запускать тест не стал, потому что мне лениво ждать ещё пол-часа. Но не думаю что результат будет сильно отличаться от linux-mainline, так как он был собран с дефолтным конфигом арча.

Если вас впечатлили результаты тестов и вам захочется собрать для себя ядро linux-pf, то вот кратенький инструкшн

 

yay -S linux-pf

ВАЖНО!!!

Так как ядро большое и собираться будет долго, то настоятельно вам советую поправить /etc/makepkg.conf в соответствии с мануалом. Внимательно смотреть на секцию «Настройка: архитектура и флаги компиляции» и всё что ниже.

ВАЖНО!!!

Сборка потребует от юзера тыкать на кнопочки, поэтому pamac и octopi сразу пролетают. Сразу юзайте консольные утилиты во избежание баттхерта.

В процессе сборки ядра вас 2 раза будут спрашивать, надо ли вам что-то изменить:Running kernel config выбирать бессмысленно, так как у вас он будет таким же, как дефолтная опция. А вот make localmodconfig уже интереснее: он настроит ядро на сборку только тех модулей, что сейчас используются.

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

Конечно проще нажать энтер и собрать олл-инклюзив, и оно даже будет работать, но это не по-гиковски)

И второй вопрос, сразу после первого:

Это опции «досборки» ядра. Если вам позарез надо включить какую-то фичу или добавить модуль. Первые четыре опции отличаются только графикой, с помощью которой будут отрисовываться. Самый первый вариант выбирать не советую, так как это крайне неудобно. make nconfig вполне достаточно.

make localyesconfig это отдельная тема. Он похож на localmodconfig, но если первый все запущенные модули включит в ядро в виде модуля, то localyesconfig вкомпилирует эти модули в ядро. Это может быть очень болезненно, например, если у вас видеокарта NVIDIA и вы захотите использовать проприеритарные драйвера. По умолчанию nouveau (свободный драйвер нвидии) включён в ядро как модуль и его можно выгрузить с помощью команды modprobe -r nouveau. Собственно для работы проприеритарного драйвера он и должен быть выгружен. Если же драйвер вкомпилирован в ядро, то вытащить его оттуда уже нельзя и не видать вам игрулек с фпс выше 10.

Сама сборка займёт минут 20-40, в зависимости от мощности проца.

ВАЖНО!!!

После сборки я обнаружил то-ли баг, то-ли фичу. По умолчанию для ядра собираются так же и хедеры, в данном случае linux-pf-headers. И при сборке пакета они собираются, и находятся в той же папке где и собранный пакет с ядром. Но по какой-то странной причине они не ставятся вместе с ядром. Чтобы это недоразумание исправить, вам нужно зайти в папку где ядрышко собиралось и ручками доустановить оставшиеся пакеты:

cd ~/.cache/yay/linux-pf
yay -U *.pkg.tar*

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

Самое интересное

Пора ставить драйвера!

Тем, у кого AMD или Intel бояться нечего, а вот пользующим нвидию лучше покрепче сжать сфинктер.

Если вы используете bumblebee или у вас только видеокарта нвидия, то вам достаточно поставить пакеты nvidia-pf и bbswitch-pf.

У меня такой мэджик почему-то не сработал, возможно из за того что я использую optimus-manager. На замену я поставил bbswitch-dkms и nvidia-dkms. Тут описано, что это за зверь. Самое важное уже во втором абзаце:

​Это означает, что пользователь может не ждать, пока какая-то компания, проект или сопроводитель пакета выпустит новую версию модуля. После введения Pacman#Hooks пересборка модулей осуществляется автоматически во время обновления ядра.

То, что доктор прописал для нашего кастомного ядра.

ВАЖНО!!!

В манжаре нету nvidia-dkms, но есть тема на форуме, где ответил сам (!!!) oberon.

https://forum.manjaro.org/t/installation-linux-pf-in-manjaro/8642

В итоге всё решилось установкой двух арчовых пакетов. Раз вы досюда дочитали, то проще уж накатить арчик.

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Оставить комментарий

avatar
  Подписаться  
Уведомление о

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: