Перейти к содержанию
    

Увеличение скорости загрузки ядра Linux

Доброго времени суток!

Интересует вопрос о том, как достигнуть максимальной скорости загрузки ядра Linux. В частности загрузка ядра на Microblaze. Возможно помимо какой либо тонкой настройки кернела можно хитро настроить Microblaze.

 

Например в книге "Embedded Linux system design and development" даются следующие советы:

 

• Отключение в ядре печати: если печать ядра направлена в последовательную консоль (которая является медленным устройством), то печать может привести к большой задержке во время инициализации ядра. Чтобы избежать этого, печать ядра можно отключить с помощью опции командной строки ядра quiet. Однако, эти сообщения можно просмотреть позже командой dmesg.

• Жёсткое кодирование в ядре значения loops_per_jiffies: как уже говорилось в Главе 2, инициализация ядра включает в себя вызов функции calibrate_delay() для вычисления значения loops_per_jiffies. В зависимости от архитектуры процессора это может занять до 500 мс. Если частота процессора может быть известна в момент компиляции ядра, то это значение может быть жёстко прописано внутри ядра, либо может быть добавлена опция командной строки ядра, чтобы передать значение этой переменной во время загрузки ядра.

• Сокращение времени инициализации драйвера: разные драйверы имеют разное время инициализации. Это может быть вызвано циклами в драйвере. Вызвать увеличение время загрузки может также зондирования аппаратных устройств на некоторых шинах, таких как PCI. Тонкая настройка времени инициализации в таких случаях означала бы изменения в драйверах, такие как предустановка в них значений, уже известных на момент сборки ядра.

• Использование подходящей корневой файловой системы: разные файловые системы имеют разное время инициализации. Время загрузки для журналируемых файловых систем, таких как JFFS2, чрезвычайно большое, поскольку они сканируют для поиска записей во время инициализации всю flash-память. Файловые системы только для чтения, такие как с CRAMFS и ROMFS, имеют более короткое время инициализации.

 

Может еще что нибудь подскажите.

Заранее благодарен за любые ответы! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Посмотрите здесь:

fast boot

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может еще что нибудь подскажите.

Заранее благодарен за любые ответы! :)

Среди указанных выше рекомендаций нет наиболее существенных:

1) В быстром ядре должны содержаться только те драйвера устройств, которые есть в системе.

2) Все драйверы должны содержаться в самом ядре, а не являться его модулями (Модули подгружаются по мере надобности, и это дополнительные временные затраты наряду с пунктом 1)

Есть так же приемы по оптимизации сборки ядра, всяческие патчи под конкретные системы и многое другое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На данный момент запускается Linux на refboard от Xilinx Spartan3A1800DSP.

Linux (2.6.37) качался git'ом с http://xilinx.wikidot.com/microblaze-linux и там же брался тулчейн (BigEndian, gcc ver. 4.1.2)

В качестве Rootrf используется initramfs с минимальным набором приложений (Busybox ver. 1.13.2)

 

Опции ядра Microblaze:

Microblaze 8.20a: MMU enable; Enable Barrel Shifter; FPU disable; Enable Integer Multiplier 64MUL; Enable Integer Divider; Enable MSRI; Enable Pattern Comparator; Ins Cache 16k; Data Cache 16k; PVR Full.

 

Лог загрузки ядра:

 

early_printk_console is enabled at 0x84000000

