On Sat, Dec 13, 2025 at 10:41 AM Lange Tang <[email protected]> wrote:
>
> At 2025-12-11 16:32:15, "Jason Wang" <[email protected]> wrote:
> >On Thu, Dec 11, 2025 at 10:52 AM Lange Tang <[email protected]> wrote:
> >>
> >> At 2025-12-10 17:04:04, "Michael S. Tsirkin" <[email protected]> wrote:
> >> >On Thu, Nov 27, 2025 at 11:24:00AM +0800, Longjun Tang wrote:
> >> >> From: Tang Longjun <[email protected]>
> >> >>
> >> >> hi,
> >> >> virtnet_mon is used to monitor the data packets of the virtio_net driver
> >> >> and the related parameters of virtqueue, useful for tracking its status
> >> >> and troubleshooting faults.
> >> >>
> >> >> pls review. tks
> >> >>
> >> >> Best regard.
> >> >
> >> >what does this achieve that direct use of tracing would not?
> >>
> >> I apologize that my explanation of virtnet_mon was not detailed enough.
> >> virtnet_mon uses kprobe and buffers to monitor virtio_net.
> >> To monitor virtio_net, it is necessary to track the member parameters of 
> >> the virtqueue corresponding to each data packet and output them.
> >> When PPS very high, other tracing techniques, such as ebpf, may not be 
> >> able to handle it, resulting in data loss because they do not have 
> >> sufficiently large buffers to batch export log data.
> >
> >Can you expand more about this? For example, in which kind of setup
> >and what do you want to trace and why ebpf can't handle that. Note
> >that the most lightweight stuff is the counter, have you tried that?
>
> For example, when there is occasional latency in data transmission between the
> virtual network frontend (virtio_net) and backend (such as vhost_net),
> we may need to track the time taken for each packet received and sent in the 
> virtio_net driver.
> Typically, we accomplish this using eBPF, such as bpftrace. The pseudocode 
> might include the following:
> """
> kprobe:skb_recv_done {
>         printf("%ld skb_recv_done Cpu:%d ...\n",...);
> }
> kprobe:skb_xmit_done {
>         printf("%ld skb_xmit_done Cpu:%d ...\n",...);
> }
> kprobe:virtnet_poll {
>         printf("%ld virtnet_poll Cpu:%d budget:%d ...\n",...);
> }
> kprobe:start_xmit {
>   ...
>   printf("%ld start_xmit Cpu:%d type:%s seq:%ld ...\n",...)
> }
> kprobe:gro_receive_skb {
>   ...
>   printf("%ld gro_receive_skb Cpu:%d type:%s seq:%ld ...\n",...)
> }
> kprobe:receive_buf {
>   ...
>   printf("%ld receive_buf Cpu:%d name:%s avali_idx:%d used_idx:%d ...\n",...);
> }
> """
> Using the above bpftrace code, we can track the timestamps of the data as it 
> passes through these functions,
> along with skb and virtqueue information, and output logs via printf for 
> further diagnosis of the causes of the latency.
> Interestingly, a significant amount of logs were found to be missing when 
> executing these bpftrace codes.
> Below is the testing environment:
> VM: 8G8C,virtio_net mq=4, kernel 6.18-rc7, iperf3 -s -p 1314
> HOST: iperf3 -c 192.168.122.218 -t 100 -p 1314 -P 4
> It was also found that when testing with mq=1, there was no log loss.
>
> Compared to mq=1, the reason for log loss at mq=4 is suspected to be due to 
> data being sent or received
> by different CPUs. Additionally, under the 4-thread iperf testing scenario 
> with PPS > 150,000,
> the log data is asynchronously output from different CPUs, leading to 
> excessive IO pressure that causes log data loss.

I think what I don't understand is how the things you introduced here
may help in this case?

Thanks

>
> The above are some of my personal thoughts, and I would love to hear your 
> opinion.
> Best regard.
>
> >
> >>
> >> As for the duplicate code, it is only to obtain the layout of the relevant 
> >> structure, and I have not yet thought of a way to avoid duplication. I 
> >> would love to hear your suggestions.
> >
> >Thanks
> >
> >>
> >> >
> >> >> Tang Longjun (7):
> >> >>   tools/virtio/virtnet_mon: create misc driver for virtnet_mon
> >> >>   tools/virtio/virtnet_mon: add kfifo to virtnet_mon
> >> >>   tools/virtio/virtnet_mon: add kprobe start_xmit
> >> >>   tools/virtio/virtnet_mon: add kprobe gro_receive_skb
> >> >>   tools/virtio/virtnet_mon: add kprobe ip_local_deliver
> >> >>   tools/virtio/virtnet_mon: add kprobe skb_xmit_done and skb_recv_done
> >> >>   tools/virtio/virtnet_mon: add README file for virtnet_moin
> >> >>
> >> >>  tools/virtio/virtnet_mon/Makefile      |   10 +
> >> >>  tools/virtio/virtnet_mon/README        |   35 +
> >> >>  tools/virtio/virtnet_mon/virtnet_mon.c | 1048 ++++++++++++++++++++++++
> >> >>  3 files changed, 1093 insertions(+)
> >> >>  create mode 100644 tools/virtio/virtnet_mon/Makefile
> >> >>  create mode 100644 tools/virtio/virtnet_mon/README
> >> >>  create mode 100644 tools/virtio/virtnet_mon/virtnet_mon.c
> >> >>
> >> >> --
> >> >> 2.43.0


Reply via email to