[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/27] migration: introduce 'userfaultfd-wrlat.py' script
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PULL 08/27] migration: introduce 'userfaultfd-wrlat.py' script |
Date: |
Mon, 8 Feb 2021 11:28:59 +0000 |
From: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
Add BCC/eBPF script to analyze userfaultfd write fault latency distribution.
Signed-off-by: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Message-Id: <20210129101407.103458-6-andrey.gruzdev@virtuozzo.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
scripts/userfaultfd-wrlat.py | 122 +++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
create mode 100755 scripts/userfaultfd-wrlat.py
diff --git a/scripts/userfaultfd-wrlat.py b/scripts/userfaultfd-wrlat.py
new file mode 100755
index 0000000000..0684be4e04
--- /dev/null
+++ b/scripts/userfaultfd-wrlat.py
@@ -0,0 +1,122 @@
+#!/usr/bin/python3
+#
+# userfaultfd-wrlat Summarize userfaultfd write fault latencies.
+# Events are continuously accumulated for the
+# run, while latency distribution histogram is
+# dumped each 'interval' seconds.
+#
+# For Linux, uses BCC, eBPF.
+#
+# USAGE: userfaultfd-lat [interval [count]]
+#
+# Copyright Virtuozzo GmbH, 2020
+#
+# Authors:
+# Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+from __future__ import print_function
+from bcc import BPF
+from ctypes import c_ushort, c_int, c_ulonglong
+from time import sleep
+from sys import argv
+
+def usage():
+ print("USAGE: %s [interval [count]]" % argv[0])
+ exit()
+
+# define BPF program
+bpf_text = """
+#include <uapi/linux/ptrace.h>
+#include <linux/mm.h>
+
+BPF_HASH(ev_start, u32, u64);
+BPF_HISTOGRAM(ev_delta_hist, u64);
+
+/* Trace UFFD page fault start event. */
+static void do_event_start()
+{
+ /* Using "(u32)" to drop group ID which is upper 32 bits */
+ u32 tid = (u32) bpf_get_current_pid_tgid();
+ u64 ts = bpf_ktime_get_ns();
+
+ ev_start.update(&tid, &ts);
+}
+
+/* Trace UFFD page fault end event. */
+static void do_event_end()
+{
+ /* Using "(u32)" to drop group ID which is upper 32 bits */
+ u32 tid = (u32) bpf_get_current_pid_tgid();
+ u64 ts = bpf_ktime_get_ns();
+ u64 *tsp;
+
+ tsp = ev_start.lookup(&tid);
+ if (tsp) {
+ u64 delta = ts - (*tsp);
+ /* Transform time delta to milliseconds */
+ ev_delta_hist.increment(bpf_log2l(delta / 1000000));
+ ev_start.delete(&tid);
+ }
+}
+
+/* KPROBE for handle_userfault(). */
+int probe_handle_userfault(struct pt_regs *ctx, struct vm_fault *vmf,
+ unsigned long reason)
+{
+ /* Trace only UFFD write faults. */
+ if (reason & VM_UFFD_WP) {
+ do_event_start();
+ }
+ return 0;
+}
+
+/* KRETPROBE for handle_userfault(). */
+int retprobe_handle_userfault(struct pt_regs *ctx)
+{
+ do_event_end();
+ return 0;
+}
+"""
+
+# arguments
+interval = 10
+count = -1
+if len(argv) > 1:
+ try:
+ interval = int(argv[1])
+ if interval == 0:
+ raise
+ if len(argv) > 2:
+ count = int(argv[2])
+ except: # also catches -h, --help
+ usage()
+
+# load BPF program
+b = BPF(text=bpf_text)
+# attach KRPOBEs
+b.attach_kprobe(event="handle_userfault", fn_name="probe_handle_userfault")
+b.attach_kretprobe(event="handle_userfault",
fn_name="retprobe_handle_userfault")
+
+# header
+print("Tracing UFFD-WP write fault latency... Hit Ctrl-C to end.")
+
+# output
+loop = 0
+do_exit = 0
+while (1):
+ if count > 0:
+ loop += 1
+ if loop > count:
+ exit()
+ try:
+ sleep(interval)
+ except KeyboardInterrupt:
+ pass; do_exit = 1
+
+ print()
+ b["ev_delta_hist"].print_log2_hist("msecs")
+ if do_exit:
+ exit()
--
2.29.2
- [PULL 01/27] spapr_pci: Fix memory leak of vmstate_spapr_pci, (continued)
- [PULL 01/27] spapr_pci: Fix memory leak of vmstate_spapr_pci, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 04/27] migration: introduce 'background-snapshot' migration capability, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 02/27] savevm: Fix memory leak of vmstate_configuration, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 06/27] migration: support UFFD write fault processing in ram_save_iterate(), Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 03/27] migration/qemu-file: Fix maybe uninitialized on qemu_get_buffer_in_place(), Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 05/27] migration: introduce UFFD-WP low-level interface helpers, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 10/27] migration: Clean up signed vs. unsigned XBZRLE cache-size, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 07/27] migration: implementation of background snapshot thread, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 11/27] migration: Fix cache_init()'s "Failed to allocate" error messages, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 09/27] migration: Fix migrate-set-parameters argument validation, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 08/27] migration: introduce 'userfaultfd-wrlat.py' script,
Dr. David Alan Gilbert (git) <=
- [PULL 12/27] migration: Fix a few absurdly defective error messages, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 13/27] migration: Add blocker information, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 17/27] migration: stop returning errno from load_snapshot(), Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 14/27] migration: Display the migration blockers, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 20/27] block: rename and alter bdrv_all_find_snapshot semantics, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 16/27] migration: Make save_snapshot() return bool, not 0/-1, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 18/27] block: add ability to specify list of blockdevs during snapshot, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 21/27] migration: control whether snapshots are ovewritten, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 25/27] iotests: fix loading of common.config from tests/ subdir, Dr. David Alan Gilbert (git), 2021/02/08
- [PULL 24/27] iotests: add support for capturing and matching QMP events, Dr. David Alan Gilbert (git), 2021/02/08