xref: /dpdk/doc/guides/sample_app_ug/vm_power_management.rst (revision 089e5ed727a15da2729cfee9b63533dd120bd04c)
1..  SPDX-License-Identifier: BSD-3-Clause
2    Copyright(c) 2010-2014 Intel Corporation.
3
4VM Power Management Application
5===============================
6
7Introduction
8------------
9
10Applications running in Virtual Environments have an abstract view of
11the underlying hardware on the Host, in particular applications cannot see
12the binding of virtual to physical hardware.
13When looking at CPU resourcing, the pinning of Virtual CPUs(vCPUs) to
14Host Physical CPUs(pCPUS) is not apparent to an application
15and this pinning may change over time.
16Furthermore, Operating Systems on virtual machines do not have the ability
17to govern their own power policy; the Machine Specific Registers (MSRs)
18for enabling P-State transitions are not exposed to Operating Systems
19running on Virtual Machines(VMs).
20
21The Virtual Machine Power Management solution shows an example of
22how a DPDK application can indicate its processing requirements using VM local
23only information(vCPU/lcore, etc.) to a Host based Monitor which is responsible
24for accepting requests for frequency changes for a vCPU, translating the vCPU
25to a pCPU via libvirt and affecting the change in frequency.
26
27The solution is comprised of two high-level components:
28
29#. Example Host Application
30
31   Using a Command Line Interface(CLI) for VM->Host communication channel management
32   allows adding channels to the Monitor, setting and querying the vCPU to pCPU pinning,
33   inspecting and manually changing the frequency for each CPU.
34   The CLI runs on a single lcore while the thread responsible for managing
35   VM requests runs on a second lcore.
36
37   VM requests arriving on a channel for frequency changes are passed
38   to the librte_power ACPI cpufreq sysfs based library.
39   The Host Application relies on both qemu-kvm and libvirt to function.
40
41   This monitoring application is responsible for:
42
43   - Accepting requests from client applications: Client applications can
44     request frequency changes for a vCPU, translating
45     the vCPU to a pCPU via libvirt and affecting the change in frequency.
46
47   - Accepting policies from client applications: Client application can
48     send a policy to the host application. The
49     host application will then apply the rules of the policy independent
50     of the application. For example, the policy can contain time-of-day
51     information for busy/quiet periods, and the host application can scale
52     up/down the relevant cores when required. See the details of the guest
53     application below for more information on setting the policy values.
54
55   - Out-of-band monitoring of workloads via cores hardware event counters:
56     The host application can manage power for an application in a virtualised
57     OR non-virtualised environment by looking at the event counters of the
58     cores and taking action based on the branch hit/miss ratio. See the host
59     application '--core-list' command line parameter below.
60
61#. librte_power for Virtual Machines
62
63   Using an alternate implementation for the librte_power API, requests for
64   frequency changes are forwarded to the host monitor rather than
65   the APCI cpufreq sysfs interface used on the host.
66
67   The l3fwd-power application will use this implementation when deployed on a VM
68   (see :doc:`l3_forward_power_man`).
69
70.. _figure_vm_power_mgr_highlevel:
71
72.. figure:: img/vm_power_mgr_highlevel.*
73
74   Highlevel Solution
75
76
77Overview
78--------
79
80VM Power Management employs qemu-kvm to provide communications channels
81between the host and VMs in the form of Virtio-Serial which appears as
82a paravirtualized serial device on a VM and can be configured to use
83various backends on the host. For this example each Virtio-Serial endpoint
84on the host is configured as AF_UNIX file socket, supporting poll/select
85and epoll for event notification.
86In this example each channel endpoint on the host is monitored via
87epoll for EPOLLIN events.
88Each channel is specified as qemu-kvm arguments or as libvirt XML for each VM,
89where each VM can have a number of channels up to a maximum of 64 per VM,
90in this example each DPDK lcore on a VM has exclusive access to a channel.
91
92To enable frequency changes from within a VM, a request via the librte_power interface
93is forwarded via Virtio-Serial to the host, each request contains the vCPU
94and power command(scale up/down/min/max).
95The API for host and guest librte_power is consistent across environments,
96with the selection of VM or Host Implementation determined at automatically
97at runtime based on the environment.
98
99Upon receiving a request, the host translates the vCPU to a pCPU via
100the libvirt API before forwarding to the host librte_power.
101
102.. _figure_vm_power_mgr_vm_request_seq:
103
104.. figure:: img/vm_power_mgr_vm_request_seq.*
105
106   VM request to scale frequency
107
108
109Performance Considerations
110~~~~~~~~~~~~~~~~~~~~~~~~~~
111
112While Haswell Microarchitecture allows for independent power control for each core,
113earlier Microarchtectures do not offer such fine grained control.
114When deployed on pre-Haswell platforms greater care must be taken in selecting
115which cores are assigned to a VM, for instance a core will not scale down
116until its sibling is similarly scaled.
117
118Configuration
119-------------
120
121BIOS
122~~~~
123
124Enhanced Intel SpeedStep® Technology must be enabled in the platform BIOS
125if the power management feature of DPDK is to be used.
126Otherwise, the sys file folder /sys/devices/system/cpu/cpu0/cpufreq will not exist,
127and the CPU frequency-based power management cannot be used.
128Consult the relevant BIOS documentation to determine how these settings
129can be accessed.
130
131Host Operating System
132~~~~~~~~~~~~~~~~~~~~~
133
134The DPDK Power Library can use either the *acpi_cpufreq* or *intel_pstate*
135kernel driver for the management of core frequencies. In many cases
136the *intel_pstate* driver is the default Power Management environment.
137
138Should the *acpi-cpufreq* driver be required, the *intel_pstate* module must
139be disabled, and *apci_cpufreq* module loaded in its place.
140
141To disable *intel_pstate* driver, add the following to the grub Linux
142command line:
143
144.. code-block:: console
145
146  intel_pstate=disable
147
148Upon rebooting, load the *acpi_cpufreq* module:
149
150.. code-block:: console
151
152  modprobe acpi_cpufreq
153
154Hypervisor Channel Configuration
155~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
156
157Virtio-Serial channels are configured via libvirt XML:
158
159
160.. code-block:: xml
161
162  <name>{vm_name}</name>
163  <controller type='virtio-serial' index='0'>
164    <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
165  </controller>
166  <channel type='unix'>
167    <source mode='bind' path='/tmp/powermonitor/{vm_name}.{channel_num}'/>
168    <target type='virtio' name='virtio.serial.port.poweragent.{vm_channel_num}'/>
169    <address type='virtio-serial' controller='0' bus='0' port='{N}'/>
170  </channel>
171
172
173Where a single controller of type *virtio-serial* is created and up to 32 channels
174can be associated with a single controller and multiple controllers can be specified.
175The convention is to use the name of the VM in the host path *{vm_name}* and
176to increment *{channel_num}* for each channel, likewise the port value *{N}*
177must be incremented for each channel.
178
179Each channel on the host will appear in *path*, the directory */tmp/powermonitor/*
180must first be created and given qemu permissions
181
182.. code-block:: console
183
184  mkdir /tmp/powermonitor/
185  chown qemu:qemu /tmp/powermonitor
186
187Note that files and directories within /tmp are generally removed upon
188rebooting the host and the above steps may need to be carried out after each reboot.
189
190The serial device as it appears on a VM is configured with the *target* element attribute *name*
191and must be in the form of *virtio.serial.port.poweragent.{vm_channel_num}*,
192where *vm_channel_num* is typically the lcore channel to be used in DPDK VM applications.
193
194Each channel on a VM will be present at */dev/virtio-ports/virtio.serial.port.poweragent.{vm_channel_num}*
195
196Compiling and Running the Host Application
197------------------------------------------
198
199Compiling
200~~~~~~~~~
201
202For information on compiling DPDK and the sample applications
203see :doc:`compiling`.
204
205The application is located in the ``vm_power_manager`` sub-directory.
206
207To build just the ``vm_power_manager`` application using ``make``:
208
209.. code-block:: console
210
211  export RTE_SDK=/path/to/rte_sdk
212  export RTE_TARGET=build
213  cd ${RTE_SDK}/examples/vm_power_manager/
214  make
215
216The resulting binary will be ${RTE_SDK}/build/examples/vm_power_manager
217
218To build just the ``vm_power_manager`` application using ``meson/ninja``:
219
220.. code-block:: console
221
222  export RTE_SDK=/path/to/rte_sdk
223  cd ${RTE_SDK}
224  meson build
225  cd build
226  ninja
227  meson configure -Dexamples=vm_power_manager
228  ninja
229
230The resulting binary will be ${RTE_SDK}/build/examples/dpdk-vm_power_manager
231
232Running
233~~~~~~~
234
235The application does not have any specific command line options other than *EAL*:
236
237.. code-block:: console
238
239 ./build/vm_power_mgr [EAL options]
240
241The application requires exactly two cores to run, one core is dedicated to the CLI,
242while the other is dedicated to the channel endpoint monitor, for example to run
243on cores 0 & 1 on a system with 4 memory channels:
244
245.. code-block:: console
246
247 ./build/vm_power_mgr -l 0-1 -n 4
248
249After successful initialization the user is presented with VM Power Manager CLI:
250
251.. code-block:: console
252
253  vm_power>
254
255Virtual Machines can now be added to the VM Power Manager:
256
257.. code-block:: console
258
259  vm_power> add_vm {vm_name}
260
261When a {vm_name} is specified with the *add_vm* command a lookup is performed
262with libvirt to ensure that the VM exists, {vm_name} is used as an unique identifier
263to associate channels with a particular VM and for executing operations on a VM within the CLI.
264VMs do not have to be running in order to add them.
265
266A number of commands can be issued via the CLI in relation to VMs:
267
268  Remove a Virtual Machine identified by {vm_name} from the VM Power Manager.
269
270  .. code-block:: console
271
272    rm_vm {vm_name}
273
274  Add communication channels for the specified VM, the virtio channels must be enabled
275  in the VM configuration(qemu/libvirt) and the associated VM must be active.
276  {list} is a comma-separated list of channel numbers to add, using the keyword 'all'
277  will attempt to add all channels for the VM:
278
279  .. code-block:: console
280
281    add_channels {vm_name} {list}|all
282
283  Enable or disable the communication channels in {list}(comma-separated)
284  for the specified VM, alternatively list can be replaced with keyword 'all'.
285  Disabled channels will still receive packets on the host, however the commands
286  they specify will be ignored. Set status to 'enabled' to begin processing requests again:
287
288  .. code-block:: console
289
290    set_channel_status {vm_name} {list}|all enabled|disabled
291
292  Print to the CLI the information on the specified VM, the information
293  lists the number of vCPUS, the pinning to pCPU(s) as a bit mask, along with
294  any communication channels associated with each VM, along with the status of each channel:
295
296  .. code-block:: console
297
298    show_vm {vm_name}
299
300  Set the binding of Virtual CPU on VM with name {vm_name}  to the Physical CPU mask:
301
302  .. code-block:: console
303
304    set_pcpu_mask {vm_name} {vcpu} {pcpu}
305
306  Set the binding of Virtual CPU on VM to the Physical CPU:
307
308  .. code-block:: console
309
310    set_pcpu {vm_name} {vcpu} {pcpu}
311
312Manual control and inspection can also be carried in relation CPU frequency scaling:
313
314  Get the current frequency for each core specified in the mask:
315
316  .. code-block:: console
317
318    show_cpu_freq_mask {mask}
319
320  Set the current frequency for the cores specified in {core_mask} by scaling each up/down/min/max:
321
322  .. code-block:: console
323
324    set_cpu_freq {core_mask} up|down|min|max
325
326  Get the current frequency for the specified core:
327
328  .. code-block:: console
329
330    show_cpu_freq {core_num}
331
332  Set the current frequency for the specified core by scaling up/down/min/max:
333
334  .. code-block:: console
335
336    set_cpu_freq {core_num} up|down|min|max
337
338There are also some command line parameters for enabling the out-of-band
339monitoring of branch ratio on cores doing busy polling via PMDs.
340
341  .. code-block:: console
342
343    --core-list {list of cores}
344
345  When this parameter is used, the list of cores specified will monitor the ratio
346  between branch hits and branch misses. A tightly polling PMD thread will have a
347  very low branch ratio, so the core frequency will be scaled down to the minimum
348  allowed value. When packets are received, the code path will alter, causing the
349  branch ratio to increase. When the ratio goes above the ratio threshold, the
350  core frequency will be scaled up to the maximum allowed value.
351
352  .. code-block:: console
353
354    --branch-ratio {ratio}
355
356  The branch ratio is a floating point number that specifies the threshold at which
357  to scale up or down for the given workload. The default branch ratio is 0.01,
358  and will need to be adjusted for different workloads.
359
360
361
362JSON API
363~~~~~~~~
364
365In addition to the command line interface for host command and a virtio-serial
366interface for VM power policies, there is also a JSON interface through which
367power commands and policies can be sent. This functionality adds a dependency
368on the Jansson library, and the Jansson development package must be installed
369on the system before the JSON parsing functionality is included in the app.
370This is achieved by:
371
372  .. code-block:: javascript
373
374    apt-get install libjansson-dev
375
376The command and package name may be different depending on your operating
377system. It's worth noting that the app will successfully build without this
378package present, but a warning is shown during compilation, and the JSON
379parsing functionality will not be present in the app.
380
381Sending a command or policy to the power manager application is achieved by
382simply opening a fifo file, writing a JSON string to that fifo, and closing
383the file. In actual implementation every core has own dedicated fifo[0..n],
384where n is number of the last available core.
385Having a dedicated fifo file per core allows using standard filesystem permissions
386to ensure a given container can only write JSON commands into fifos it is allowed
387to use.
388
389The fifo is at /tmp/powermonitor/fifo[0..n]
390
391For example all cmds put to the /tmp/powermonitor/fifo7, will have
392effect only on CPU[7].
393
394The JSON string can be a policy or instruction, and takes the following
395format:
396
397  .. code-block:: javascript
398
399    {"packet_type": {
400      "pair_1": value,
401      "pair_2": value
402    }}
403
404The 'packet_type' header can contain one of two values, depending on
405whether a policy or power command is being sent. The two possible values are
406"policy" and "instruction", and the expected name-value pairs is different
407depending on which type is being sent.
408
409The pairs are the format of standard JSON name-value pairs. The value type
410varies between the different name/value pairs, and may be integers, strings,
411arrays, etc. Examples of policies follow later in this document. The allowed
412names and value types are as follows:
413
414
415:Pair Name: "command"
416:Description: The type of packet we're sending to the power manager. We can be
417  creating or destroying a policy, or sending a direct command to adjust
418  the frequency of a core, similar to the command line interface.
419:Type: string
420:Values:
421
422  :CREATE: used when creating a new policy,
423  :DESTROY: used when removing a policy,
424  :POWER: used when sending an immediate command, max, min, etc.
425:Required: yes
426:Example:
427
428    .. code-block:: javascript
429
430      "command", "CREATE"
431
432
433:Pair Name: "policy_type"
434:Description: Type of policy to apply. Please see vm_power_manager documentation
435  for more information on the types of policies that may be used.
436:Type: string
437:Values:
438
439  :TIME: Time-of-day policy. Frequencies of the relevant cores are
440    scaled up/down depending on busy and quiet hours.
441  :TRAFFIC: This policy takes statistics from the NIC and scales up
442    and down accordingly.
443  :WORKLOAD: This policy looks at how heavily loaded the cores are,
444    and scales up and down accordingly.
445  :BRANCH_RATIO: This out-of-band policy can look at the ratio between
446    branch hits and misses on a core, and is useful for detecting
447    how much packet processing a core is doing.
448:Required: only for CREATE/DESTROY command
449:Example:
450
451  .. code-block:: javascript
452
453    "policy_type", "TIME"
454
455:Pair Name: "busy_hours"
456:Description: The hours of the day in which we scale up the cores for busy
457  times.
458:Type: array of integers
459:Values: array with list of hour numbers, (0-23)
460:Required: only for TIME policy
461:Example:
462
463  .. code-block:: javascript
464
465    "busy_hours":[ 17, 18, 19, 20, 21, 22, 23 ]
466
467:Pair Name: "quiet_hours"
468:Description: The hours of the day in which we scale down the cores for quiet
469  times.
470:Type: array of integers
471:Values: array with list of hour numbers, (0-23)
472:Required: only for TIME policy
473:Example:
474
475  .. code-block:: javascript
476
477    "quiet_hours":[ 2, 3, 4, 5, 6 ]
478
479:Pair Name: "avg_packet_thresh"
480:Description: Threshold below which the frequency will be set to min for
481  the TRAFFIC policy. If the traffic rate is above this and below max, the
482  frequency will be set to medium.
483:Type: integer
484:Values: The number of packets below which the TRAFFIC policy applies the
485  minimum frequency, or medium frequency if between avg and max thresholds.
486:Required: only for TRAFFIC policy
487:Example:
488
489  .. code-block:: javascript
490
491    "avg_packet_thresh": 100000
492
493:Pair Name: "max_packet_thresh"
494:Description: Threshold above which the frequency will be set to max for
495  the TRAFFIC policy
496:Type: integer
497:Values: The number of packets per interval above which the TRAFFIC policy
498  applies the maximum frequency
499:Required: only for TRAFFIC policy
500:Example:
501
502  .. code-block:: javascript
503
504    "max_packet_thresh": 500000
505
506:Pair Name: "workload"
507:Description: When our policy is of type WORKLOAD, we need to specify how
508  heavy our workload is.
509:Type: string
510:Values:
511
512  :HIGH: For cores running workloads that require high frequencies
513  :MEDIUM: For cores running workloads that require medium frequencies
514  :LOW: For cores running workloads that require low frequencies
515:Required: only for WORKLOAD policy types
516:Example:
517
518  .. code-block:: javascript
519
520    "workload", "MEDIUM"
521
522:Pair Name: "mac_list"
523:Description: When our policy is of type TRAFFIC, we need to specify the
524  MAC addresses that the host needs to monitor
525:Type: string
526:Values: array with a list of mac address strings.
527:Required: only for TRAFFIC policy types
528:Example:
529
530  .. code-block:: javascript
531
532    "mac_list":[ "de:ad:be:ef:01:01", "de:ad:be:ef:01:02" ]
533
534:Pair Name: "unit"
535:Description: the type of power operation to apply in the command
536:Type: string
537:Values:
538
539  :SCALE_MAX: Scale frequency of this core to maximum
540  :SCALE_MIN: Scale frequency of this core to minimum
541  :SCALE_UP: Scale up frequency of this core
542  :SCALE_DOWN: Scale down frequency of this core
543  :ENABLE_TURBO: Enable Turbo Boost for this core
544  :DISABLE_TURBO: Disable Turbo Boost for this core
545:Required: only for POWER instruction
546:Example:
547
548  .. code-block:: javascript
549
550    "unit", "SCALE_MAX"
551
552JSON API Examples
553~~~~~~~~~~~~~~~~~
554
555Profile create example:
556
557  .. code-block:: javascript
558
559    {"policy": {
560      "command": "create",
561      "policy_type": "TIME",
562      "busy_hours":[ 17, 18, 19, 20, 21, 22, 23 ],
563      "quiet_hours":[ 2, 3, 4, 5, 6 ]
564    }}
565
566Profile destroy example:
567
568  .. code-block:: javascript
569
570    {"policy": {
571      "command": "destroy"
572    }}
573
574Power command example:
575
576  .. code-block:: javascript
577
578    {"instruction": {
579      "command": "power",
580      "unit": "SCALE_MAX"
581    }}
582
583To send a JSON string to the Power Manager application, simply paste the
584example JSON string into a text file and cat it into the proper fifo:
585
586  .. code-block:: console
587
588    cat file.json >/tmp/powermonitor/fifo[0..n]
589
590The console of the Power Manager application should indicate the command that
591was just received via the fifo.
592
593Compiling and Running the Guest Applications
594--------------------------------------------
595
596l3fwd-power is one sample application that can be used with vm_power_manager.
597
598A guest CLI is also provided for validating the setup.
599
600For both l3fwd-power and guest CLI, the channels for the VM must be monitored by the
601host application using the *add_channels* command on the host. This typically uses
602the following commands in the host application:
603
604.. code-block:: console
605
606  vm_power> add_vm vmname
607  vm_power> add_channels vmname all
608  vm_power> set_channel_status vmname all enabled
609  vm_power> show_vm vmname
610
611
612Compiling
613~~~~~~~~~
614
615For information on compiling DPDK and the sample applications
616see :doc:`compiling`.
617
618For compiling and running l3fwd-power, see :doc:`l3_forward_power_man`.
619
620The application is located in the ``guest_cli`` sub-directory under ``vm_power_manager``.
621
622To build just the ``guest_vm_power_manager`` application using ``make``:
623
624.. code-block:: console
625
626  export RTE_SDK=/path/to/rte_sdk
627  export RTE_TARGET=build
628  cd ${RTE_SDK}/examples/vm_power_manager/guest_cli/
629  make
630
631The resulting binary will be ${RTE_SDK}/build/examples/guest_cli
632
633.. Note::
634  This sample application conditionally links in the Jansson JSON
635  library, so if you are using a multilib or cross compile environment you
636  may need to set the ``PKG_CONFIG_LIBDIR`` environmental variable to point to
637  the relevant pkgconfig folder so that the correct library is linked in.
638
639  For example, if you are building for a 32-bit target, you could find the
640  correct directory using the following ``find`` command:
641
642  .. code-block:: console
643
644      # find /usr -type d -name pkgconfig
645      /usr/lib/i386-linux-gnu/pkgconfig
646      /usr/lib/x86_64-linux-gnu/pkgconfig
647
648  Then use:
649
650  .. code-block:: console
651
652      export PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig
653
654  You then use the make command as normal, which should find the 32-bit
655  version of the library, if it installed. If not, the application will
656  be built without the JSON interface functionality.
657
658To build just the ``vm_power_manager`` application using ``meson/ninja``:
659
660.. code-block:: console
661
662  export RTE_SDK=/path/to/rte_sdk
663  cd ${RTE_SDK}
664  meson build
665  cd build
666  ninja
667  meson configure -Dexamples=vm_power_manager/guest_cli
668  ninja
669
670The resulting binary will be ${RTE_SDK}/build/examples/guest_cli
671
672Running
673~~~~~~~
674
675The standard *EAL* command line parameters are required:
676
677.. code-block:: console
678
679 ./build/guest_vm_power_mgr [EAL options] -- [guest options]
680
681The guest example uses a channel for each lcore enabled. For example,
682to run on cores 0,1,2,3:
683
684.. code-block:: console
685
686 ./build/guest_vm_power_mgr -l 0-3
687
688Optionally, there is a list of command line parameter should the user wish to send a power
689policy down to the host application. These parameters are as follows:
690
691  .. code-block:: console
692
693    --vm-name {name of guest vm}
694
695  This parameter allows the user to change the Virtual Machine name passed down to the
696  host application via the power policy. The default is "ubuntu2"
697
698  .. code-block:: console
699
700    --vcpu-list {list vm cores}
701
702  A comma-separated list of cores in the VM that the user wants the host application to
703  monitor. The list of cores in any vm starts at zero, and these are mapped to the
704  physical cores by the host application once the policy is passed down.
705  Valid syntax includes individual cores '2,3,4', or a range of cores '2-4', or a
706  combination of both '1,3,5-7'
707
708  .. code-block:: console
709
710    --busy-hours {list of busy hours}
711
712  A comma-separated list of hours within which to set the core frequency to maximum.
713  Valid syntax includes individual hours '2,3,4', or a range of hours '2-4', or a
714  combination of both '1,3,5-7'. Valid hours are 0 to 23.
715
716  .. code-block:: console
717
718    --quiet-hours {list of quiet hours}
719
720  A comma-separated list of hours within which to set the core frequency to minimum.
721  Valid syntax includes individual hours '2,3,4', or a range of hours '2-4', or a
722  combination of both '1,3,5-7'. Valid hours are 0 to 23.
723
724  .. code-block:: console
725
726    --policy {policy type}
727
728  The type of policy. This can be one of the following values:
729  TRAFFIC - based on incoming traffic rates on the NIC.
730  TIME - busy/quiet hours policy.
731  BRANCH_RATIO - uses branch ratio counters to determine core busyness.
732  Not all parameters are needed for all policy types. For example, BRANCH_RATIO
733  only needs the vcpu-list parameter, not any of the hours.
734
735
736After successful initialization the user is presented with VM Power Manager Guest CLI:
737
738.. code-block:: console
739
740  vm_power(guest)>
741
742To change the frequency of a lcore, use the set_cpu_freq command.
743Where {core_num} is the lcore and channel to change frequency by scaling up/down/min/max.
744
745.. code-block:: console
746
747  set_cpu_freq {core_num} up|down|min|max
748
749To start the application and configure the power policy, and send it to the host:
750
751.. code-block:: console
752
753 ./build/guest_vm_power_mgr -l 0-3 -n 4 -- --vm-name=ubuntu --policy=BRANCH_RATIO --vcpu-list=2-4
754
755Once the VM Power Manager Guest CLI appears, issuing the 'send_policy now' command
756will send the policy to the host:
757
758.. code-block:: console
759
760  send_policy now
761
762Once the policy is sent to the host, the host application takes over the power monitoring
763of the specified cores in the policy.
764
765