[FE training-materials-updates] Boot time slides: detail kernel boot time analysis

Michael Opdenacker michael.opdenacker at free-electrons.com
Tue Dec 31 08:03:03 CET 2013


Repository : git://git.free-electrons.com/training-materials.git

On branch  : master
Link       : http://git.free-electrons.com/training-materials/commit/?id=34e41c106f586f2f9727c3fdcf22cacd0bbef663

>---------------------------------------------------------------

commit 34e41c106f586f2f9727c3fdcf22cacd0bbef663
Author: Michael Opdenacker <michael.opdenacker at free-electrons.com>
Date:   Mon Dec 30 21:27:49 2013 +0100

    Boot time slides: detail kernel boot time analysis
    
    Signed-off-by: Michael Opdenacker <michael.opdenacker at free-electrons.com>


>---------------------------------------------------------------

34e41c106f586f2f9727c3fdcf22cacd0bbef663
 labs/boottime-kernel/boottime-kernel.tex           |    2 +-
 .../kernel => slides/boottime-kernel}/boot.png     |  Bin 48648 -> 48648 bytes
 slides/boottime-kernel/boottime-kernel.tex         |   66 ++++++++++++++++++--
 3 files changed, 63 insertions(+), 5 deletions(-)

diff --git a/labs/boottime-kernel/boottime-kernel.tex b/labs/boottime-kernel/boottime-kernel.tex
index f54ba23..094b045 100644
--- a/labs/boottime-kernel/boottime-kernel.tex
+++ b/labs/boottime-kernel/boottime-kernel.tex
@@ -106,7 +106,7 @@ inkscape boot.svg
 
 Now review the longuest initcalls in detail. Each label is the name of 
 a function in the kernel sources. Try to find out in which source file
-each function is defined.
+each function is defined
 \footnote{You can do it with utilities such as \code{cscope}, which your
 instructor will be happy to demonstrate, or through our on-line service
 to explore the Linux kernel sources:
diff --git a/lab-data/boottime/results/kernel/boot.png b/slides/boottime-kernel/boot.png
similarity index 100%
copy from lab-data/boottime/results/kernel/boot.png
copy to slides/boottime-kernel/boot.png
diff --git a/slides/boottime-kernel/boottime-kernel.tex b/slides/boottime-kernel/boottime-kernel.tex
index 4e1574c..4d6f099 100644
--- a/slides/boottime-kernel/boottime-kernel.tex
+++ b/slides/boottime-kernel/boottime-kernel.tex
@@ -2,8 +2,9 @@
 
 \begin{frame}[fragile]
 \frametitle{Measure - Kernel initialization functions}
-To understand which are the longest initializations, pass
-\code{initcall_debug} as an argument on your kernel command line.
+To find out which kernel initialization functions are the longest to
+execute, add \code{initcall_debug} to the kernel command line.
+Here's what you get on the kernel log:
 \begin{block}{}
 \tiny
 \begin{verbatim}
@@ -19,13 +20,70 @@ To understand which are the longest initializations, pass
 ...
 \end{verbatim}
 \end{block}
-It is probably a good idea to increase the log buffer with
+It is probably a good idea to increase the log buffer size with
 \code{CONFIG_LOG_BUF_SHIFT} in your kernel configuration. You will
 also need \code{CONFIG_PRINTK_TIME} and \code{CONFIG_KALLSYMS}.
 \end{frame}
 
 \begin{frame}
-\frametitle{Reducing the size}
+\frametitle{Kernel boot graph}
+With \code{initcall_debug}, you can generate a boot graph
+making it easy to see which kernel initialization functions
+take most time to execute.
+\begin{itemize}
+\item Copy and paste the console output or the output of
+      the \code{dmesg} command to a file (let's call it \code{boot.log})
+\item On your workstation, run the \code{scripts/bootgraph.pl} script
+      in the kernel sources: \\
+      \code{perl scripts/bootgraph.pl boot.log > boot.svg}
+\item You can now open the boot graph with a vector graphics 
+      editor such as \code{inkscape}:
+\end{itemize}
+\begin{center}
+    \includegraphics[width=\textwidth]{slides/boottime-kernel/boot.png}
+\end{center}
+\end{frame}
+
+\begin{frame}
+\frametitle{Using the kernel boot graph (1)}
+Start working on the functions consuming most time first. For each
+function:
+\begin{itemize}
+\item Look for its definition in the kernel source code. You can use LXR
+      (for example \url{http://lxr.free-electrons.com}).
+\item Remove unnecessary functionality:
+      \begin{itemize}
+      \item Look for kernel parameters in C sources and Makefiles, starting
+      with \code{_CONFIG}. Some settings for such parameters could help
+      to remove code complexity or remove unnecessary features. 
+      \item Find which module (if any) it belongs to. Loading this module
+            could be deferred.
+      \end{itemize}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Using the kernel boot graph (2)}
+\begin{itemize}
+\item Postpone:
+      \begin{itemize}
+      \item Find which module (if any) the function belongs to.
+            Load this module later if possible.
+      \end{itemize}
+\item Optimize necessary functionality:
+      \begin{itemize}
+      \item Look for parameters which could be used to reduce probe time,
+            looking for the \code{module_param} macro.
+      \item Look for delay loops and calls to functions containing
+            \code{delay} in their name, which could take more time than
+            needed. You could reduce such delays, and see whether the 
+            code still works or not.
+      \end{itemize}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Reduce kernel size}
 First, we focus on reducing the size without removing features
 \begin{itemize}
 	\item The main mechanism is to use kernel modules



More information about the training-materials-updates mailing list