Ramdisk addr 0x00000003, Compiled-in FDT at 0xc0192b70

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.37 (kruger@x32) (gcc version 4.1.2) #13 Tue Nov 1 21:37:27 EET 2011
[    0.000000] setup_cpuinfo: initialising
[    0.000000] setup_cpuinfo: Using full CPU PVR support
[    0.000000] cache: wt_msr_noirq
[    0.000000] setup_memory: max_mapnr: 0x8000
[    0.000000] setup_memory: min_low_pfn: 0x48000
[    0.000000] setup_memory: max_low_pfn: 0x50000
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat c020d9e8, node_mem_map c0351000
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32512 pages, LIFO batch:7
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: console=ttyUL0,115200 root=/dev/ram
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Memory: 126380k/131072k available
[    0.000000] SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:32
[    0.000000] xlnx,xps-intc-1.00.a #0 at 0xc8000000, num_irq=2, edge=0x3
[    0.000000] xlnx,xps-timer-1.00.a #0 at 0xc8004000, irq=0
[    0.000000] microblaze_timer_set_mode: shutdown
[    0.000000] microblaze_timer_set_mode: periodic
[    0.000000] Console: colour dummy device 80x25
[    0.002160] Calibrating delay loop... 30.40 BogoMIPS (lpj=60800)
[    0.064662] pid_max: default: 32768 minimum: 301
[    0.066398] Mount-cache hash table entries: 512
[    0.111689] Initializing cgroup subsys ns
[    0.111872] ns_cgroup deprecated: consider using the 'clone_children' flag without the ns_cgroup.
[    0.112113] Initializing cgroup subsys cpuacct
[    0.112335] Initializing cgroup subsys devices
[    0.112669] Initializing cgroup subsys freezer
[    0.139872] devtmpfs: initialized
[    0.174162] bio: create slab <bio-0> at 0
[    0.179241] XGpio: /plb@0/gpio@81440000: registered
[    0.181303] XGpio: /plb@0/gpio@81420000: registered
[    0.182987] XGpio: /plb@0/gpio@81400000: registered
[    0.185706] Switching to clocksource microblaze_clocksource
[    0.188569] microblaze_timer_set_mode: oneshot
[    2.601271] Skipping unavailable RESET gpio -2 (reset)
[    2.601436] GPIO pin is already allocated
[    2.710788] msgmni has been set to 246
[    2.711890] io scheduler noop registered (default)
[    2.718607] 84000000.serial: ttyUL0 at MMIO 0x84000000 (irq = 1) is a uartlite
[    5.669448] console [ttyUL0] enabled
[    5.823412] brd: module loaded
[    5.901300] loop: module load%[    5.938763] Freeing unused kernel memory: 893k freed
Starting rcS...
++ Creating device points
++ Mounting filesystem
++ Loading system loggers
++ Starting telnet daemon
rcS Complete
/bin/sh: can't access tty; job control turned off
/ # 
/ #

 

 

2 gormih:

Спасибо.

Так и есть. Используется только самый необходимый набор драйверов.

 

 

 

 

Забыл сказать

Систему пока гружу с помощью XMD с ОЗУ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь человек грузит линукс с Qt за 1 секунду http://www.embedded-bits.co.uk/2011/1-seco...nux-boot-to-qt/

(Там где-то должно быть видео с его презентации, но что-то я не могу его найти)

 

Можно загрузить ядро с параметром initcall_debug и посмотреть где ядро больше всего времени проводит, и не инитит ли оно чего-то ненужного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там живое видео должно быть. По вашей ссылке видео не нашел.

это на тему

Может еще что нибудь подскажите
, а не про 1s.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

Спасибо огромное всем за ответы!! :beer:

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

На короткий срок эта проблема отпала, но придется к ней еще вернутся. Обязуюсь в конце выложить мини HOW-TO по оптимизации скорости загрузки :)

 

ЗЫ: Вопрос долгожителям форума: вопрос по драйвера линукса под IP-CORE's микроблейза задавать в этом топике или в подфоруме по SoC'ам ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

• Отключение в ядре печати: если печать ядра направлена в последовательную консоль (которая является медленным устройством), то печать может привести к большой задержке во время инициализации ядра. Чтобы избежать этого, печать ядра можно отключить с помощью опции командной строки ядра quiet. Однако, эти сообщения можно просмотреть позже командой dmesg.

Жестокий перевод. Опция позволяет выключить отображение лога загрузки.

