1.2 bootchart2

bootgraph가 Kernel 시작 부터 Init까지의 부팅과정을 분석한다면, bootchart2는 init 이후의 부팅 과정 및 CPU 사용률 및 디스크 사용률까지 분석 해준다. bootchart2를 사용하기 위해서는 다음과 같은 작업을 해야 한다.


1) 부팅 과정의 로그를 저장하는 데몬인 bootchartd를 busybox 컴파일 시 포함 시켜줘야 한다.

busybox # make menuconfig


 Init Utilities ---> [*] bootchartd

                      [*]   Compatible, bloated header

                      [*]   Support bootchartd.conf


2) u-boot의 boot parameter인 init=/sbin/init을 init=/sbin/bootchartd로 변경하고 printk.time=1 initcall_debug=1 를 추가 한다.

  ex> bootargs=noinitrd rootfstype=ubifs ubi.mtd=4 xxxxxxxxxxxxxxxxxx init=/sbin/bootchartd printk.time=1 initcall_debug=1


3) 부팅 후 /var/log 에 부팅 로그 파일인 bootlog.tgz 를 서버로 복사한다.


4) 개발 서버에서 bootchart2 소스코드를 다운로드 하여 컴파일 한다. ( https://github.com/mmeeks/bootchart/releases )

/usr/local/bootchart2/bootchart-0.14.7$ make



5) bootchart2 스크립트인 pybootchartgui.py 를 이용하여 부트 로그 파일인 bootlog.tgz 를 그래프화 한다.

  $ /usr/local/bootchart2/bootchart-0.14.7/pybootchartgui.py bootlog.tgz


6) 결과

부팅 로그가 분석된 bootchart.png 파일이 생성 되고 이를 확인할 수 있다.





 


Posted by 다크쌍피

1. 개요

Embedded Llinux를 사용하는 많은 장치들이 부팅속도를 줄이려고 많은 노력을 한다. 요즘은 Zero-Boot, 혹은 Super-FastBoot 등과 같이 메모리 덤프작업을 통해서 전원 인가 후 1초만에 어플리케이션이 실행 되도록 하는 기술이 이슈가 되고 있는데, 여러 모듈과 연동하고 있는 산업용 장비 같은 경우, 초기화 시에 모듈의 이상유무를 검증해야 해서 이런 기술이 적용되기 힘든경우가 존재한다. 이런경우 순수하게 리눅스의 부팅 시 사용하지 않는 모듈을 제거 하거나 다른 모듈로 대체 해나가면서 최적화 하는 방법이 필요 한데 이런경우에 사용하면 유용한 툴이 bootgraphbootchart2를 이용하는 방법이다.


bootgraph 와 bootchart2는 부팅 과정을 시간별로 그래프화 하여 모듈의 부팅 시 시작 시점 및 실행 시간을 알 수 있도록 기능을 제공 한다.


1.1 bootgraph

bootgraph 는 Linux Kernel Source에 포함된 perl script로 Linux Kernel Source/scripts/bootgraph.pl 로 존재 한다.

bootgraph를 사용해서 부팅 과정을 분석 하기 위해서는 다음과 같은 작업을 해야 한다.


  1) Kernel Config 내용 중 CONFIG_PRINTK_TIME, CONFIG_KALLSYMS 을 Enable 시켜줘야 한다.

  2) Kernel Config 내용 중 버퍼 오버플로어를 대비해서 CONFIG_LOG_BUF_SHIFT 를 14 에서 18 로 변경한다.

  3) u-boot의 boot prameter에 "printk.time=1 initcall_debug=1"를 추가 한다.

      ex> bootargs=noinitrd rootfstype=ubifs ubi.mtd=4 xxxxxxxxxxxxxxxxxx printk.time=1 initcall_debug=1


내용적용 후 Kernel Booting Log용

[    0.000000] Linux version 2.6.39.1 (dark2pee@dev-ubuntu) (gcc version 4.3.3 (GCC) ) #53 Wed Jul 2 11:01:05 KST
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: OMAP3 SIO
[    0.000000] Reserving 4194304 bytes SDRAM for VRAM
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] OMAP3630 ES1.2 (l2cache iva neon isp 192mhz_clk )

                                    :

[    0.039642] CPU: Testing write buffer coherency: ok
[    0.039855] calling  spawn_ksoftirqd+0x0/0x50 @ 1
[    0.039916] initcall spawn_ksoftirqd+0x0/0x50 returned 0 after 0 usecs
[    0.039947] calling  init_workqueues+0x0/0x250 @ 1


  4) 부팅 완료 후 부팅 로그를 dmesg 를 이용하여 저장한다.

target# dmesg > /tmp/bootlog


 5) 저장된 bootlog를 개발서버로 복사 하여 bootgraph 스크립트를 이용하여 그래프화 한다.

server$ cat bootlog | perl /linux-kernel-xxxxx/scripts/bootgraph.pl > bootlog.svg 


6) 결과

해당 모듈의 부팅 시간을 확인 하여 필요 없는 부분을 삭제 한다.


 



Posted by 다크쌍피