реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Увеличение скорости загрузки ядра Linux
xor.kruger
сообщение Nov 3 2011, 10:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Доброго времени суток!
Интересует вопрос о том, как достигнуть максимальной скорости загрузки ядра 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, имеют более короткое время инициализации.


Может еще что нибудь подскажите.
Заранее благодарен за любые ответы! sm.gif
Go to the top of the page
 
+Quote Post
cpl
сообщение Nov 3 2011, 11:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Для начала опишите свою систему что как и откуда грузиться, чтоб можно было советы давать, иначе общие ракомендации описанные выше.
Посмотрите здесь:
fast boot
Go to the top of the page
 
+Quote Post
gormih
сообщение Nov 3 2011, 12:49
Сообщение #3


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(xor.kruger @ Nov 3 2011, 14:58) *
Может еще что нибудь подскажите.
Заранее благодарен за любые ответы! sm.gif

Среди указанных выше рекомендаций нет наиболее существенных:
1) В быстром ядре должны содержаться только те драйвера устройств, которые есть в системе.
2) Все драйверы должны содержаться в самом ядре, а не являться его модулями (Модули подгружаются по мере надобности, и это дополнительные временные затраты наряду с пунктом 1)
Есть так же приемы по оптимизации сборки ядра, всяческие патчи под конкретные системы и многое другое.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 3 2011, 14:39
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



На данный момент запускается 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 с ОЗУ
Go to the top of the page
 
+Quote Post
kurtis
сообщение Nov 7 2011, 08:40
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Вот здесь человек грузит линукс с Qt за 1 секунду http://www.embedded-bits.co.uk/2011/1-seco...nux-boot-to-qt/
(Там где-то должно быть видео с его презентации, но что-то я не могу его найти)

Можно загрузить ядро с параметром initcall_debug и посмотреть где ядро больше всего времени проводит, и не инитит ли оно чего-то ненужного.
Go to the top of the page
 
+Quote Post
Idle
сообщение Nov 7 2011, 10:55
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



http://free-electrons.com/services/boot-time/, там же ссылка на презентацию
Go to the top of the page
 
+Quote Post
kurtis
сообщение Nov 7 2011, 12:16
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Там живое видео должно быть. По вашей ссылке видео не нашел.
Go to the top of the page
 
+Quote Post
Idle
сообщение Nov 7 2011, 13:24
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(kurtis @ Nov 7 2011, 15:16) *
Там живое видео должно быть. По вашей ссылке видео не нашел.

это на тему
Цитата
Может еще что нибудь подскажите
, а не про 1s.
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 7 2011, 19:33
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Доброго времени суток!
Спасибо огромное всем за ответы!! beer.gif
К сожалению сейчас не имею доступа к своим логам, но полной минимизацией с помощью опций ядра, а также подшаманиванием с ядром микроблейза (увеличил до придела размер кэша и прочее) удалось достигнуть загрузки кернела до 2,17 секунды.
На короткий срок эта проблема отпала, но придется к ней еще вернутся. Обязуюсь в конце выложить мини HOW-TO по оптимизации скорости загрузки sm.gif

ЗЫ: Вопрос долгожителям форума: вопрос по драйвера линукса под IP-CORE's микроблейза задавать в этом топике или в подфоруме по SoC'ам ?
Go to the top of the page
 
+Quote Post
night_fever
сообщение Nov 7 2011, 22:09
Сообщение #10





Группа: Участник
Сообщений: 12
Регистрация: 21-12-08
Пользователь №: 42 650



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

Жестокий перевод. Опция позволяет выключить отображение лога загрузки.
Иногда скорость загрузки помогает увеличить правильное сжатие (смотря что тоньше - проц или IO).
А еще лучше выложи .config с которым собрано ядро.
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 11 2011, 19:44
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Решил гулять так гулять и пересобрал 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 ( 10.49 килобайт ) Кол-во скачиваний: 218
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016