1.. SPDX-License-Identifier: BSD-3-Clause 2 Copyright(c) 2010-2014 Intel Corporation. 3 4Virtual Machine Power Management Application 5============================================ 6 7Applications running in virtual environments have an abstract view of 8the underlying hardware on the host. Specifically, applications cannot 9see the binding of virtual components to physical hardware. When looking 10at CPU resourcing, the pinning of Virtual CPUs (vCPUs) to Physical CPUs 11(pCPUs) on the host is not apparent to an application and this pinning 12may change over time. In addition, operating systems on Virtual Machines 13(VMs) do not have the ability to govern their own power policy. The 14Machine Specific Registers (MSRs) for enabling P-state transitions are 15not exposed to the operating systems running on the VMs. 16 17The solution demonstrated in this sample application shows an example of 18how a DPDK application can indicate its processing requirements using 19VM-local only information (vCPU/lcore, and so on) to a host resident VM 20Power Manager. The VM Power Manager is responsible for: 21 22- **Accepting requests for frequency changes for a vCPU** 23- **Translating the vCPU to a pCPU using libvirt** 24- **Performing the change in frequency** 25 26This application demonstrates the following features: 27 28- **The handling of VM application requests to change frequency.** 29 VM applications can request frequency changes for a vCPU. The VM 30 Power Management Application uses libvirt to translate that 31 virtual CPU (vCPU) request to a physical CPU (pCPU) request and 32 performs the frequency change. 33 34- **The acceptance of power management policies from VM applications.** 35 A VM application can send a policy to the host application. The 36 policy contains rules that define the power management behaviour 37 of the VM. The host application then applies the rules of the 38 policy independent of the VM application. For example, the 39 policy can contain time-of-day information for busy/quiet 40 periods, and the host application can scale up/down the relevant 41 cores when required. See :ref:`sending_policy` for information on 42 setting policy values. 43 44- **Out-of-band monitoring of workloads using core hardware event counters.** 45 The host application can manage power for an application by looking 46 at the event counters of the cores and taking action based on the 47 branch miss/hit ratio. See :ref:`enabling_out_of_band`. 48 49 **Note**: This functionality also applies in non-virtualised environments. 50 51In addition to the ``librte_power`` library used on the host, the 52application uses a special version of ``librte_power`` on each VM, which 53directs frequency changes and policies to the host monitor rather than 54the APCI ``cpufreq`` ``sysfs`` interface used on the host in non-virtualised 55environments. 56 57.. _figure_vm_power_mgr_highlevel: 58 59.. figure:: img/vm_power_mgr_highlevel.* 60 61 Highlevel Solution 62 63In the above diagram, the DPDK Applications are shown running in 64virtual machines, and the VM Power Monitor application is shown running 65in the host. 66 67**DPDK VM Application** 68 69- Reuse ``librte_power`` interface, but uses an implementation that 70 forwards frequency requests to the host using a ``virtio-serial`` channel 71- Each lcore has exclusive access to a single channel 72- Sample application reuses ``l3fwd_power`` 73- A CLI for changing frequency from within a VM is also included 74 75**VM Power Monitor** 76 77- Accepts VM commands over ``virtio-serial`` endpoints, monitored 78 using ``epoll`` 79- Commands include the virtual core to be modified, using ``libvirt`` to get 80 the physical core mapping 81- Uses ``librte_power`` to affect frequency changes using Linux userspace 82 power governor (``acpi_cpufreq`` OR ``intel_pstate`` driver) 83- CLI: For adding VM channels to monitor, inspecting and changing channel 84 state, manually altering CPU frequency. Also allows for the changings 85 of vCPU to pCPU pinning 86 87Sample Application Architecture Overview 88---------------------------------------- 89 90The VM power management solution employs ``qemu-kvm`` to provide 91communications channels between the host and VMs in the form of a 92``virtio-serial`` connection that appears as a para-virtualised serial 93device on a VM and can be configured to use various backends on the 94host. For this example, the configuration of each ``virtio-serial`` endpoint 95on the host as an ``AF_UNIX`` file socket, supporting poll/select and 96``epoll`` for event notification. In this example, each channel endpoint on 97the host is monitored for ``EPOLLIN`` events using ``epoll``. Each channel 98is specified as ``qemu-kvm`` arguments or as ``libvirt`` XML for each VM, 99where each VM can have several channels up to a maximum of 64 per VM. In this 100example, each DPDK lcore on a VM has exclusive access to a channel. 101 102To enable frequency changes from within a VM, the VM forwards a 103``librte_power`` request over the ``virtio-serial`` channel to the host. Each 104request contains the vCPU and power command (scale up/down/min/max). The 105API for the host ``librte_power`` and guest ``librte_power`` is consistent 106across environments, with the selection of VM or host implementation 107determined automatically at runtime based on the environment. On 108receiving a request, the host translates the vCPU to a pCPU using the 109libvirt API before forwarding it to the host ``librte_power``. 110 111 112.. _figure_vm_power_mgr_vm_request_seq: 113 114.. figure:: img/vm_power_mgr_vm_request_seq.* 115 116In addition to the ability to send power management requests to the 117host, a VM can send a power management policy to the host. In some 118cases, using a power management policy is a preferred option because it 119can eliminate possible latency issues that can occur when sending power 120management requests. Once the VM sends the policy to the host, the VM no 121longer needs to worry about power management, because the host now 122manages the power for the VM based on the policy. The policy can specify 123power behavior that is based on incoming traffic rates or time-of-day 124power adjustment (busy/quiet hour power adjustment for example). See 125:ref:`sending_policy` for more information. 126 127One method of power management is to sense how busy a core is when 128processing packets and adjusting power accordingly. One technique for 129doing this is to monitor the ratio of the branch miss to branch hits 130counters and scale the core power accordingly. This technique is based 131on the premise that when a core is not processing packets, the ratio of 132branch misses to branch hits is very low, but when the core is 133processing packets, it is measurably higher. The implementation of this 134capability is as a policy of type ``BRANCH_RATIO``. 135See :ref:`sending_policy` for more information on using the 136BRANCH_RATIO policy option. 137 138A JSON interface enables the specification of power management requests 139and policies in JSON format. The JSON interfaces provide a more 140convenient and more easily interpreted interface for the specification 141of requests and policies. See :ref:`power_man_requests` for more information. 142 143Performance Considerations 144~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 146While the Haswell microarchitecture allows for independent power control 147for each core, earlier microarchitectures do not offer such fine-grained 148control. When deploying on pre-Haswell platforms, greater care must be 149taken when selecting which cores are assigned to a VM, for example, a 150core does not scale down in frequency until all of its siblings are 151similarly scaled down. 152 153Configuration 154------------- 155 156BIOS 157~~~~ 158 159To use the power management features of the DPDK, you must enable 160Enhanced Intel SpeedStep® Technology in the platform BIOS. Otherwise, 161the ``sys`` file folder ``/sys/devices/system/cpu/cpu0/cpufreq`` does not 162exist, and you cannot use CPU frequency-based power management. Refer to the 163relevant BIOS documentation to determine how to access these settings. 164 165Host Operating System 166~~~~~~~~~~~~~~~~~~~~~ 167 168The DPDK Power Management library can use either the ``acpi_cpufreq`` or 169the ``intel_pstate`` kernel driver for the management of core frequencies. In 170many cases, the ``intel_pstate`` driver is the default power management 171environment. 172 173Should the ``acpi-cpufreq driver`` be required, the ``intel_pstate`` 174module must be disabled, and the ``acpi-cpufreq`` module loaded in its place. 175 176To disable the ``intel_pstate`` driver, add the following to the ``grub`` 177Linux command line: 178 179 ``intel_pstate=disable`` 180 181On reboot, load the ``acpi_cpufreq`` module: 182 183 ``modprobe acpi_cpufreq`` 184 185Hypervisor Channel Configuration 186~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 188Configure ``virtio-serial`` channels using ``libvirt`` XML. 189The XML structure is as follows: 190 191.. code-block:: XML 192 193 <name>{vm_name}</name> 194 <controller type='virtio-serial' index='0'> 195 <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> 196 </controller> 197 <channel type='unix'> 198 <source mode='bind' path='/tmp/powermonitor/{vm_name}.{channel_num}'/> 199 <target type='virtio' name='virtio.serial.port.poweragent.{vm_channel_num}'/> 200 <address type='virtio-serial' controller='0' bus='0' port='{N}'/> 201 </channel> 202 203Where a single controller of type ``virtio-serial`` is created, up to 32 204channels can be associated with a single controller, and multiple 205controllers can be specified. The convention is to use the name of the 206VM in the host path ``{vm_name}`` and to increment ``{channel_num}`` for each 207channel. Likewise, the port value ``{N}`` must be incremented for each 208channel. 209 210On the host, for each channel to appear in the path, ensure the creation 211of the ``/tmp/powermonitor/`` directory and the assignment of ``qemu`` 212permissions: 213 214.. code-block:: console 215 216 mkdir /tmp/powermonitor/ 217 chown qemu:qemu /tmp/powermonitor 218 219Note that files and directories in ``/tmp`` are generally removed when 220rebooting the host and you may need to perform the previous steps after 221each reboot. 222 223The serial device as it appears on a VM is configured with the target 224element attribute name and must be in the form: 225``virtio.serial.port.poweragent.{vm_channel_num}``, where 226``vm_channel_num`` is typically the lcore channel to be used in 227DPDK VM applications. 228 229Each channel on a VM is present at: 230 231``/dev/virtio-ports/virtio.serial.port.poweragent.{vm_channel_num}`` 232 233Compiling and Running the Host Application 234------------------------------------------ 235 236Compiling the Host Application 237~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 239For information on compiling the DPDK and sample applications, 240see :doc:`compiling`. 241 242The application is located in the ``vm_power_manager`` subdirectory. 243 244To build just the ``vm_power_manager`` application using ``make``: 245 246.. code-block:: console 247 248 cd dpdk/examples/vm_power_manager/ 249 make 250 251The resulting binary is ``dpdk/build/examples/vm_power_manager``. 252 253To build just the ``vm_power_manager`` application using ``meson``/``ninja``: 254 255.. code-block:: console 256 257 cd dpdk 258 meson setup build 259 cd build 260 ninja 261 meson configure -Dexamples=vm_power_manager 262 ninja 263 264The resulting binary is ``dpdk/build/examples/dpdk-vm_power_manager``. 265 266Running the Host Application 267~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 268 269The application does not have any specific command line options other 270than the EAL options: 271 272.. code-block:: console 273 274 ./<build_dir>/examples/dpdk-vm_power_mgr [EAL options] 275 276The application requires exactly two cores to run. One core for the CLI 277and the other for the channel endpoint monitor. For example, to run on 278cores 0 and 1 on a system with four memory channels, issue the command: 279 280.. code-block:: console 281 282 ./<build_dir>/examples/dpdk-vm_power_mgr -l 0-1 -n 4 283 284After successful initialization, the VM Power Manager CLI prompt appears: 285 286.. code-block:: console 287 288 vm_power> 289 290Now, it is possible to add virtual machines to the VM Power Manager: 291 292.. code-block:: console 293 294 vm_power> add_vm {vm_name} 295 296When a ``{vm_name}`` is specified with the ``add_vm`` command, a lookup is 297performed with ``libvirt`` to ensure that the VM exists. ``{vm_name}`` is a 298unique identifier to associate channels with a particular VM and for 299executing operations on a VM within the CLI. VMs do not have to be 300running to add them. 301 302It is possible to issue several commands from the CLI to manage VMs. 303 304Remove the virtual machine identified by ``{vm_name}`` from the VM Power 305Manager using the command: 306 307.. code-block:: console 308 309 rm_vm {vm_name} 310 311Add communication channels for the specified VM using the following 312command. The ``virtio`` channels must be enabled in the VM configuration 313(``qemu/libvirt``) and the associated VM must be active. ``{list}`` is a 314comma-separated list of channel numbers to add. Specifying the keyword 315``all`` attempts to add all channels for the VM: 316 317.. code-block:: console 318 319 set_pcpu {vm_name} {vcpu} {pcpu} 320 321 Enable query of physical core information from a VM: 322 323.. code-block:: console 324 325 set_query {vm_name} enable|disable 326 327Manual control and inspection can also be carried in relation CPU frequency scaling: 328 329 Get the current frequency for each core specified in the mask: 330 331.. code-block:: console 332 333 show_cpu_freq_mask {mask} 334 335 Set the current frequency for the cores specified in {core_mask} by scaling each up/down/min/max: 336 337.. code-block:: console 338 339 add_channels {vm_name} {list}|all 340 341Enable or disable the communication channels in ``{list}`` (comma-separated) 342for the specified VM. Alternatively, replace ``list`` with the keyword 343``all``. Disabled channels receive packets on the host. However, the commands 344they specify are ignored. Set the status to enabled to begin processing 345requests again: 346 347.. code-block:: console 348 349 set_channel_status {vm_name} {list}|all enabled|disabled 350 351Print to the CLI information on the specified VM. The information lists 352the number of vCPUs, the pinning to pCPU(s) as a bit mask, along with 353any communication channels associated with each VM, and the status of 354each channel: 355 356.. code-block:: console 357 358 show_vm {vm_name} 359 360Set the binding of a virtual CPU on a VM with name ``{vm_name}`` to the 361physical CPU mask: 362 363.. code-block:: console 364 365 set_pcpu_mask {vm_name} {vcpu} {pcpu} 366 367Set the binding of the virtual CPU on the VM to the physical CPU: 368 369 .. code-block:: console 370 371 set_pcpu {vm_name} {vcpu} {pcpu} 372 373It is also possible to perform manual control and inspection in relation 374to CPU frequency scaling. 375 376Get the current frequency for each core specified in the mask: 377 378.. code-block:: console 379 380 show_cpu_freq_mask {mask} 381 382Set the current frequency for the cores specified in ``{core_mask}`` by 383scaling each up/down/min/max: 384 385.. code-block:: console 386 387 set_cpu_freq {core_mask} up|down|min|max 388 389Get the current frequency for the specified core: 390 391.. code-block:: console 392 393 show_cpu_freq {core_num} 394 395Set the current frequency for the specified core by scaling up/down/min/max: 396 397.. code-block:: console 398 399 set_cpu_freq {core_num} up|down|min|max 400 401.. _enabling_out_of_band: 402 403Command Line Options for Enabling Out-of-band Branch Ratio Monitoring 404~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 406There are a couple of command line parameters for enabling the out-of-band 407monitoring of branch ratios on cores doing busy polling using PMDs as 408described below: 409 410``--core-branch-ratio {list of cores}:{branch ratio for listed cores}`` 411 Specify the list of cores to monitor the ratio of branch misses 412 to branch hits. A tightly-polling PMD thread has a very low 413 branch ratio, therefore the core frequency scales down to the 414 minimum allowed value. On receiving packets, the code path changes, 415 causing the branch ratio to increase. When the ratio goes above 416 the ratio threshold, the core frequency scales up to the maximum 417 allowed value. The specified branch-ratio is a floating point number 418 that identifies the threshold at which to scale up or down for the 419 elements of the core-list. If not included the default branch ratio of 420 0.01 but will need adjustment for different workloads 421 422 This parameter can be used multiple times for different sets of cores. 423 The branch ratio mechanism can also be useful for non-PMD cores and 424 hyper-threaded environments where C-States are disabled. 425 426 427Compiling and Running the Guest Applications 428-------------------------------------------- 429 430It is possible to use the ``l3fwd-power`` application (for example) with the 431``vm_power_manager``. 432 433The distribution also provides a guest CLI for validating the setup. 434 435For both ``l3fwd-power`` and the guest CLI, the host application must use 436the ``add_channels`` command to monitor the channels for the VM. To do this, 437issue the following commands in the host application: 438 439.. code-block:: console 440 441 vm_power> add_vm vmname 442 vm_power> add_channels vmname all 443 vm_power> set_channel_status vmname all enabled 444 vm_power> show_vm vmname 445 446Compiling the Guest Application 447~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 449For information on compiling DPDK and the sample applications in general, 450see :doc:`compiling`. 451 452For compiling and running the ``l3fwd-power`` sample application, see 453:doc:`l3_forward_power_man`. 454 455The application is in the ``guest_cli`` subdirectory under ``vm_power_manager``. 456 457To build just the ``guest_vm_power_manager`` application using ``make``, issue 458the following commands: 459 460.. code-block:: console 461 462 cd dpdk/examples/vm_power_manager/guest_cli/ 463 make 464 465The resulting binary is ``dpdk/build/examples/guest_cli``. 466 467**Note**: This sample application conditionally links in the Jansson JSON 468library. Consequently, if you are using a multilib or cross-compile 469environment, you may need to set the ``PKG_CONFIG_LIBDIR`` environmental 470variable to point to the relevant ``pkgconfig`` folder so that the correct 471library is linked in. 472 473For example, if you are building for a 32-bit target, you could find the 474correct directory using the following find command: 475 476.. code-block:: console 477 478 # find /usr -type d -name pkgconfig 479 /usr/lib/i386-linux-gnu/pkgconfig 480 /usr/lib/x86_64-linux-gnu/pkgconfig 481 482Then use: 483 484.. code-block:: console 485 486 export PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig 487 488You then use the ``make`` command as normal, which should find the 32-bit 489version of the library, if it installed. If not, the application builds 490without the JSON interface functionality. 491 492To build just the ``vm_power_manager`` application using ``meson``/``ninja``: 493 494.. code-block:: console 495 496 cd dpdk 497 meson setup build 498 cd build 499 ninja 500 meson configure -Dexamples=vm_power_manager/guest_cli 501 ninja 502 503The resulting binary is ``dpdk/build/examples/guest_cli``. 504 505Running the Guest Application 506~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 508The standard EAL command line parameters are necessary: 509 510.. code-block:: console 511 512 ./<build_dir>/examples/dpdk-vm_power_mgr [EAL options] -- [guest options] 513 514The guest example uses a channel for each lcore enabled. For example, to 515run on cores 0, 1, 2 and 3: 516 517.. code-block:: console 518 519 ./<build_dir>/examples/dpdk-guest_vm_power_mgr -l 0-3 520 521.. _sending_policy: 522 523Command Line Options Available When Sending a Policy to the Host 524~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 525 526Optionally, there are several command line options for a user who needs 527to send a power policy to the host application: 528 529``--vm-name {name of guest vm}`` 530 Allows the user to change the virtual machine name 531 passed down to the host application using the power policy. 532 The default is ubuntu2. 533 534``--vcpu-list {list vm cores}`` 535 A comma-separated list of cores in the VM that the user 536 wants the host application to monitor. 537 The list of cores in any VM starts at zero, 538 and the host application maps these to the physical cores 539 once the policy passes down to the host. 540 Valid syntax includes individual cores 2,3,4, 541 a range of cores 2-4, or a combination of both 1,3,5-7. 542 543``--busy-hours {list of busy hours}`` 544 A comma-separated list of hours in which to set the core 545 frequency to the maximum. 546 Valid syntax includes individual hours 2,3,4, 547 a range of hours 2-4, or a combination of both 1,3,5-7. 548 Valid hour values are 0 to 23. 549 550``--quiet-hours {list of quiet hours}`` 551 A comma-separated list of hours in which to set the core frequency 552 to minimum. Valid syntax includes individual hours 2,3,4, 553 a range of hours 2-4, or a combination of both 1,3,5-7. 554 Valid hour values are 0 to 23. 555 556``--policy {policy type}`` 557 The type of policy. This can be one of the following values: 558 559 - TRAFFIC - Based on incoming traffic rates on the NIC. 560 - TIME - Uses a busy/quiet hours policy. 561 - BRANCH_RATIO - Uses branch ratio counters to determine core busyness. 562 - WORKLOAD - Sets the frequency to low, medium or high 563 based on the received policy setting. 564 565 **Note**: Not all policy types need all parameters. 566 For example, BRANCH_RATIO only needs the vcpu-list parameter. 567 568After successful initialization, the VM Power Manager Guest CLI prompt 569appears: 570 571.. code-block:: console 572 573 vm_power(guest)> 574 575To change the frequency of an lcore, use a ``set_cpu_freq`` command similar 576to the following: 577 578.. code-block:: console 579 580 set_cpu_freq {core_num} up|down|min|max 581 582where, ``{core_num}`` is the lcore and channel to change frequency by 583scaling up/down/min/max. 584 585To start an application, configure the power policy, and send it to the 586host, use a command like the following: 587 588.. code-block:: console 589 590 ./<build_dir>/examples/dpdk-guest_vm_power_mgr -l 0-3 -n 4 -- --vm-name=ubuntu --policy=BRANCH_RATIO --vcpu-list=2-4 591 592Once the VM Power Manager Guest CLI appears, issuing the 'send_policy now' command 593will send the policy to the host: 594 595.. code-block:: console 596 597 send_policy now 598 599Once the policy is sent to the host, the host application takes over the power monitoring 600of the specified cores in the policy. 601 602.. _power_man_requests: 603 604JSON Interface for Power Management Requests and Policies 605--------------------------------------------------------- 606 607In addition to the command line interface for the host command, and a 608``virtio-serial`` interface for VM power policies, there is also a JSON 609interface through which power commands and policies can be sent. 610 611**Note**: This functionality adds a dependency on the Jansson library. 612Install the Jansson development package on the system to avail of the 613JSON parsing functionality in the app. Issue the ``apt-get install 614libjansson-dev`` command to install the development package. The command 615and package name may be different depending on your operating system. It 616is worth noting that the app builds successfully if this package is not 617present, but a warning displays during compilation, and the JSON parsing 618functionality is not present in the app. 619 620Send a request or policy to the VM Power Manager by simply opening a 621fifo file at ``/tmp/powermonitor/fifo``, writing a JSON string to that file, 622and closing the file. 623 624The JSON string can be a power management request or a policy, and takes 625the following format: 626 627.. code-block:: javascript 628 629 {"packet_type": { 630 "pair_1": value, 631 "pair_2": value 632 }} 633 634The ``packet_type`` header can contain one of two values, depending on 635whether a power management request or policy is being sent. The two 636possible values are ``instruction`` and ``policy`` and the expected name-value 637pairs are different depending on which type is sent. 638 639The pairs are in the format of standard JSON name-value pairs. The value 640type varies between the different name-value pairs, and may be integers, 641strings, arrays, and so on. See :ref:`json_interface_ex` 642for examples of policies and instructions and 643:ref:`json_name_value_pair` for the supported names and value types. 644 645.. _json_interface_ex: 646 647JSON Interface Examples 648~~~~~~~~~~~~~~~~~~~~~~~ 649 650The following is an example JSON string that creates a time-profile 651policy. 652 653.. code-block:: JSON 654 655 {"policy": { 656 "name": "ubuntu", 657 "command": "create", 658 "policy_type": "TIME", 659 "busy_hours":[ 17, 18, 19, 20, 21, 22, 23 ], 660 "quiet_hours":[ 2, 3, 4, 5, 6 ], 661 "core_list":[ 11 ] 662 }} 663 664The following is an example JSON string that removes the named policy. 665 666.. code-block:: JSON 667 668 {"policy": { 669 "name": "ubuntu", 670 "command": "destroy", 671 }} 672 673The following is an example JSON string for a power management request. 674 675.. code-block:: JSON 676 677 {"instruction": { 678 "name": "ubuntu", 679 "command": "power", 680 "unit": "SCALE_MAX", 681 "resource_id": 10 682 }} 683 684To query the available frequencies of an lcore, use the query_cpu_freq command. 685Where {core_num} is the lcore to query. 686Before using this command, please enable responses via the set_query command on the host. 687 688.. code-block:: console 689 690 query_cpu_freq {core_num}|all 691 692To query the capabilities of an lcore, use the query_cpu_caps command. 693Where {core_num} is the lcore to query. 694Before using this command, please enable responses via the set_query command on the host. 695 696.. code-block:: console 697 698 query_cpu_caps {core_num}|all 699 700To start the application and configure the power policy, and send it to the host: 701 702.. code-block:: console 703 704 ./<build_dir>/examples/dpdk-guest_vm_power_mgr -l 0-3 -n 4 -- --vm-name=ubuntu --policy=BRANCH_RATIO --vcpu-list=2-4 705 706Once the VM Power Manager Guest CLI appears, issuing the 'send_policy now' command 707will send the policy to the host: 708 709.. code-block:: console 710 711 send_policy now 712 713Once the policy is sent to the host, the host application takes over the power monitoring 714of the specified cores in the policy. 715 716.. _json_name_value_pair: 717 718JSON Name-value Pairs 719~~~~~~~~~~~~~~~~~~~~~ 720 721The following are the name-value pairs supported by the JSON interface: 722 723- `avg_packet_thresh`_ 724- `busy_hours`_ 725- `command`_ 726- `core_list`_ 727- `mac_list`_ 728- `max_packet_thresh`_ 729- `name`_ 730- `policy_type`_ 731- `quiet_hours`_ 732- `resource_id`_ 733- `unit`_ 734- `workload`_ 735 736avg_packet_thresh 737^^^^^^^^^^^^^^^^^ 738 739Description 740 The threshold below which the frequency is set to the minimum value 741 for the TRAFFIC policy. 742 If the traffic rate is above this value and below the maximum value, 743 the frequency is set to medium. 744Type 745 integer 746Values 747 The number of packets below which the TRAFFIC policy applies 748 the minimum frequency, or the medium frequency 749 if between the average and maximum thresholds. 750Required 751 Yes 752Example 753 ``"avg_packet_thresh": 100000`` 754 755busy_hours 756^^^^^^^^^^ 757 758Description 759 The hours of the day in which we scale up the cores for busy times. 760Type 761 array of integers 762Values 763 An array with a list of hour values (0-23). 764Required 765 For the TIME policy only. 766Example 767 ``"busy_hours":[ 17, 18, 19, 20, 21, 22, 23 ]`` 768 769command 770^^^^^^^ 771 772Description 773 The type of packet to send to the VM Power Manager. 774 It is possible to create or destroy a policy or send a direct command 775 to adjust the frequency of a core, 776 as is possible on the command line interface. 777Type 778 string 779Values 780 Possible values are: 781 - CREATE: Create a new policy. 782 - DESTROY: Remove an existing policy. 783 - POWER: Send an immediate command, max, min, and so on. 784Required 785 Yes 786Example 787 ``"command": "CREATE"`` 788 789core_list 790^^^^^^^^^ 791 792Description 793 The cores to which to apply a policy. 794Type 795 array of integers 796Values 797 An array with a list of virtual CPUs. 798Required 799 For CREATE/DESTROY policy requests only. 800Example 801 ``"core_list":[ 10, 11 ]`` 802 803mac_list 804^^^^^^^^ 805 806Description 807 When the policy is of type TRAFFIC, 808 it is necessary to specify the MAC addresses that the host must monitor. 809Type 810 array of strings 811Values 812 An array with a list of MAC address strings. 813Required 814 For TRAFFIC policy types only. 815Example 816 ``"mac_list":[ "de:ad:be:ef:01:01","de:ad:be:ef:01:02" ]`` 817 818max_packet_thresh 819^^^^^^^^^^^^^^^^^ 820 821Description 822 In a policy of type TRAFFIC, 823 the threshold value above which the frequency is set to a maximum. 824Type 825 integer 826Values 827 The number of packets per interval above which 828 the TRAFFIC policy applies the maximum frequency. 829Required 830 For the TRAFFIC policy only. 831Example 832 ``"max_packet_thresh": 500000`` 833 834name 835^^^^ 836 837Description 838 The name of the VM or host. 839 Allows the parser to associate the policy with the relevant VM or host OS. 840Type 841 string 842Values 843 Any valid string. 844Required 845 Yes 846Example 847 ``"name": "ubuntu2"`` 848 849policy_type 850^^^^^^^^^^^ 851 852Description 853 The type of policy to apply. 854 See the ``--policy`` option description for more information. 855Type 856 string 857Values 858 Possible values are: 859 860 - TIME: Time-of-day policy. 861 Scale the frequencies of the relevant cores up/down 862 depending on busy and quiet hours. 863 - TRAFFIC: Use statistics from the NIC and scale up and down accordingly. 864 - WORKLOAD: Determine how heavily loaded the cores are 865 and scale up and down accordingly. 866 - BRANCH_RATIO: An out-of-band policy that looks at the ratio 867 between branch hits and misses on a core 868 and uses that information to determine how much packet processing 869 a core is doing. 870 871Required 872 For ``CREATE`` and ``DESTROY`` policy requests only. 873Example 874 ``"policy_type": "TIME"`` 875 876quiet_hours 877^^^^^^^^^^^ 878 879Description 880 The hours of the day to scale down the cores for quiet times. 881Type 882 array of integers 883Values 884 An array with a list of hour numbers with values in the range 0 to 23. 885Required 886 For the TIME policy only. 887Example 888 ``"quiet_hours":[ 2, 3, 4, 5, 6 ]`` 889 890resource_id 891^^^^^^^^^^^ 892 893Description 894 The core to which to apply a power command. 895Type 896 integer 897Values 898 A valid core ID for the VM or host OS. 899Required 900 For the ``POWER`` instruction only. 901Example 902 ``"resource_id": 10`` 903 904unit 905^^^^ 906 907Description 908 The type of power operation to apply in the command. 909Type 910 string 911Values 912 - SCALE_MAX: Scale the frequency of this core to the maximum. 913 - SCALE_MIN: Scale the frequency of this core to the minimum. 914 - SCALE_UP: Scale up the frequency of this core. 915 - SCALE_DOWN: Scale down the frequency of this core. 916 - ENABLE_TURBO: Enable Intel® Turbo Boost Technology for this core. 917 - DISABLE_TURBO: Disable Intel® Turbo Boost Technology for this core. 918Required 919 For the ``POWER`` instruction only. 920Example 921 ``"unit": "SCALE_MAX"`` 922 923workload 924^^^^^^^^ 925 926Description 927 In a policy of type WORKLOAD, 928 it is necessary to specify how heavy the workload is. 929Type 930 string 931Values 932 - HIGH: Scale the frequency of this core to maximum. 933 - MEDIUM: Scale the frequency of this core to minimum. 934 - LOW: Scale up the frequency of this core. 935Required 936 For the ``WORKLOAD`` policy only. 937Example 938 ``"workload": "MEDIUM"`` 939