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