mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2024-12-21 22:50:03 +00:00
8fb3af8d05
enable bootchartd to use kernel process accounting for noticing all processes. also fix various little bits around the initramfs init.
199 lines
4.5 KiB
Bash
Executable File
199 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Bootchart logger script
|
|
# Ziga Mahkovec <ziga.mahkovec@klika.si>
|
|
#
|
|
# Modified heavily for Alpine Linux bootcharting
|
|
# Timo Teras <timo.teras@iki.fi>
|
|
#
|
|
# This script is used for data collection for the bootchart
|
|
# boot performance visualization tool (http://www.bootchart.org).
|
|
#
|
|
# This script is tied to Alpine Init scripts and charts the
|
|
# bootup procedure only.
|
|
#
|
|
|
|
PATH="/sbin:/bin:/usr/sbin:/usr/bin:$PATH"
|
|
|
|
# Configuration for bootchartd, the bootchart logger script.
|
|
TMPFS_SIZE=32m
|
|
SAMPLE_PERIOD=0.2
|
|
PROCESS_ACCOUNTING="yes"
|
|
BOOTLOG_DEST=/var/log/bootchart.tgz
|
|
LOGDIR=/bootchart
|
|
EXIT_PROC="mingetty agetty rungetty getty fgetty"
|
|
|
|
# Monitoring commands
|
|
log_cmd_1="cat /proc/stat"
|
|
log_target_1=proc_stat.log
|
|
|
|
# /proc/diskstats is available in 2.6 kernels
|
|
log_cmd_2="cat /proc/diskstats"
|
|
log_target_2=proc_diskstats.log
|
|
|
|
log_cmd_3="cat /proc/[1-9]*/stat 2>/dev/null"
|
|
log_target_3=proc_ps.log
|
|
|
|
# Uncomment this line for diskless stations
|
|
#log_cmd_4="cat /proc/net/dev"
|
|
#log_target_4=proc_netdev.log
|
|
|
|
max_log=3
|
|
|
|
do_logging()
|
|
{
|
|
# Enable process accounting if configured
|
|
if [ "$PROCESS_ACCOUNTING" = "yes" ]; then
|
|
[ -e kernel_pacct ] || : > kernel_pacct
|
|
accton kernel_pacct
|
|
fi
|
|
|
|
# open file descriptors
|
|
i=1
|
|
while [ $i -le $max_log ]; do
|
|
eval target=\"\$log_target_$i\"
|
|
if [ -z "$target" ]; then
|
|
max_log=$i
|
|
break
|
|
fi
|
|
|
|
fd=$((2 + $i))
|
|
eval exec $fd'>>$target'
|
|
eval log_fd_$i=$fd
|
|
i=$(($i + 1))
|
|
done
|
|
|
|
not_stop_logging=true
|
|
while $not_stop_logging && \
|
|
{ ! pidof $EXIT_PROC >/dev/null; }; do
|
|
if [ -r /proc/uptime ]; then
|
|
# Write the time (in jiffies).
|
|
read uptime < /proc/uptime
|
|
uptime=${uptime%% [0-9]*}
|
|
uptime=${uptime%.*}${uptime#*.}
|
|
|
|
i=1
|
|
while [ $i -le $max_log ]; do
|
|
eval fd=\$log_fd_$i\; cmd=\$log_cmd_$i
|
|
|
|
{
|
|
echo $uptime
|
|
# Log the command output
|
|
eval $cmd
|
|
echo
|
|
} >&$fd
|
|
i=$(($i + 1))
|
|
done
|
|
fi
|
|
|
|
sleep $SAMPLE_PERIOD
|
|
done
|
|
|
|
# close file descriptors
|
|
i=1
|
|
while [ $i -le $max_log ]; do
|
|
eval fd=\$log_fd_$i
|
|
eval exec $fd'>&-'
|
|
i=$(($i + 1))
|
|
done
|
|
|
|
[ -e kernel_pacct ] && accton
|
|
}
|
|
|
|
# Stop the boot logger. The lock file is removed to force the loggers in
|
|
# background to exit. Some final log files are created and then all log files
|
|
# from the tmpfs are packaged and stored in $BOOTLOG_DEST.
|
|
finalize()
|
|
{
|
|
# Stop process accounting if configured
|
|
local pacct=
|
|
[ -e kernel_pacct ] && pacct=kernel_pacct
|
|
|
|
# Write system information
|
|
# Log some basic information about the system.
|
|
(
|
|
echo "version = $VERSION"
|
|
echo "title = Boot chart for $( hostname | sed q ) ($( date ))"
|
|
echo "system.uname = $( uname -srvm | sed q )"
|
|
if [ -f /etc/alpine-release ]; then
|
|
echo "system.release = $( sed q /etc/alpine-release )"
|
|
elif [ -f /etc/gentoo-release ]; then
|
|
echo "system.release = $( sed q /etc/gentoo-release )"
|
|
elif [ -f /etc/SuSE-release ]; then
|
|
echo "system.release = $( sed q /etc/SuSE-release )"
|
|
elif [ -f /etc/debian_version ]; then
|
|
echo "system.release = Debian GNU/$( uname -s ) $( cat /etc/debian_version )"
|
|
elif [ -f /etc/frugalware-release ]; then
|
|
echo "system.release = $( sed q /etc/frugalware-release )"
|
|
elif [ -f /etc/pardus-release ]; then
|
|
echo "system.release = $( sed q /etc/pardus-release )"
|
|
else
|
|
echo "system.release = $( sed 's/\\.//g;q' /etc/issue )"
|
|
fi
|
|
|
|
# Get CPU count
|
|
local cpucount=$(grep -c '^processor' /proc/cpuinfo)
|
|
if [ $cpucount -gt 1 -a -n "$(grep 'sibling.*2' /proc/cpuinfo)" ]; then
|
|
# Hyper-Threading enabled
|
|
cpucount=$(( $cpucount / 2 ))
|
|
fi
|
|
if grep -q '^model name' /proc/cpuinfo; then
|
|
echo "system.cpu = $( grep '^model name' /proc/cpuinfo | sed q )"\
|
|
"($cpucount)"
|
|
else
|
|
echo "system.cpu = $( grep '^cpu' /proc/cpuinfo | sed q )"\
|
|
"($cpucount)"
|
|
fi
|
|
|
|
echo "system.kernel.options = $( sed q /proc/cmdline )"
|
|
) >> header
|
|
|
|
# Package log files
|
|
tar -zcf "$BOOTLOG_DEST" header $pacct *.log
|
|
rm "$LOGDIR"/*
|
|
rmdir "$LOGDIR"
|
|
}
|
|
|
|
case "$1" in
|
|
start-initfs)
|
|
NEWROOT="$2"
|
|
(
|
|
cleanup=true
|
|
trap "not_stop_logging=false" USR1
|
|
trap "cleanup=false; not_stop_logging=false" USR2
|
|
|
|
mkdir "$LOGDIR"
|
|
cd "$LOGDIR"
|
|
do_logging
|
|
if $cleanup; then
|
|
sleep $SAMPLE_PERIOD
|
|
finalize
|
|
fi
|
|
) &
|
|
echo $! > $LOGDIR/bootchart.pid
|
|
;;
|
|
stop-initfs)
|
|
NEWROOT="$2"
|
|
|
|
cd "$LOGDIR"
|
|
mkdir "$NEWROOT$LOGDIR"
|
|
cp /sbin/bootchartd $NEWROOT/sbin
|
|
PID=`cat bootchart.pid`
|
|
kill -USR2 $PID
|
|
wait $PID
|
|
mv * "$NEWROOT$LOGDIR"
|
|
;;
|
|
start-rootfs)
|
|
(
|
|
trap "not_stop_logging=false" USR1
|
|
cd "$LOGDIR"
|
|
do_logging
|
|
finalize
|
|
) &
|
|
shift
|
|
exec "$@"
|
|
;;
|
|
esac
|
|
|
|
exit 0
|