Embedded Linux Optimizations

Download as pdf or txt
Download as pdf or txt
You are on page 1of 65

Embedded Linux optimizations

Embedded Linux 
optimizations

Size, RAM, speed,
power, cost

Michael Opdenacker
Thomas Petazzoni
Gilles Chanteperdrix
Free Electrons
© Copyright 2004­2009, Free Electrons.
Creative Commons BY­SA 3.0 license
Latest update: May 26, 2010, 
Document sources, updates and translations:
http://free­electrons.com/docs/optimizations
Corrections, suggestions, contributions and translations are welcome!
1
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Penguin weight watchers

Make your penguin slimmer, faster, and reduce its consumption of fish!
Before 2 weeks after

2
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
CE Linux Forum

http://celinuxforum.org/
Non profit organization, whose members are embedded Linux 
companies and Consumer Electronics (CE) devices makers.
Mission: develop the use of Linux in CE devices
Hosts many projects to improve the suitability of Linux for CE 
devices and embedded systems. All patches are meant to be 
included in the mainline Linux kernel.
Most of the ideas introduced in this presentation have been 
gathered or even implemented by CE Linux Forum projects!

3
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Contents

Ideas for optimizing the Linux kernel and executables
Increasing speed
Reducing size: disk footprint and RAM
Reducing power consumption
Global perspective: cost and combined optimization effects
The ultimate optimization tool!

4
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Increasing speed
Reducing kernel boot time

5
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Measuring kernel boot time

CONFIG_PRINTK_TIME
Configure it in the Kernel Hacking section.
Adds timing information to kernel messages. Simple and robust.
Not accurate enough on some platforms (1 jiffy = 10 ms on arm!)
See http://elinux.org/Printk_Times

...
[42949372.970000] Memory: 64MB = 64MB total
[42949372.970000] Memory: 54784KB available (1404K code, 296K data, 72K init)
[42949373.180000] Mount­cache hash table entries: 512
[42949373.180000] CPU: Testing write buffer coherency: ok
[42949373.180000] checking if image is initramfs...it isn't (bad gzip magic numb
ers); looks like an initrd
[42949373.200000] Freeing initrd memory: 8192K
[42949373.210000] NET: Registered protocol family 16
...

6
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Boot tracer

CONFIG_BOOT_TRACER in kernel configuration
Introduced in Linux 2.6.28
Based on the ftrace tracing infrastructure
Allows to record the timings of initcalls
Boot with the initcall_debug and printk.time=1 parameters, 
and run dmesg | perl scripts/bootgraph.pl > output.svg
to generate a graphical representation

7
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Disable console output

The output of kernel bootup messages to the console takes 
time! Even worse: scrolling up in framebuffer consoles!
Console output not needed in production systems.
Console output can be disabled with the quiet
argument in the Linux kernel command line (bootloader settings)
Example:
root=/dev/ram0 rw init=/startup.sh quiet
Benchmarks: can reduce boot time by 30 or even 50%!
See http://elinux.org/Disable_Console

8
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Preset loops_per_jiffy

At each boot, the Linux kernel calibrates a delay loop (for the 
udelay function). This measures a loops_per_jiffy (lpj) 
value. This takes about 25 jiffies (1 jiffy = time between 2 timer 
interrupts).
In embedded systems, it can be about 250 ms!
You just need to measure this once! Find the lpj value in kernel 
boot messages (if you don't get it in the console, boot Linux with 
the loglevel=8 parameter). Example:
Calibrating using timer specific routine... 187.59 
BogoMIPS (lpj=937984)
At the next boots, start Linux with the below option:
lpj=<value>

9
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Faster rebooting (1)

kexec system call: executes a new kernel from a running one.
Must faster rebooting: doesn't go through bootstrap / bootloader 
code.
Great solution for rebooting after system (“firmware”) upgrades.
Useful for automatic rebooting after kernel panics.
See http://developer.osdl.org/andyp/kexec/whitepaper/kexec.pdf
and Documentation/kdump/kdump.txt in kernel sources.

10
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Faster rebooting (2)

