Merge "Add cpu-pinning element"
This commit is contained in:
@@ -110,6 +110,7 @@ Command syntax:
|
|||||||
[-i **ubuntu-minimal** | fedora | centos-minimal | rhel ]
|
[-i **ubuntu-minimal** | fedora | centos-minimal | rhel ]
|
||||||
[-k <kernel package name> ]
|
[-k <kernel package name> ]
|
||||||
[-l <log file> ]
|
[-l <log file> ]
|
||||||
|
[-m]
|
||||||
[-n]
|
[-n]
|
||||||
[-o **amphora-x64-haproxy** | <filename> ]
|
[-o **amphora-x64-haproxy** | <filename> ]
|
||||||
[-p]
|
[-p]
|
||||||
@@ -132,6 +133,7 @@ Command syntax:
|
|||||||
'-i' is the base OS (default: ubuntu-minimal)
|
'-i' is the base OS (default: ubuntu-minimal)
|
||||||
'-k' is the kernel meta package name, currently only for ubuntu-minimal base OS (default: linux-image-virtual)
|
'-k' is the kernel meta package name, currently only for ubuntu-minimal base OS (default: linux-image-virtual)
|
||||||
'-l' is output logfile (default: none)
|
'-l' is output logfile (default: none)
|
||||||
|
'-m' enable vCPU pinning optimizations (default: disabled)
|
||||||
'-n' disable sshd (default: enabled)
|
'-n' disable sshd (default: enabled)
|
||||||
'-o' is the output image file name
|
'-o' is the output image file name
|
||||||
'-p' install amphora-agent from distribution packages (default: disabled)"
|
'-p' install amphora-agent from distribution packages (default: disabled)"
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ usage() {
|
|||||||
echo " [-i **ubuntu-minimal** | fedora | centos-minimal | rhel ]"
|
echo " [-i **ubuntu-minimal** | fedora | centos-minimal | rhel ]"
|
||||||
echo " [-k <kernel package name> ]"
|
echo " [-k <kernel package name> ]"
|
||||||
echo " [-l <log file> ]"
|
echo " [-l <log file> ]"
|
||||||
|
echo " [-m]"
|
||||||
echo " [-n]"
|
echo " [-n]"
|
||||||
echo " [-o **amphora-x64-haproxy.qcow2** | <filename> ]"
|
echo " [-o **amphora-x64-haproxy.qcow2** | <filename> ]"
|
||||||
echo " [-p]"
|
echo " [-p]"
|
||||||
@@ -52,6 +53,7 @@ usage() {
|
|||||||
echo " '-i' is the base OS (default: ubuntu-minimal)"
|
echo " '-i' is the base OS (default: ubuntu-minimal)"
|
||||||
echo " '-k' is the kernel meta package name, currently only for ubuntu-minimal base OS (default: linux-image-virtual)"
|
echo " '-k' is the kernel meta package name, currently only for ubuntu-minimal base OS (default: linux-image-virtual)"
|
||||||
echo " '-l' is output logfile (default: none)"
|
echo " '-l' is output logfile (default: none)"
|
||||||
|
echo " '-m' enable vCPU pinning optimizations (default: disabled)"
|
||||||
echo " '-n' disable sshd (default: enabled)"
|
echo " '-n' disable sshd (default: enabled)"
|
||||||
echo " '-o' is the output image file name"
|
echo " '-o' is the output image file name"
|
||||||
echo " '-p' install amphora-agent from distribution packages (default: disabled)"
|
echo " '-p' install amphora-agent from distribution packages (default: disabled)"
|
||||||
@@ -92,7 +94,7 @@ dib_enable_tracing=
|
|||||||
|
|
||||||
AMP_LOGFILE=""
|
AMP_LOGFILE=""
|
||||||
|
|
||||||
while getopts "a:b:c:d:efg:hi:k:l:no:pt:r:s:vw:xy" opt; do
|
while getopts "a:b:c:d:efg:hi:k:l:mno:pt:r:s:vw:xy" opt; do
|
||||||
case $opt in
|
case $opt in
|
||||||
a)
|
a)
|
||||||
AMP_ARCH=$OPTARG
|
AMP_ARCH=$OPTARG
|
||||||
@@ -165,6 +167,9 @@ while getopts "a:b:c:d:efg:hi:k:l:no:pt:r:s:vw:xy" opt; do
|
|||||||
l)
|
l)
|
||||||
AMP_LOGFILE="--logfile=$OPTARG"
|
AMP_LOGFILE="--logfile=$OPTARG"
|
||||||
;;
|
;;
|
||||||
|
m)
|
||||||
|
AMP_ENABLE_CPUPINNING=1
|
||||||
|
;;
|
||||||
n)
|
n)
|
||||||
AMP_DISABLE_SSHD=1
|
AMP_DISABLE_SSHD=1
|
||||||
;;
|
;;
|
||||||
@@ -252,6 +257,8 @@ if [ "$AMP_BASEOS" = "ubuntu-minimal" ]; then
|
|||||||
export DIB_UBUNTU_KERNEL=${AMP_KERNEL:-"linux-image-virtual"}
|
export DIB_UBUNTU_KERNEL=${AMP_KERNEL:-"linux-image-virtual"}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AMP_ENABLE_CPUPINNING=${AMP_ENABLE_CPUPINNING:-0}
|
||||||
|
|
||||||
AMP_DISABLE_SSHD=${AMP_DISABLE_SSHD:-0}
|
AMP_DISABLE_SSHD=${AMP_DISABLE_SSHD:-0}
|
||||||
|
|
||||||
AMP_PACKAGE_INSTALL=${AMP_PACKAGE_INSTALL:-0}
|
AMP_PACKAGE_INSTALL=${AMP_PACKAGE_INSTALL:-0}
|
||||||
@@ -475,6 +482,11 @@ AMP_element_sequence="$AMP_element_sequence pip-cache"
|
|||||||
# Add certificate ramfs element
|
# Add certificate ramfs element
|
||||||
AMP_element_sequence="$AMP_element_sequence certs-ramfs"
|
AMP_element_sequence="$AMP_element_sequence certs-ramfs"
|
||||||
|
|
||||||
|
# Add cpu-pinning element
|
||||||
|
if [ "$AMP_ENABLE_CPUPINNING" -eq 1 ]; then
|
||||||
|
AMP_element_sequence="$AMP_element_sequence cpu-pinning"
|
||||||
|
fi
|
||||||
|
|
||||||
# Disable SSHD if requested
|
# Disable SSHD if requested
|
||||||
if [ "$AMP_DISABLE_SSHD" -eq 1 ]; then
|
if [ "$AMP_DISABLE_SSHD" -eq 1 ]; then
|
||||||
AMP_element_sequence="$AMP_element_sequence remove-sshd"
|
AMP_element_sequence="$AMP_element_sequence remove-sshd"
|
||||||
|
|||||||
6
elements/cpu-pinning/README.rst
Normal file
6
elements/cpu-pinning/README.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Element to enable optimizations for vertical scaling
|
||||||
|
|
||||||
|
This element configures the Linux kernel to isolate all but the first
|
||||||
|
vCPU of the system, so that they are used by HAProxy threads exclusively.
|
||||||
|
It also installs and activates a customized TuneD profile that should further
|
||||||
|
tweak vertical scaling performance.
|
||||||
2
elements/cpu-pinning/element-deps
Normal file
2
elements/cpu-pinning/element-deps
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
install-static
|
||||||
|
package-installs
|
||||||
36
elements/cpu-pinning/environment.d/80-kernel-cpu-affinity
Normal file
36
elements/cpu-pinning/environment.d/80-kernel-cpu-affinity
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright Red Hat
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
case $DISTRO_NAME in
|
||||||
|
ubuntu | debian | fedora | centos* | rhel* )
|
||||||
|
DIB_BOOTLOADER_DEFAULT_CMDLINE+=" irqaffinity=0"
|
||||||
|
# This will be ignored on single vCPU systems
|
||||||
|
DIB_BOOTLOADER_DEFAULT_CMDLINE+=" isolcpus=1-N"
|
||||||
|
export DIB_BOOTLOADER_DEFAULT_CMDLINE
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR: Unsupported distribution $DISTRO_NAME"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
3
elements/cpu-pinning/package-installs.yaml
Normal file
3
elements/cpu-pinning/package-installs.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
irqbalance:
|
||||||
|
uninstall: True
|
||||||
|
tuned:
|
||||||
11
elements/cpu-pinning/post-install.d/20-enable-tuned
Normal file
11
elements/cpu-pinning/post-install.d/20-enable-tuned
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ "$DIB_INIT_SYSTEM" == "systemd" ]; then
|
||||||
|
systemctl enable $(svc-map tuned)
|
||||||
|
fi
|
||||||
3
elements/cpu-pinning/post-install.d/30-set-tuned-profile
Normal file
3
elements/cpu-pinning/post-install.d/30-set-tuned-profile
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
chmod +x /usr/lib/tuned/amphora/script.sh
|
||||||
1
elements/cpu-pinning/static/etc/tuned/active_profile
Normal file
1
elements/cpu-pinning/static/etc/tuned/active_profile
Normal file
@@ -0,0 +1 @@
|
|||||||
|
virtual-guest optimize-serial-console amphora
|
||||||
23
elements/cpu-pinning/static/etc/tuned/amphora/script.sh
Normal file
23
elements/cpu-pinning/static/etc/tuned/amphora/script.sh
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Comment the line in ...tuned/functions that fails on the amp:
|
||||||
|
# DISKS_SYS="$(command ls -d1 /sys/block/{sd,cciss,dm-,vd,dasd,xvd}* 2>/dev/null)"
|
||||||
|
sed -i 's/^DISKS_SYS=/#&/' /usr/lib/tuned/functions
|
||||||
|
. /usr/lib/tuned/functions
|
||||||
|
|
||||||
|
start() {
|
||||||
|
setup_kvm_mod_low_latency
|
||||||
|
disable_ksm
|
||||||
|
|
||||||
|
return "$?"
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
if [ "$1" = "full_rollback" ]; then
|
||||||
|
teardown_kvm_mod_low_latency
|
||||||
|
enable_ksm
|
||||||
|
fi
|
||||||
|
return "$?"
|
||||||
|
}
|
||||||
|
|
||||||
|
process $@
|
||||||
67
elements/cpu-pinning/static/etc/tuned/amphora/tuned.conf
Normal file
67
elements/cpu-pinning/static/etc/tuned/amphora/tuned.conf
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#
|
||||||
|
# tuned configuration
|
||||||
|
#
|
||||||
|
# Copyright Red Hat
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
[main]
|
||||||
|
summary=Customized profile for use on Octavia amphorae
|
||||||
|
include=network-latency
|
||||||
|
|
||||||
|
[variables]
|
||||||
|
isolated_cores=${f:cpulist_invert:0}
|
||||||
|
no_balance_cores=${isolated_cores}
|
||||||
|
|
||||||
|
# Fail if isolated_cores are not set
|
||||||
|
assert1=${f:assertion_non_equal:isolated_cores are set:${isolated_cores}:${isolated_cores_assert_check}}
|
||||||
|
|
||||||
|
# tmpdir
|
||||||
|
tmpdir=${f:strip:${f:exec:mktemp:-d}}
|
||||||
|
|
||||||
|
isolated_cores_expanded=${f:cpulist_unpack:${isolated_cores}}
|
||||||
|
isolated_cpumask=${f:cpulist2hex:${isolated_cores_expanded}}
|
||||||
|
not_isolated_cores_expanded=${f:cpulist_invert:${isolated_cores_expanded}}
|
||||||
|
isolated_cores_online_expanded=${f:cpulist_online:${isolated_cores}}
|
||||||
|
not_isolated_cores_online_expanded=${f:cpulist_online:${not_isolated_cores_expanded}}
|
||||||
|
not_isolated_cpumask=${f:cpulist2hex:${not_isolated_cores_expanded}}
|
||||||
|
# Make sure no_balance_cores is defined before
|
||||||
|
# no_balance_cores_expanded is defined, so that child profiles can set
|
||||||
|
# no_balance_cores directly in the profile (tuned.conf)
|
||||||
|
no_balance_cores_expanded=${f:cpulist_unpack:${no_balance_cores}}
|
||||||
|
|
||||||
|
# Fail if isolated_cores contains CPUs which are not online
|
||||||
|
assert2=${f:assertion:isolated_cores contains online CPU(s):${isolated_cores_expanded}:${isolated_cores_online_expanded}}
|
||||||
|
|
||||||
|
[sysctl]
|
||||||
|
kernel.numa_balancing=0
|
||||||
|
kernel.hung_task_timeout_secs = 600
|
||||||
|
vm.stat_interval = 10
|
||||||
|
# See https://bugzilla.redhat.com/show_bug.cgi?id=1797629
|
||||||
|
kernel.timer_migration = 0
|
||||||
|
|
||||||
|
[sysfs]
|
||||||
|
/sys/bus/workqueue/devices/writeback/cpumask = ${not_isolated_cpumask}
|
||||||
|
/sys/devices/virtual/workqueue/cpumask = ${not_isolated_cpumask}
|
||||||
|
/sys/devices/virtual/workqueue/*/cpumask = ${not_isolated_cpumask}
|
||||||
|
/sys/devices/system/machinecheck/machinecheck*/ignore_ce = 1
|
||||||
|
|
||||||
|
[systemd]
|
||||||
|
cpu_affinity=${not_isolated_cores_expanded}
|
||||||
|
|
||||||
|
[script]
|
||||||
|
script=${i:PROFILE_DIR}/script.sh
|
||||||
|
|
||||||
|
[scheduler]
|
||||||
|
isolated_cores=${isolated_cores}
|
||||||
|
ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*;^contrail-vroute$;^lcore-slave-.*;^rte_mp_handle$;^rte_mp_async$;^eal-intr-thread$
|
||||||
4
elements/cpu-pinning/svc-map
Normal file
4
elements/cpu-pinning/svc-map
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
tuned:
|
||||||
|
default: tuned
|
||||||
|
irqbalance:
|
||||||
|
default: irqbalance
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
The new "cpu-pinning" element optimizes the amphora image for better
|
||||||
|
vertical scaling. When an amphora flavor with multiple vCPUs is configured
|
||||||
|
it will configure the kernel to isolate (isolcpus)
|
||||||
|
all vCPUs except the first one.
|
||||||
|
Furthermore, it uninstalls irqbalance and sets the IRQ affinity to the
|
||||||
|
first CPU. That way the other CPUs are free to be used by HAProxy
|
||||||
|
exclusively. A new customized TuneD profile applies some more tweaks
|
||||||
|
for improving network latency.
|
||||||
|
This new feature is disabled by default, but can be enabled by running
|
||||||
|
`diskimage-create.sh` with the `-m` option or setting the
|
||||||
|
`AMP_ENABLE_CPUPINNING` environment variable to 1 before running the script.
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
Amphora vertical scaling optimizations require a new amphora image
|
||||||
|
build with the optional CPU pinning feature enabled in order
|
||||||
|
to become effective.
|
||||||
Reference in New Issue
Block a user