[dpdk-dev] [RFC] Policy Based Power Control for Guest

David Hunt david.hunt at intel.com
Fri Aug 4 15:54:37 CEST 2017


This RFC patchset adds the facility for a guest VM to send a policy down to
the host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

Firstly, two new API calls are added to the ethdev layer
1. One to convert a VF id to a PF id. In the patchset
   this id is a MAC address. This is needed so that the host can map the VFs
   in the profile to PF so in can monitor the traffic on the relevant PF at the
   host level.
2. The other function is to read the low-level traffic throughput on the NIC.
   Currently this API reads a NIC register for speed, but we are looking at
   using a more generic way to get these stats, suggestions welcome.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

P.S. I'm on vacation for the next couple of weeks, but it would be great to
have a few comments/suggestions in my inbox when I get back. :)

[01/10] net/i40e: add API to convert VF Id to PF Id
[02/10] net/i40e: add API to get received packet count
[03/10] lib/librte_power: add extra msg type for policies
[04/10] examples/vm_power_mgr: add vcpu to pcpu mapping
[05/10] examples/vm_power_mgr: add policy to channels
[06/10] examples/vm_power_mgr: add scale to medium freq fn
[07/10] examples/vm_power_mgr: add port initialisation
[08/10] examples/guest_cli: add send policy to host
[09/10] examples/vm_power_mgr: set MAC address of VF
[10/10] net/i40e: set register for no drop


More information about the dev mailing list