Another option: use reboot=soft in the kernel command line
When you reboot, the firmware will be skipped.
Drawback: unlike kexec, cannot be chosen from userspace.
Supported platforms: i386, x86_64, arm, arm26 (Aug. 2006)
See Documentation/kernel­parameters.txt
in the kernel sources for details. Not supported on all platforms.

11
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Skip memory allocation

Idea: spare memory at boot time and manage it by yourself!
Assume you have 32 MB of RAM
Boot your kernel with mem=30
The kernel will just manage the first 30 MB of RAM.
Driver code can now reclaim the 2 MB left:
buf = ioremap (
0x1e00000,  /* Start: 30 MB */
0x200000  /* Size: 2 MB */
);
This saves time allocating memory.
Critical drivers are also sure to always have the RAM they need.

12
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Other ideas

Copy kernel from flash to RAM using DMA.
Reducing probe time on some IDE operations.
Compile drivers as modules for devices not used at boot 
time. This reduces time spent initializing drivers.
A smaller kernel is also faster to copy to RAM.
Multithreaded device probing.
See http://elinux.org/Boot_Time for more resources
See also Tim Bird's presentation on boot time reduction:
http://free­electrons.com/redir/tbird­elce2008.html

13
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Increasing speed
System startup time and application speed

14
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Starting system services

SysV init:
Starts services sequentially. Waits for the current startup script to 
be complete to start the next one! While dependencies exist, 
some tasks can be run in parallel!
Initng: http://initng.org
New alternative to SysV init, which can start services in parallel, 
as soon as their preconditions are met.

15
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Initng vs. SysV init: bootcharts

Initng wins!
System utilization is much 
better.

