【问题标题】:KVM/Libvirt: How do i get total traffic used by KVM/libvirt Virtual machineKVM/Libvirt:如何获取 KVM/libvirt 虚拟机使用的总流量
【发布时间】:2017-09-20 15:22:43
【问题描述】:

我想获取 C(语言)中 kvm/libvirt VM 使用的总带宽。 libvirt 里面有没有这个功能?

因此,例如,如果 VM 超过 1TB,那么我将暂停其网络。

【问题讨论】:

    标签: libvirt


    【解决方案1】:

    在 libvirt XML 中,您需要查看元素以识别后端设备名称。例如

    <interface type='network'>
      <mac address='52:54:00:b4:fc:f2'/>
      <source network='default' bridge='virbr0'/>
      <target dev='vnet2'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    

    这里的后端是“vnet2”。一旦你有了它,你可以调用 C API virDomainInterfaceStats(或通过你选择的语言绑定)来获取 rx/tx 统计信息。以使用 virsh 工具为例:

    # virsh domifstat demo vnet2
    vnet2 rx_bytes 5040490379
    vnet2 rx_packets 3292604
    vnet2 rx_errs 0
    vnet2 rx_drop 0
    vnet2 tx_bytes 167286952
    vnet2 tx_packets 1859239
    vnet2 tx_errs 0
    vnet2 tx_drop 0
    

    【讨论】:

    • 嗨,rx_bytes 是否显示自创建 VM 以来使用的总数据,还是仅显示当前的带宽使用情况?
    • 自接口创建以来的累计。如果您想查看使用时间片,您必须调用一次 API,等待一段时间,再调用一次,然后计算值的变化并除以秒数。这给你字节/秒或数据包/秒
    【解决方案2】:

    当您启动 KVM 来宾时,主机系统会为来宾中的每个单独的网络接口创建一个 vnet 接口,例如 vnet3 vnet4。 之后,您可以通过轮询主机上的文件来监控这些接口的发送/接收量:

    cat /sys/class/net/vnet3/statistics/rx_bytes
    173110677
    cat /sys/class/net/vnet3/statistics/tx_bytes
    1640468389
    

    或者,您可以像本教程一样使用 fwmark 设置 iptables 规则:
    http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html
    并用 iptables 测量统计数据,但我想这在 C 语言中会很麻烦。

    【讨论】:

    • Libvirt API 中有什么函数可以做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多