diff --git a/roles/infra/README.md b/roles/infra/README.md
index ea18645..7f8215a 100644
--- a/roles/infra/README.md
+++ b/roles/infra/README.md
@@ -21,6 +21,9 @@ Role Variables
| `os_image_size` | `str` | `20G` | | The size to which one-deploy will **try** to adjust the OS image. |
| `memory_KiB` | `str` | `2097152` | | Memory amount to be set in XML in Libvirt. |
| `vcpu_static` | `str` | `1` | | VCPU amount to be set in XML in Libvirt. |
+| `cputune_shares_base` | `int` | `200` | | Base value used to compute PWS (assuming CGv2). |
+| `cputune_shares_max` | `int` | `10000` | | PWS value cap (assuming CGv2). |
+| `cputune_shares` | `int` | computed | | The proportional weighted share (PWS) for the domain. |
| `vnc_max_port` | `str` | `65535` | | Upper limit for VNC ports to start counting-down from. |
| `passthrough_fs` | `list` | `[]` | (check below) | Shared HV filesystems to attach to the Front-end VMs. |
| | | | | |
diff --git a/roles/infra/defaults/main.yml b/roles/infra/defaults/main.yml
index d6df348..0d7ac64 100644
--- a/roles/infra/defaults/main.yml
+++ b/roles/infra/defaults/main.yml
@@ -8,3 +8,6 @@ vnc_max_port: 65535
infra_bridge: br0
infra_bridge_type: bridge
passthrough_fs: []
+cputune_shares_base: 200 # twice the OpenNebula's default (for CGv2)
+cputune_shares_max: 10000
+cputune_shares: "{{ ((vcpu_static | int) * (cputune_shares_base | int)) | round(0, 'ceil') }}"
diff --git a/roles/infra/templates/frontend.xml.jinja b/roles/infra/templates/frontend.xml.jinja
index 31ac150..82cc9b4 100644
--- a/roles/infra/templates/frontend.xml.jinja
+++ b/roles/infra/templates/frontend.xml.jinja
@@ -5,6 +5,9 @@
{{ memory_KiB }}
{{ vcpu_static }}
+
+ {{ (cputune_shares if (cputune_shares | int) < (cputune_shares_max | int) else cputune_shares_max) | int }}
+
/machine