Иногда скорость загрузки помогает увеличить правильное сжатие (смотря что тоньше - проц или IO).

А еще лучше выложи .config с которым собрано ядро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил гулять так гулять и пересобрал microblaze по минимуму, оставив следующие коры:

lmb_bram, dlmb_cntlr, ilmb_cntlr, DDR2_SDRAM, mdm_0, xps_intc_0, xps_timer_0 (прицеплен к контр. прерываний) и uartlite (прицеплен к контр. прерываний, скорость 115200)

 

Опции самого ядра microblaze(частота 62,5 МГц):

MicroBlaze Processor Configuration :
-------------------------------------
Version............................8.20.a
Optimization.......................Performance
Interconnect.......................PLB_v46
MMU Type...........................Full_MMU
No of PC Breakpoints...............1
No of Read Addr/Data Watchpoints...0
No of Write Addr/Data Watchpoints..0
Instruction Cache Support..........on
Instruction Cache Base Address.....0x48000000
Instruction Cache High Address.....0x4fffffff
Data Cache Support.................on
Data Cache Base Address............0x48000000
Data Cache High Address............0x4fffffff
Exceptions  Support................on
FPU  Support.......................on
Hard Divider Support...............on
Hard Multiplier Support............on - (Mul64)
Barrel Shifter Support.............on
MSR clr/set Instruction Support....on
Compare Instruction Support........on
PVR Supported......................on
PVR Configuration Type.............Full
Data Cache Write-back Support......on
Fault Tolerance Support............off
Stack Protection Support...........off

Размеры кэша у ядра по 32 КБайта.

 

Лог загрузки пингвина на такой системе:

/ # [    0.000000] Ramdisk addr 0x00000003, Compiled-in FDT at 0xc00f56b8
[    0.000000] Linux version 2.6.37 (kruger@x32) (gcc version 4.1.2) #39 PREEMPT Fri Nov 11 23:16:33 EET 2011
[    0.000000] setup_cpuinfo: initialising
[    0.000000] setup_cpuinfo: Using full CPU PVR support
[    0.000000] cache: wb_msr
[    0.000000] setup_memory: max_mapnr: 0x8000
[    0.000000] setup_memory: min_low_pfn: 0x48000
[    0.000000] setup_memory: max_low_pfn: 0x50000
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat c012cde0, node_mem_map c0210000
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32512 pages, LIFO batch:7
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line: console=ttyUL0 root=/dev/ram quiet mem=128M lpj=58240
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Memory: 127664k/131072k available
[    0.000000] SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:32
[    0.000000] xlnx,xps-intc-1.00.a #0 at 0xc8000000, num_irq=2, edge=0x3
[    0.000000] xlnx,xps-timer-1.00.a #0 at 0xc8004000, irq=0
[    0.000000] microblaze_timer_set_mode: shutdown
[    0.000000] microblaze_timer_set_mode: periodic
[    0.000522] Calibrating delay loop (skipped) preset value.. 34.40 BogoMIPS (lpj=58240)
[    0.000777] pid_max: default: 4096 minimum: 301
[    0.001815] Mount-cache hash table entries: 512
[    0.008476] devtmpfs: initialized
[    0.016465] Switching to clocksource microblaze_clocksource
[    0.017151] microblaze_timer_set_mode: oneshot
[    1.581846] 84000000.serial: ttyUL0 at MMIO 0x84000000 (irq = 1) is a uartlite
[    1.763361] console [ttyUL0] enabled
[    1.777262] Freeing unused kernel memory: 869k freed
Starting rcS...
++ Creating device points
mount: mounting devpts on /dev/pts failed: No such device
++ Mounting filesystem
++ Loading system loggers
++ Starting telnet daemon
rcS Complete
/bin/sh: can't access tty; job control turned off
/ # 
/ #

 

Конфиг линуха в аттаче.

 

 

 

config.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...