Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Han Han <hhan@redhat.com>
3.0 KiB
Systemtap of Libvirt
Systemtap is a scripting language and tool for dynamically probing or tracing in Linux kernel space or user space. This page is about the usage of systemtap in libvirt tracing.
Preparation
Libvirt
Libvirt should be configured with the systemtap option to support libvirt probing events in systemtap.
For libvirt before 6.7.0, it can be configured by:
mkdir build
cd build
../configure --with-dtrace
For libvirt 6.7.0 or later, configure it by the
meson
(seeing libvirt compiling):
meson build -Ddtrace=enabled
For the libvirt binaries installed by the package manager like
dnf
or apt
, if libvirt systemtap tapset
/usr/share/systemtap/tapset/libvirt_*
exists, it means the
libvirt enables the systemtap feature.
Systemtap
For most of linux distributions, execute stap-prep
by
root to prepare the environment for systemtap after installing the
systemtap. If your distribution doesn't have stap-prep
,
install the kernel debuginfo
packages manually.
After these above, run this test command to confirm the systemtap works well:
stap -e 'probe oneshot{ printf("hello world\n")}'
Tracing events
The libvirt systemtap tracing events are defined in tapset
/usr/share/systemtap/tapset/libvirt_*
. Libvirt support
these type of tracing events: dbus
,
event_glib
, object
, qemu
,
rpc
.
List all tracing events in libvirt:
grep 'probe libvirt.[a-z_0-9.]*' /usr/share/systemtap/tapset/libvirt_* -o|cut -f 2 -d :
Tracing examples
Here is an example of the systemtap script to trace the QMP messages
sent from libvirtd daemon to the qemu process. qmp.stp
:
probe begin
{
printf("Start tracing\n")
}
probe libvirt.qemu.monitor_send_msg
{
printf("QMPs: %s", msg);
}
Then run the systemtap script attaching to the libvirtd process:
stap qmp.stp -x `pidof libvirtd`
To trace a libvirtd started from command line, use the option
-c
stap qmp.stp -c "/usr/sbin/libvirtd"
Then after seeing the welcome message "Start tracing" from systemtap,
then execute a virsh command associated with QMP, for example
virsh domstats
. Then get the QMP tracing logs from
systemtap. For example, the result from virsh domstats
QMPs: {"execute":"query-balloon","id":"libvirt-393"}
QMPs: {"execute":"qom-get","arguments":{"path":"/machine/peripheral/balloon0","property":"guest-stats"},"id":"libvirt-394"}
QMPs: {"execute":"query-blockstats","id":"libvirt-395"}
QMPs: {"execute":"query-named-block-nodes","id":"libvirt-396"}
QMPs: {"execute":"query-iothreads","id":"libvirt-397"}
For more examples of libvirt systemtap scripts, see the scripts in
/usr/share/doc/libvirt-docs/examples/systemtap
For more
details of systemtap language, see document of
systemtap