This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push:
new 0331999 systemvm: improve SystemVM startup and memory usage (#3126)
0331999 is described below
commit 033199972ecf0c83975f2ae43c266e92c62ec1a0
Author: Paul Angus <[email protected]>
AuthorDate: Wed Jun 26 10:10:59 2019 +0100
systemvm: improve SystemVM startup and memory usage (#3126)
In order to reduce memory footprint and improve boot speed/predictability.
The following changes have been made:
- add vm.min_free_kbytes to sysctl
- periodically clear disk cache (depending on memory size)
- only start guest services specific to hypervisor
- use systemvm code to determine hypervisor type (not systemd)
- start cloud service at end of post init rather than through systemd
- reduce initial threads started for httpd
- fix vmtools config file
Fixes #3039
Signed-off-by: Rohit Yadav <[email protected]>
---
.../conf-enabled/mods-enabled/mpm_event.conf | 18 ++++++
systemvm/debian/etc/cron.daily/clear_cache | 5 ++
systemvm/debian/etc/cron.hourly/clear_cache | 8 +++
systemvm/debian/etc/sysctl.conf | 6 ++
systemvm/debian/etc/vmware-tools/tools.conf | 17 ++++++
.../systemd/system/baremetal-vr.service | 0
.../{etc => lib}/systemd/system/cloud.service | 2 +-
.../system/hyperv-daemons.hv-fcopy-daemon.service | 9 +++
.../system/hyperv-daemons.hv-kvp-daemon.service | 8 +++
.../system/hyperv-daemons.hv-vss-daemon.service | 8 +++
.../lib/systemd/system/open-vm-tools.service | 12 ++++
.../debian/lib/systemd/system/xe-daemon.service | 15 +++++
systemvm/debian/opt/cloud/bin/setup/bootstrap.sh | 67 ++++++++++++++--------
.../debian/opt/cloud/bin/setup/consoleproxy.sh | 13 +----
systemvm/debian/opt/cloud/bin/setup/postinit.sh | 15 +++--
systemvm/debian/opt/cloud/bin/setup/secstorage.sh | 17 ++----
.../scripts/configure_systemvm_services.sh | 15 ++++-
17 files changed, 181 insertions(+), 54 deletions(-)
diff --git
a/systemvm/debian/etc/apache2/conf-enabled/mods-enabled/mpm_event.conf
b/systemvm/debian/etc/apache2/conf-enabled/mods-enabled/mpm_event.conf
new file mode 100644
index 0000000..ea06042
--- /dev/null
+++ b/systemvm/debian/etc/apache2/conf-enabled/mods-enabled/mpm_event.conf
@@ -0,0 +1,18 @@
+# event MPM
+# StartServers: initial number of server processes to start
+# MinSpareThreads: minimum number of worker threads which are kept spare
+# MaxSpareThreads: maximum number of worker threads which are kept spare
+# ThreadsPerChild: constant number of worker threads in each server process
+# MaxRequestWorkers: maximum number of worker threads
+# MaxConnectionsPerChild: maximum number of requests a server process serves
+<IfModule mpm_event_module>
+ StartServers 1
+ MinSpareThreads 25
+ MaxSpareThreads 75
+ ThreadLimit 64
+ ThreadsPerChild 25
+ MaxRequestWorkers 30
+ MaxConnectionsPerChild 1000
+</IfModule>
+
+# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
diff --git a/systemvm/debian/etc/cron.daily/clear_cache
b/systemvm/debian/etc/cron.daily/clear_cache
new file mode 100755
index 0000000..e2662f9
--- /dev/null
+++ b/systemvm/debian/etc/cron.daily/clear_cache
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+# clear memory cache to ultimately reduce swapping
+
+sync && echo 1 > /proc/sys/vm/drop_caches
diff --git a/systemvm/debian/etc/cron.hourly/clear_cache
b/systemvm/debian/etc/cron.hourly/clear_cache
new file mode 100755
index 0000000..5daa167
--- /dev/null
+++ b/systemvm/debian/etc/cron.hourly/clear_cache
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# clear memory cache to ultimately reduce swapping
+
+phymem=$(free|awk '/^Mem:/{print $2}')
+if [ $phymem -lt 513000 ]; then
+ sync && echo 1 > /proc/sys/vm/drop_caches
+fi
diff --git a/systemvm/debian/etc/sysctl.conf b/systemvm/debian/etc/sysctl.conf
index 5b5f818..5dd1ae4 100644
--- a/systemvm/debian/etc/sysctl.conf
+++ b/systemvm/debian/etc/sysctl.conf
@@ -63,3 +63,9 @@ net.ipv6.conf.all.autoconf = 0
# Minimum swappiness without disabling it
vm.swappiness=1
+
+# make the kernel more aggressive in reclaiming RAM from the disk and swap
caches
+vm.vfs_cache_pressure = 200
+
+# try to maintain 'free' memory thereby reducing the size of disk cache, hence
reducing swapping.
+vm.min_free_kbytes = 20480
diff --git a/systemvm/debian/etc/vmware-tools/tools.conf
b/systemvm/debian/etc/vmware-tools/tools.conf
new file mode 100644
index 0000000..26f96ff
--- /dev/null
+++ b/systemvm/debian/etc/vmware-tools/tools.conf
@@ -0,0 +1,17 @@
+[logging]
+# Turns on logging globally. It can still be disabled for each domain.
+# log = true
+
+# Disables core dumps on fatal errors; they're enabled by default.
+enableCoreDump = false
+
+# Defines the "vmsvc" domain, logging to file
+# vmsvc.level = message
+vmsvc.handler = file
+# Setup file rotation - keep 3 files
+vmsvc.maxOldLogFiles = 2
+# Max log file size kept: 1 MB
+vmsvc.maxLogSize = 1
+
+# Defines the "vmtoolsd" domain, and disable logging for it.
+# vmtoolsd.level = none
diff --git a/systemvm/debian/etc/systemd/system/baremetal-vr.service
b/systemvm/debian/lib/systemd/system/baremetal-vr.service
similarity index 100%
rename from systemvm/debian/etc/systemd/system/baremetal-vr.service
rename to systemvm/debian/lib/systemd/system/baremetal-vr.service
diff --git a/systemvm/debian/etc/systemd/system/cloud.service
b/systemvm/debian/lib/systemd/system/cloud.service
similarity index 70%
rename from systemvm/debian/etc/systemd/system/cloud.service
rename to systemvm/debian/lib/systemd/system/cloud.service
index 2243923..e3824bf 100644
--- a/systemvm/debian/etc/systemd/system/cloud.service
+++ b/systemvm/debian/lib/systemd/system/cloud.service
@@ -1,6 +1,6 @@
[Unit]
Description=CloudStack Agent service
-After=cloud-early-config.service network.target local-fs.target
+After=cloud-early-config.service network.target cloud-postinit.service
local-fs.target
[Install]
WantedBy=multi-user.target
diff --git
a/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-fcopy-daemon.service
b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-fcopy-daemon.service
new file mode 100644
index 0000000..12a0b63
--- /dev/null
+++ b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-fcopy-daemon.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Hyper-V file copy service (FCOPY) daemon
+ConditionPathExists=/dev/vmbus/hv_fcopy
+
+[Service]
+ExecStart=/usr/sbin/hv_fcopy_daemon -n
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git
a/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-kvp-daemon.service
b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-kvp-daemon.service
new file mode 100644
index 0000000..534a25a
--- /dev/null
+++ b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-kvp-daemon.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Hyper-V key-value pair (KVP) daemon
+
+[Service]
+ExecStart=/usr/sbin/hv_kvp_daemon -n
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git
a/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-vss-daemon.service
b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-vss-daemon.service
new file mode 100644
index 0000000..d4fd675
--- /dev/null
+++ b/systemvm/debian/lib/systemd/system/hyperv-daemons.hv-vss-daemon.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Hyper-V volume shadow copy service (VSS) daemon
+
+[Service]
+ExecStart=/usr/sbin/hv_vss_daemon -n
+
+[Install]
+WantedBy=multi-user.target
diff --git a/systemvm/debian/lib/systemd/system/open-vm-tools.service
b/systemvm/debian/lib/systemd/system/open-vm-tools.service
new file mode 100644
index 0000000..e7cdde7
--- /dev/null
+++ b/systemvm/debian/lib/systemd/system/open-vm-tools.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Service for virtual machines hosted on VMware
+Documentation=http://open-vm-tools.sourceforge.net/about.php
+DefaultDependencies=no
+Before=cloud-early-config.service
+
+[Service]
+ExecStart=/usr/bin/vmtoolsd
+TimeoutStopSec=5
+
+[Install]
+WantedBy=multi-user.target
diff --git a/systemvm/debian/lib/systemd/system/xe-daemon.service
b/systemvm/debian/lib/systemd/system/xe-daemon.service
new file mode 100644
index 0000000..6dfef7b
--- /dev/null
+++ b/systemvm/debian/lib/systemd/system/xe-daemon.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Xen Guest Monitoring Agent
+DefaultDependencies=no
+After=local-fs.target
+Requires=proc-xen.mount
+Before=network.target cloud-early-config.service
+ConditionPathExists=/proc/xen/capabilities
+
+[Service]
+ExecStartPre=/usr/sbin/xe-linux-distribution /var/cache/xe-linux-distribution
+ExecStart=/usr/sbin/xe-daemon
+StandardOutput=journal+console
+
+[Install]
+WantedBy=multi-user.target
diff --git a/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
b/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
index 0208b36..5df59a4 100755
--- a/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
@@ -19,6 +19,9 @@
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
CMDLINE=/var/cache/cloud/cmdline
+rm -f /var/cache/cloud/enabled_svcs
+rm -f /var/cache/cloud/disabled_svcs
+
. /lib/lsb/init-functions
log_it() {
@@ -56,25 +59,25 @@ hypervisor() {
}
config_guest() {
- if [ "$HYPERVISOR" == "kvm" ]
- then
- # Configure hot-plug
- modprobe acpiphp || true
- modprobe pci_hotplug || true
- sed -i -e "/^s0:2345:respawn.*/d" /etc/inittab
- sed -i -e "/6:23:respawn/a\s0:2345:respawn:/sbin/getty -L 115200 ttyS0
vt102" /etc/inittab
- fi
[ ! -d /proc/xen ] && sed -i 's/^vc/#vc/' /etc/inittab && telinit q
- [ -d /proc/xen ] && sed -i 's/^#vc/vc/' /etc/inittab && telinit q
-}
+ [ -d /proc/xen ] && sed -i 's/^#vc/vc/' /etc/inittab && telinit q
+
+ systemctl daemon-reload
-get_boot_params() {
case $HYPERVISOR in
xen-pv|xen-domU)
+ systemctl stop ntpd
+ systemctl disable ntpd
+ systemctl start xe-daemon
+
cat /proc/cmdline > $CMDLINE
sed -i "s/%/ /g" $CMDLINE
;;
xen-hvm)
+ systemctl stop ntpd
+ systemctl disable ntpd
+ systemctl start xe-daemon
+
if [ ! -f /usr/bin/xenstore-read ]; then
log_it "ERROR: xentools not installed, cannot found xenstore-read"
&& exit 5
fi
@@ -82,7 +85,13 @@ get_boot_params() {
sed -i "s/%/ /g" $CMDLINE
;;
kvm)
+ # Configure hot-plug
+ modprobe acpiphp || true
+ modprobe pci_hotplug || true
+ sed -i -e "/^s0:2345:respawn.*/d" /etc/inittab
+ sed -i -e "/6:23:respawn/a\s0:2345:respawn:/sbin/getty -L 115200
ttyS0 vt102" /etc/inittab
systemctl enable --now qemu-guest-agent
+
# Wait for $CMDLINE file to be written by the qemu-guest-agent
for i in {1..60}; do
if [ -s $CMDLINE ]; then
@@ -96,13 +105,16 @@ get_boot_params() {
fi
;;
vmware)
+ # system time sync'd with host via vmware tools
+ systemctl stop ntpd
+ systemctl disable ntpd
+ systemctl start open-vm-tools
+
vmtoolsd --cmd 'machine.id.get' > $CMDLINE
;;
virtualpc|hyperv)
# Hyper-V is recognized as virtualpc hypervisor type. Boot args are
passed using KVP Daemon
- #waiting for the hv_kvp_daemon to start up
- #sleep need to fix the race condition of hv_kvp_daemon and
cloud-early-config
- [ -f /usr/sbin/hv_kvp_daemon ] && /usr/sbin/hv_kvp_daemon
+ systemctl start hyperv-daemons.hv-fcopy-daemon.service
hyperv-daemons.hv-kvp-daemon.service hyperv-daemons.hv-vss-daemon.service
sleep 5
cp -f /var/opt/hyperv/.kvp_pool_0 $CMDLINE
cat /dev/null > /var/opt/hyperv/.kvp_pool_0
@@ -117,13 +129,11 @@ get_boot_params() {
fi
;;
esac
-}
-get_systemvm_type() {
+ # Find and export guest type
export TYPE=$(grep -Po 'type=\K[a-zA-Z]*' $CMDLINE)
}
-
patch_systemvm() {
local patchfile=$1
local backupfolder="/tmp/.conf.backup"
@@ -172,19 +182,29 @@ patch() {
return 0
}
+config_sysctl() {
+ # When there is more memory reset the cache back pressure to default 100
+ physmem=$(free|awk '/^Mem:/{print $2}')
+ if [ $((physmem)) -lt 409600 ]; then
+ sed -i "/^vm.vfs_cache_pressure/ c\vm.vfs_cache_pressure = 200"
/etc/sysctl.conf
+ else
+ sed -i "/^vm.vfs_cache_pressure/ c\vm.vfs_cache_pressure = 100"
/etc/sysctl.conf
+ fi
+
+ sync
+ sysctl -p
+}
+
bootstrap() {
log_it "Bootstrapping systemvm appliance"
export HYPERVISOR=$(hypervisor)
- [ $? -ne 0 ] && log_it "Failed to detect hypervisor type, bailing out of
early init" && exit 10
- log_it "Detected that we are running inside $HYPERVISOR"
+ [ $? -ne 0 ] && log_it "Failed to detect hypervisor type, bailing out" &&
exit 10
+ log_it "Starting guest services for $HYPERVISOR"
config_guest
- get_boot_params
- get_systemvm_type
patch
- sync
- sysctl -p
+ config_sysctl
log_it "Configuring systemvm type=$TYPE"
if [ -f "/opt/cloud/bin/setup/$TYPE.sh" ]; then
@@ -192,6 +212,7 @@ bootstrap() {
else
/opt/cloud/bin/setup/default.sh
fi
+
log_it "Finished setting up systemvm"
exit 0
}
diff --git a/systemvm/debian/opt/cloud/bin/setup/consoleproxy.sh
b/systemvm/debian/opt/cloud/bin/setup/consoleproxy.sh
index 225dc6f..3f00f3d 100755
--- a/systemvm/debian/opt/cloud/bin/setup/consoleproxy.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/consoleproxy.sh
@@ -18,14 +18,13 @@
. /opt/cloud/bin/setup/common.sh
-consoleproxy_svcs() {
+setup_console_proxy() {
+ log_it "Setting up console proxy system vm"
+
echo "cloud" > /var/cache/cloud/enabled_svcs
echo "haproxy dnsmasq apache2 nfs-common portmap" >
/var/cache/cloud/disabled_svcs
mkdir -p /var/log/cloud
-}
-setup_console_proxy() {
- log_it "Setting up console proxy system vm"
setup_common eth0 eth1 eth2
setup_system_rfc1918_internal
@@ -51,10 +50,4 @@ setup_console_proxy() {
rm -f /etc/logrotate.d/cloud
}
-consoleproxy_svcs
-if [ $? -gt 0 ]
-then
- log_it "Failed to execute consoleproxy_svcs"
- exit 1
-fi
setup_console_proxy
diff --git a/systemvm/debian/opt/cloud/bin/setup/postinit.sh
b/systemvm/debian/opt/cloud/bin/setup/postinit.sh
index fc92b7e..5e7e4c0 100755
--- a/systemvm/debian/opt/cloud/bin/setup/postinit.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/postinit.sh
@@ -29,36 +29,39 @@ if [ "$TYPE" == "router" ] || [ "$TYPE" == "vpcrouter" ] ||
[ "$TYPE" == "dhcpsr
then
if [ -x /opt/cloud/bin/update_config.py ]
then
- /opt/cloud/bin/update_config.py cmd_line.json || true
+ /opt/cloud/bin/update_config.py cmd_line.json || true
fi
fi
[ ! -f /var/cache/cloud/enabled_svcs ] && touch /var/cache/cloud/enabled_svcs
for svc in $(cat /var/cache/cloud/enabled_svcs)
do
- systemctl enable --now --no-block $svc
+ systemctl enable --now --no-block $svc
done
[ ! -f /var/cache/cloud/disabled_svcs ] && touch /var/cache/cloud/disabled_svcs
for svc in $(cat /var/cache/cloud/disabled_svcs)
do
- systemctl disable --now --no-block $svc
+ systemctl disable --now --no-block $svc
done
# Restore the persistent iptables nat, rules and filters for IPv4 and IPv6 if
they exist
ipv4="/etc/iptables/rules.v4"
if [ -e $ipv4 ]
then
- iptables-restore < $ipv4
+ iptables-restore < $ipv4
fi
ipv6="/etc/iptables/rules.v6"
if [ -e $ipv6 ]
then
- ip6tables-restore < $ipv6
+ ip6tables-restore < $ipv6
fi
-# Enable SSH
+# Patch known systemd/sshd memory leak -
https://github.com/systemd/systemd/issues/8015#issuecomment-476160981
+echo '@include null' >> /etc/pam.d/systemd-user
+
+# Enable and Start SSH
systemctl enable --now --no-block ssh
date > /var/cache/cloud/boot_up_done
diff --git a/systemvm/debian/opt/cloud/bin/setup/secstorage.sh
b/systemvm/debian/opt/cloud/bin/setup/secstorage.sh
index 8b6d4ee..d3a6d21 100755
--- a/systemvm/debian/opt/cloud/bin/setup/secstorage.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/secstorage.sh
@@ -18,15 +18,12 @@
. /opt/cloud/bin/setup/common.sh
-secstorage_svcs() {
- echo "apache2 cloud nfs-common portmap" > /var/cache/cloud/enabled_svcs
- echo "conntrackd keepalived haproxy dnsmasq" > /var/cache/cloud/disabled_svcs
- mkdir -p /var/log/cloud
-}
-
setup_secstorage() {
log_it "Setting up secondary storage system vm"
- sysctl vm.min_free_kbytes=8192
+
+ echo "cloud apache2 nfs-common portmap" > /var/cache/cloud/enabled_svcs
+ echo "conntrackd keepalived haproxy dnsmasq" > /var/cache/cloud/disabled_svcs
+ mkdir -p /var/log/cloud
setup_common eth0 eth1 eth2
setup_storage_network
@@ -80,10 +77,4 @@ CORS
rm -f /etc/logrotate.d/cloud
}
-secstorage_svcs
-if [ $? -gt 0 ]
-then
- log_it "Failed to execute secstorage_svcs"
- exit 1
-fi
setup_secstorage
diff --git
a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
index 78d868d..56406b7 100644
--- a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
+++ b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
@@ -46,7 +46,7 @@ function install_cloud_scripts() {
rsync -av ./cloud_scripts/ /
chmod +x /opt/cloud/bin/* /opt/cloud/bin/setup/* \
/root/{clearUsageRules.sh,reconfigLB.sh,monitorServices.py} \
- /etc/profile.d/cloud.sh
+ /etc/profile.d/cloud.sh /etc/cron.daily/* /etc/cron.hourly/*
chmod -x /etc/systemd/system/*
@@ -64,6 +64,7 @@ function do_signature() {
function configure_issue() {
cat > /etc/issue <<EOF
+ESC [ 2J
__?.o/ Apache CloudStack SystemVM $CLOUDSTACK_RELEASE
( )# https://cloudstack.apache.org
(___(_) Debian GNU/Linux 9 \n \l
@@ -108,6 +109,18 @@ function configure_services() {
systemctl disable strongswan
systemctl disable x11-common
systemctl disable xl2tpd
+ systemctl disable vgauth
+ systemctl disable sshd
+ systemctl disable nfs-common
+ systemctl disable portmap
+
+ # Disable guest services which will selectively be started based on
hypervisor
+ systemctl disable open-vm-tools
+ systemctl disable xe-daemon
+ systemctl disable hyperv-daemons.hv-fcopy-daemon.service
+ systemctl disable hyperv-daemons.hv-kvp-daemon.service
+ systemctl disable hyperv-daemons.hv-vss-daemon.service
+ systemctl disable qemu-guest-agent
configure_apache2
configure_strongswan