xref: /aosp_15_r20/external/bcc/tools/old/gethostlatency.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python
2*387f9dfdSAndroid Build Coastguard Worker#
3*387f9dfdSAndroid Build Coastguard Worker# gethostlatency  Show latency for getaddrinfo/gethostbyname[2] calls.
4*387f9dfdSAndroid Build Coastguard Worker#                 For Linux, uses BCC, eBPF. Embedded C.
5*387f9dfdSAndroid Build Coastguard Worker#
6*387f9dfdSAndroid Build Coastguard Worker# This can be useful for identifying DNS latency, by identifying which
7*387f9dfdSAndroid Build Coastguard Worker# remote host name lookups were slow, and by how much.
8*387f9dfdSAndroid Build Coastguard Worker#
9*387f9dfdSAndroid Build Coastguard Worker# This uses dynamic tracing of user-level functions and registers, and may
10*387f9dfdSAndroid Build Coastguard Worker# need modifications to match your software and processor architecture.
11*387f9dfdSAndroid Build Coastguard Worker#
12*387f9dfdSAndroid Build Coastguard Worker# Copyright 2016 Netflix, Inc.
13*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
14*387f9dfdSAndroid Build Coastguard Worker#
15*387f9dfdSAndroid Build Coastguard Worker# 28-Jan-2016    Brendan Gregg   Created this.
16*387f9dfdSAndroid Build Coastguard Worker
17*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function
18*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
19*387f9dfdSAndroid Build Coastguard Workerfrom time import strftime
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Worker# load BPF program
22*387f9dfdSAndroid Build Coastguard Workerbpf_text = """
23*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
24*387f9dfdSAndroid Build Coastguard Worker
25*387f9dfdSAndroid Build Coastguard Workerstruct val_t {
26*387f9dfdSAndroid Build Coastguard Worker    char host[80];
27*387f9dfdSAndroid Build Coastguard Worker    u64 ts;
28*387f9dfdSAndroid Build Coastguard Worker};
29*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, u32, struct val_t);
30*387f9dfdSAndroid Build Coastguard Worker
31*387f9dfdSAndroid Build Coastguard Workerint do_entry(struct pt_regs *ctx) {
32*387f9dfdSAndroid Build Coastguard Worker    if (!ctx->di)
33*387f9dfdSAndroid Build Coastguard Worker        return 0;
34*387f9dfdSAndroid Build Coastguard Worker    struct val_t val = {};
35*387f9dfdSAndroid Build Coastguard Worker    u32 pid = bpf_get_current_pid_tgid();
36*387f9dfdSAndroid Build Coastguard Worker    bpf_probe_read(&val.host, sizeof(val.host), (void *)ctx->di);
37*387f9dfdSAndroid Build Coastguard Worker    val.ts = bpf_ktime_get_ns();
38*387f9dfdSAndroid Build Coastguard Worker    start.update(&pid, &val);
39*387f9dfdSAndroid Build Coastguard Worker    return 0;
40*387f9dfdSAndroid Build Coastguard Worker}
41*387f9dfdSAndroid Build Coastguard Worker
42*387f9dfdSAndroid Build Coastguard Workerint do_return(struct pt_regs *ctx) {
43*387f9dfdSAndroid Build Coastguard Worker    struct val_t *valp;
44*387f9dfdSAndroid Build Coastguard Worker    u64 delta;
45*387f9dfdSAndroid Build Coastguard Worker    u32 pid = bpf_get_current_pid_tgid();
46*387f9dfdSAndroid Build Coastguard Worker
47*387f9dfdSAndroid Build Coastguard Worker    valp = start.lookup(&pid);
48*387f9dfdSAndroid Build Coastguard Worker    if (valp == 0)
49*387f9dfdSAndroid Build Coastguard Worker        return 0;       // missed start
50*387f9dfdSAndroid Build Coastguard Worker
51*387f9dfdSAndroid Build Coastguard Worker    delta = (bpf_ktime_get_ns() - valp->ts) / 1000;
52*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("%d %s\\n", delta, valp->host);
53*387f9dfdSAndroid Build Coastguard Worker    start.delete(&pid);
54*387f9dfdSAndroid Build Coastguard Worker    return 0;
55*387f9dfdSAndroid Build Coastguard Worker}
56*387f9dfdSAndroid Build Coastguard Worker"""
57*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=bpf_text)
58*387f9dfdSAndroid Build Coastguard Workerb.attach_uprobe(name="c", sym="getaddrinfo", fn_name="do_entry")
59*387f9dfdSAndroid Build Coastguard Workerb.attach_uprobe(name="c", sym="gethostbyname", fn_name="do_entry")
60*387f9dfdSAndroid Build Coastguard Workerb.attach_uprobe(name="c", sym="gethostbyname2", fn_name="do_entry")
61*387f9dfdSAndroid Build Coastguard Workerb.attach_uretprobe(name="c", sym="getaddrinfo", fn_name="do_return")
62*387f9dfdSAndroid Build Coastguard Workerb.attach_uretprobe(name="c", sym="gethostbyname", fn_name="do_return")
63*387f9dfdSAndroid Build Coastguard Workerb.attach_uretprobe(name="c", sym="gethostbyname2", fn_name="do_return")
64*387f9dfdSAndroid Build Coastguard Worker
65*387f9dfdSAndroid Build Coastguard Worker# header
66*387f9dfdSAndroid Build Coastguard Workerprint("%-9s %-6s %-12s %6s %s" % ("TIME", "PID", "COMM", "LATms", "HOST"))
67*387f9dfdSAndroid Build Coastguard Worker
68*387f9dfdSAndroid Build Coastguard Worker# format output
69*387f9dfdSAndroid Build Coastguard Workerwhile 1:
70*387f9dfdSAndroid Build Coastguard Worker    try:
71*387f9dfdSAndroid Build Coastguard Worker        (task, pid, cpu, flags, ts, msg) = b.trace_fields()
72*387f9dfdSAndroid Build Coastguard Worker    except ValueError:
73*387f9dfdSAndroid Build Coastguard Worker        continue
74*387f9dfdSAndroid Build Coastguard Worker    (delta, host) = msg.split(" ")
75*387f9dfdSAndroid Build Coastguard Worker    deltams = int(delta) / 1000
76*387f9dfdSAndroid Build Coastguard Worker    print("%-9s %-6d %-12.12s %6.2f %s" % (strftime("%H:%M:%S"), pid, task,
77*387f9dfdSAndroid Build Coastguard Worker        deltams, host))
78