Note: you can hunt system startup trouble by using the Bootchart program
(http://www.bootchart.org/). Used to investigate Fedora booting time.

16
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Reading ahead

Linux keeps the contents of all the files it reads in RAM (in the 
page cache), as long as it doesn't need the RAM pages for 
something else.
Idea: load files (programs and libraries in particular) in RAM 
cache before using them. Best done when the system is not 
doing any I/O.
Thanks to this, programs are not stuck waiting for I/O.
Used the Knoppix distribution to achieve very nice boot speed­
ups.
Also planned to be used by Initng.
Not very useful for systems with very little RAM:
cached pages are recycled before the files are accessed.

17
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Implementing readahead

You can use the sys_readahead() system call
in your C programs. See man readahead for details.
You can also use the readahead­list utility, which reads a file 
containing the list of files to load in cache.
Available on: http://freshmeat.net/projects/readahead­list/.
In embedded systems using Busybox, you can use the 
readahead command (implemented by Free Electrons).

18
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Compiler speed optimizations

By default, most tools are compiled with compiler optimizations.
Make sure you use them for your own programs!
­O2 is the most common optimization switch of gcc.
Lots of optimization techniques are available.
See http://en.wikipedia.org/wiki/Compiler_optimization
­O3 can be also be used for speed critical executables.
However, there is done at the expense of code size (for example 
“inlining”:  replacing function calls by the function code itself).

19
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Using processor acceleration instructions

liboil ­ http://liboil.freedesktop.org/
Library of functions optimized for special instructions
from several processors (Altivec, MMX, SSE, etc.)
Mainly functions implementing loops on data arrays:
type conversion, copying, simple arithmetics, direct cosine 
transform, random number generation...
Transparent: keeps your application portable!
So far mainly supports desktop processors
License: BSD type

20
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Prelinking (1)

Applies to executables using shared libraries
To load and start an executable, the dynamic linker has a 
significant amount of work to do (mainly address relocation)
It can take a lot of time for executables using many shared 
libraries!
In many systems in which executables and shared libraries never 
change, the same job is done every time the executable is 
started.

21
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Prelinking (2)

prelink
http://people.redhat.com/jakub/prelink/
prelink modifies executables and shared libraries to simplify 
the dynamic linker relocation work.
This can greatly reduce startup time for big applications (50% 
less for KDE!). This also saves memory consumed by 
relocations.
Can be used to reduce the startup time of a Linux system.
Just needs to be run again when libraries or executables are 
updated.
Details on http://elinux.org/Pre_Linking

22
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Use simpler Unix executables

Big, feature rich executables take time to load.
Particularly true for shell scripts calling the bash shell!
Idea: replace standard Unix / GNU executables by lightweight, simplified 
implementations by busybox (http://busybox.net).
Implemented by Ubuntu 6.10 to reduce boot time, replacing bash (649 K) 
by dash (79 K, see http://en.wikipedia.org/wiki/Debian_Almquist_shell). 
This broke various shell scripts which used bash specific features 
(“bashisms”). 
In non­embedded Linux systems
where feature­rich executables are still needed,
should at least use busybox ash for system scripts. 

23
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Shells: reducing forking

fork / exec system calls are very heavy.
Because of this, calls to executables from shells are slow.
Even executing echo in busybox shells results in a fork syscall!
Select Shells ­> Standalone shell in busybox 
configuration to make the busybox shell call applets whenever 
possible.
Pipes and back­quotes are also implemented by fork / exec.
You can reduce their usage in scripts. Example:
cat /proc/cpuinfo | grep model
Replace it with: grep model /proc/cpuinfo
See http://elinux.org/Optimize_RC_Scripts

24
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Use faster filesystems

Run faster by using the most appropriate filesystems! 
Compressed read­only filesystem (block device):
use SquashFS (http://squashfs.sourceforge.net)
instead of CramFS (much slower, getting obsolete).
NAND flash storage: you should try UBIFS
(http://www.linux­mtd.infradead.org/doc/ubifs.html), the 
successor of JFFS2. It is much faster. You could also use 
SquashFS. See our Choosing filesystems presentation
(http://free­electrons.com/docs/filesystems).

25
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Use faster filesystems (2)

Use RAM filesystems for temporary, speed critical files 
with no need for permanent storage. Details in the kernel 
sources: Documentation/filesystems/tmpfs.txt
Benchmark your system and application on competing 
filesystems! Reiser4 is more innovative and benchmarks 
found it faster than ext3.
Good to benchmark your system with JFS or XFS too. 
XFS is reported to be the fastest to mount (good for 
startup time), and JFS to have the lowest CPU utilization.
See http://www.debian­administration.org/articles/388
ext4 is also ready to be used now.

26
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Speed up applications with tmpfs

When enough RAM is available, the OS keeps recently accessed files and 
applications in RAM (page cache). This significantly speeds up any new usage. 
However, depending on system activity, this may not last long. 
For programs that need fast startup even if they haven't been run for a long time: 
copy them to a tmpfs filesystem at system startup! This makes sure they are 
always accessed from the file cache in RAM (provided you do not have a swap 
partition).
See Documentation/filesystems/tmpfs.txt in kernel sources for details about 
tmpfs.
Caution: don't use ramdisks instead!
Ramdisks duplicate files in RAM and unused space cannot be reclaimed.
Caution: use with care. May impact overall performance.
Not needed if there's enough RAM to cache all files and programs.

27
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Boot from a hibernate image

The ultimate technique for instant boot!
In development: start the system, required applications and the 
user interface. Hibernate the system to disk / flash in this state.
In production: boot the kernel and restore the system state from 
with this predefined hibernation image.
This way, you don't have to initialize the programs one by one. 
You just get the back to a valid state.
Used in Sony cameras to achieve instant power on time.
Unlike Suspend to RAM, still allows to remove batteries!

28
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Use a profiler

Using a profiler can help to identify unexpected behavior degrading 
application performance.
For example, a profiler can tell you in which functions most of the 
time is spent.
Possible to start with strace and ltrace
Advanced profiling with Valgrind: http://valgrind.org/
Compile your application for x86 architecture
You can then profile it with the whole Valgrind toolsuite:
Cachegrind: sources of cache misses and function statistics.
Massif: sources of memory allocation. 
See our Software Development presentation for details:
http://free­electrons.com/docs/swdev/
29
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Reducing size
Kernel size and RAM usage

30
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Linux­Tiny

Goal: reduce the disk footprint and RAM size of the Linux kernel
http://elinux.org/Linux_Tiny
Set of patches against the mainstream Linux kernel.
Mergeability in mainstream is a priority.
Many changes have already been merged in recent kernels.
All features can be selected in kernel configuration 
(CONFIG_EMBEDDED).
Also ships utilities or patches for tracking sources
of memory usage or code size.

31
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Linux­Tiny ideas (1)

Remove kernel messages (printk, BUG, panic...)
Hunt excess inlining (speed vs. size tradeoff)
2.6.26: can allow gcc to uninline functions marked as inline:
(CONFIG_OPTIMIZE_INLINING=y). Only used by x86 so far. 
Hunt excess memory allocations
Memory (slob instead of slab) allocator more space efficient for 
small systems.
Reduce the size of kernel data structures (may impact 
performance)
Simpler alternative implementations of kernel functionalities 
with less features, or not supporting special cases.

32
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Linux­Tiny ideas (2)

Remove some features which may not be needed
in some systems.
Compiling optimizations for size.
A smaller kernel executable also saves RAM
(unless executed in place from storage).

33
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Linux­Tiny: kernel configuration screenshot

Many features
configured out

34
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
With and without CONFIG_EMBEDDED

Tests on Linux 2.6.29, on a minimalistic but working x86 kernel
1800

1600

1400

1200

1000 Raw
Compressed
800

600

400

200

0
CONFIG_EMBEDDED=n CONFIG_EMBEDDED=y

Raw: ­272 KB (­17%), Compressed: ­136 KB (­20%)
35
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Replace initrd by initramfs

Replace init ramdisks (initrd) with initramfs:
much less overhead and ram waste!
Access
to file Regular Ramdisk ramfs
Access Access
block device to file block device to file
Virtual File
System
Virtual File Virtual File
System File System File
Filesystem File
driver cache cache cache
Filesystem
driver Copy
Block
driver
Block
Copy
driver Block storage

Block storage
RAM RAM RAM

36
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
ramfs advantages over ramdisks

No block and filesystem overhead.
No duplication in RAM.
Files can be removed (reclaiming RAM) after use.
Initramfs: ramfs archive embedded in the Linux kernel file.

37
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Reducing size
Application size and RAM usage

38
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Static or dynamic linking? (1)

Static linking
All shared library code duplicated in the executables
Allows not to copy the C library in the filesystem.
Simpler and smaller when very few executables (busybox)
Library code duplication: bad for systems with more executables 
(code size and RAM)
Best for small systems (< 1­2 MB) with few executables!

39
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Static or dynamic linking? (2)

Dynamic linking
Shared library code not duplicated in the executables
Makes much smaller executables
Saves space in RAM (bigger executables take more RAM)
Requires the library to the copied to the filesystem
Best for medium to big systems (> 500 KB ­ 1 MB)

40
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Using a lighter C library

glibc (GNU C library): http://www.gnu.org/software/libc/
Found on most computer type GNU/Linux machines
Size on arm: approx 1.7 MB
uClibc: http://www.uclibc.org/
Found in more and more embedded Linux systems!
Size on arm: approx 400 KB (you save 1.2 MB!)
Executables are slightly smaller too:

C program Compiled with shared libraries Compiled statically


glibc uClibc glibc uClibc
Plain “hello world” 4.6 K 4.4 K 475 K 25 K
Busybox 245 K 231 K 843 K 311 K

41
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
How to use uClibc?

Need to compile all your executables with a uClibc toolchain.
Ready­to­use toolchains can be found on
http://free­electrons.com/community/tools/uclibc
You can very easily build your own with buildroot:
http://buildroot.uclibc.org/
You also have to copy the uClibc files from the toolchain to the 
/lib directory in the target root filesystem.
Ready­to­use filesystems can also be generated by buildroot.
You just need to add your specific stuff then.

42
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Need for stripping

Compiled executables and libraries contain extra information 
which can be used to investigate problems in a debugger.
This was useful for the tool developer, but not for the final user.
To remove debugging information, use the strip command.
This can save a very significant amount of space!
gcc ­o hello hello.c  (output size: 4635 bytes)
strip hello  (output size: 2852 bytes, ­38.5%)
Don't forget to strip libraries too!

43
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Are my executables stripped?

You can use the file command to get the answer
gcc ­o hello hello.c
file hello
hello: ELF 32­bit LSB executable, Intel 80386, version 1 
(SYSV), for GNU/Linux 2.2.5, dynamically linked (uses 
shared libs), not stripped
strip hello
hello: ELF 32­bit LSB executable, Intel 80386, version 1 
(SYSV), for GNU/Linux 2.2.5, dynamically linked (uses 
shared libs), stripped
You can use findstrip (http://packages.debian.org/stable/source/perforate)
to find all executables and libraries that need stripping in your system.

44
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
How to strip

Some lightweight tools, like busybox, are automatically stripped 
when you build them.
Makefiles for many standard tools offer a special command:
make install­strip
Caution: stripping is architecture dependent.
Use the strip command from your cross­compiling toolchain:
arm­linux­strip potato

45
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
sstrip: “super strip”

http://muppetlabs.com/~breadbox/software/elfkickers.html
Goes beyond strip and can strip out a few more bits that are 
not used by Linux to start an executable.
Can be used on libraries too. Minor limitation: processed 
libraries can no longer be used to compile new executables.
Can also be found in toolchains made by Buildroot (optional)

Regular
Hello World
4691 B
Busybox
287783 B
Inkscape
11397 KB
Best for tiny
stripped 2904 B (-38 %) 230408 B (-19.9 %) 9467 KB (-16.9 %) executables!
sstripped 1392 B (-70 %) 229701 B (-20.2 %) 9436 KB (-17.2 %)

46
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Library Optimizer

http://libraryopt.sourceforge.net/
Contributed by MontaVista
Examines the complete target file system, resolves all shared 
library symbol references, and rebuilds the shared libraries with 
only the object files required to satisfy the symbol references.
Can also take care of stripping executables and libraries.
However, requires to rebuild all the components from source. 
Would be nicer to achieve this only with ELF manipulations.

47
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Compiler space optimizations

Regular compiler optimizations simplifying code also reduce size
You can also reduce the size of executables by asking gcc to 
optimize generated code size:
gcc ­Os ­o husband husband.c
­Os corresponds to ­O2 optimizations except the ones increasing 
size, plus extra size­specific ones. 
­Os is already used by default to build busybox.
Possible to further reduce the size by compiling and optimizing all 
sources at once, with the ­fwhole­program ­­combine gcc 
options.
See http://gcc.gnu.org/onlinedocs/gcc/Optimize­Options.html
for all gcc optimization options.
48
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Simple gcc optimization benchmark

Executable size
250000

200000

None
150000 O2 (generic)
O3 (speed)
Os (size)
100000

50000

0
Busybox Dropbear

49
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Restartable applications

When RAM is scarce,  can be useful to abort applications that are 
not in use (for example hidden graphical interfaces).
Better to do it before the Linux Kernel OOM
(Out Of Memory) killer comes and makes bad decisions.
You can use the “Linux Checkpoint / Restart” project to have the 
Linux kernel save the state of a running application so that it can 
later resume its execution from the time at which it was 
checkpointed.
See http://www.linux­cr.org/ for details.

50
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Compressing filesystems

Can significantly increase your storage capacity
MTD (flash or ROM) storage: use UBIFS
or JFFS2 for small partitions.
Block storage: use SquashFS (http://squashfs.sourceforge.net) 
instead of CramFS for read­only partitions. It compresses much 
better and is much faster too.

51
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Merging duplicate files

Software compiling and installing often create duplicate files...
Check that your root filesystem doesn’t contain any!
dupmerge2: http://sourceforge.net/projects/dupmerge
Replaces duplicate files by hard links.
clink: http://free­electrons.com/community/tools/utils/clink
Replaces duplicate files by symbolic links.
Example: saves 4% of total space in Fedora Core 5.
finddup: http://www.shelldorado.com/scripts/cmds/finddup
Finds duplicate files.

52
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Reducing power consumption

53
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Tickless kernel

Kernel configuration: NO_HZ setting in Processor type and features
To implement multitasking, the processor receives a timer interrupt
at a given frequency (every 4 ms by default on Linux 2.6). On idle systems, 
this wakes up the processor all the time, just to realize there is nothing to do!
Idea: when all processors are idle, disable the timer interrupt, and re­enable it 
when something happens (a real interrupt). This saves power in laptops, in 
embedded systems and with virtual servers!
2.6.24: supports x86, arm, mips and powerpc

54
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
PowerTOP

http://www.lesswatts.org/projects/powertop/
A very nice utility showing the top 10 sources of power consumption.
Requirements: a tickless kernel (> 2.6.21), and a “mobile” (x86) CPU.
Best run on laptops running on battery (to estimate battery savings).
PowerTOP measures the number of wake­ups,
and counts the time spent in low­power modes.
It detects issues in both kernel space (drivers) and user space.
It already uncovered several bugs in today's distributions.
Embedded systems: non Intel processors probably not supported yet.
You can still run your apps on a PC to check their behavior.
See also http://www.lesswatts.org for other useful resources.

55
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
PowerTOP in action

56
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
cpufreq

Configuration: CPU_FREQ in Power management options
Allows to change the CPU frequency on the fly
Supported architectures (2.6.20):
i386, sh, ia64, sparc64, x86_64, powerpc, arm (i.MX only).
Usually controlled from userspace through /sys by a user 
configurable governor process, according to CPU load, heat, battery 
status... The most common is cpuspeed: 
http://carlthompson.net/software/cpuspeed/
Saves a significant amount of battery life in notebooks.

57
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Suspend hidden GUIs

Idea: suspend hidden user interfaces to save CPU and power.
Send a suspend (stop) signal:
kill ­SIGTSTP <pid>
Send a continue signal:
kill ­SIGCONT <pid>

58
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Software suspend

http://www.suspend2.net/
Lots of great features for notebook users, such as RAM suspend 
or hibernate to disk.
Unfortunately, restricted on some Intel compatible processors 
and targeting only machines with APM or ACPI (rarely found in 
non PC embedded systems!).
Not addressing the requirements of embedded systems (support 
for other CPUs, voltage reduction...).

59
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Embedded Linux Optimizations

Global perspective
Cost and combined optimization effects

60
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Combined benefits

Speed increase RAM reduction Power reduction Cost reduction


More speed ­ CPU can run slower or stay longer ­ Slower, cheaper
in power saving mode CPU

Less RAM ­ Faster allocations ­ Fewer / smaller RAM chips: less ­ Fewer / cheaper


­ Less swapping dynamic and standby power. RAM chips
­ Sometimes less ­ CPU with less cache: less power ­ CPU with less
cache flushing cache: cheaper

Less space ­ Faster application ­ Less RAM usage ­ Fewer / smaller storage chips: less ­ Fewer / cheaper


loading from storage power storage
and in RAM.
­ Sometimes, simpler,
faster code.

Less power ­ Cheaper batteries
­ or cheaper AC/DC
converter

61
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
The ultimate optimization tool!

We have seen many ways to optimize
an existing system.
However, nothing replaces a good design!
So, first carefully design and implement
your system and applications with their requirements
in mind.
Then, use the optimization techniques to further improve 
your system and the parts that you reused (kernel and 
applications).

62
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Related documents

All our technical presentations
on http://free­electrons.com/docs

Linux kernel
Device drivers
Architecture specifics
Embedded Linux system development

Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
How to help

You can help us to improve and maintain this document...
By sending corrections, suggestions, contributions and 
translations
By asking your organization to order development, consulting 
and training services performed by the authors of these 
documents (see http://free­electrons.com/).
By sharing this document with your friends, colleagues
and with the local Free Software community.
By adding links on your website to our on­line materials,
to increase their visibility in search engine results.

Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free­electrons.com
Linux kernel
Linux device drivers
Free Electrons
Board support code Our services
Mainstreaming kernel code
Kernel debugging
Custom Development
System integration
Embedded Linux Training
Embedded Linux demos and prototypes
All materials released with a free license! System optimization
Unix and GNU/Linux basics Application and interface development
Linux kernel and drivers development
Real­time Linux, uClinux Consulting and technical support
Development and profiling tools Help in decision making
Lightweight tools for embedded systems System architecture
Root filesystem creation System design and performance review
Audio and multimedia Development tool and application support
System optimization Investigating issues and fixing tool bugs

You might also like