Skip to content

Commit 1c53bf9

Browse files
committed
ZTS: Optimize ksm settings and caching
Don't use KSM on the FreeBSD VMs and optimize ksm settings for faster ZTS test runs. Free kernel caches on Linux VMs via cron, to get more usable memory on them. Signed-off-by: Tino Reichardt <[email protected]>
1 parent f099904 commit 1c53bf9

File tree

7 files changed

+90
-78
lines changed

7 files changed

+90
-78
lines changed

.github/workflows/scripts/qemu-1-setup.sh

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,12 @@ set -eu
1010
export DEBIAN_FRONTEND="noninteractive"
1111
sudo apt-get -y update
1212
sudo apt-get install -y axel cloud-image-utils daemonize guestfs-tools \
13-
ksmtuned virt-manager linux-modules-extra-$(uname -r) zfsutils-linux
13+
virt-manager linux-modules-extra-$(uname -r) zfsutils-linux
1414

1515
# generate ssh keys
1616
rm -f ~/.ssh/id_ed25519
1717
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N ""
1818

19-
# we expect RAM shortage
20-
cat << EOF | sudo tee /etc/ksmtuned.conf > /dev/null
21-
# /etc/ksmtuned.conf - Configuration file for ksmtuned
22-
# https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/virtualization_tuning_and_optimization_guide/chap-ksm
23-
KSM_MONITOR_INTERVAL=60
24-
25-
# Millisecond sleep between ksm scans for 16Gb server.
26-
# Smaller servers sleep more, bigger sleep less.
27-
KSM_SLEEP_MSEC=30
28-
29-
KSM_NPAGES_BOOST=0
30-
KSM_NPAGES_DECAY=0
31-
KSM_NPAGES_MIN=1000
32-
KSM_NPAGES_MAX=25000
33-
34-
KSM_THRES_COEF=80
35-
KSM_THRES_CONST=8192
36-
37-
LOGFILE=/var/log/ksmtuned.log
38-
DEBUG=1
39-
EOF
40-
sudo systemctl restart ksm
41-
sudo systemctl restart ksmtuned
42-
4319
# not needed
4420
sudo systemctl stop docker.socket
4521
sudo systemctl stop multipathd.socket
@@ -69,11 +45,11 @@ sleep 1
6945
sudo mkswap $DISK-part1
7046
sudo swapon $DISK-part1
7147

72-
# 60GB data disk
48+
# disk for operating system
7349
SSD1="$DISK-part2"
7450

75-
# 10GB data disk on ext4
76-
sudo fallocate -l 10G /test.ssd1
51+
# data disk on ext4
52+
sudo fallocate -l 12G /test.ssd1
7753
SSD2=$(sudo losetup -b 4096 -f /test.ssd1 --show)
7854

7955
# adjust zfs module parameter and create pool
@@ -89,5 +65,5 @@ sudo zpool create -f -o ashift=12 zpool $SSD1 $SSD2 \
8965

9066
# no need for some scheduler
9167
for i in /sys/block/s*/queue/scheduler; do
92-
echo "none" | sudo tee $i > /dev/null
68+
echo "none" | sudo tee $i
9369
done

.github/workflows/scripts/qemu-2-start.sh

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ echo "ENV=$ENV" >> $ENV
150150
# result path
151151
echo 'RESPATH="/var/tmp/test_results"' >> $ENV
152152

153-
# FreeBSD 13 has problems with: e1000+virtio
153+
# FreeBSD 13 has problems with: e1000 and virtio
154154
echo "NIC=$NIC" >> $ENV
155155

156156
# freebsd15 -> used in zfs-qemu.yml
@@ -162,6 +162,14 @@ echo "OSv=\"$OSv\"" >> $ENV
162162
# FreeBSD 15 (Current) -> used for summary
163163
echo "OSNAME=\"$OSNAME\"" >> $ENV
164164

165+
# default vm count for testings
166+
VMs=2
167+
echo "VMs=\"$VMs\"" >> $ENV
168+
169+
# default cpu count for testing vm's
170+
CPU=2
171+
echo "CPU=\"$CPU\"" >> $ENV
172+
165173
sudo mkdir -p "/mnt/tests"
166174
sudo chown -R $(whoami) /mnt/tests
167175

@@ -180,6 +188,7 @@ fi
180188
DISK="/dev/zvol/zpool/openzfs"
181189
FORMAT="raw"
182190
sudo zfs create -ps -b 64k -V 80g zpool/openzfs
191+
sudo zfs set sync=disabled redundant_metadata=none zpool/openzfs
183192
while true; do test -b $DISK && break; sleep 1; done
184193
echo "Importing VM image to zvol..."
185194
sudo qemu-img dd -f qcow2 -O raw if=$IMG of=$DISK bs=4M
@@ -223,12 +232,19 @@ sudo virt-install \
223232
--disk $DISK,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
224233
--import --noautoconsole >/dev/null
225234

235+
# enable KSM on Linux
236+
if [ $(uname) = "Linux" ]; then
237+
sudo virsh dommemstat --domain "openzfs" --period 5
238+
sudo virsh node-memory-tune 500 100 1
239+
echo 1 | sudo tee /sys/kernel/mm/ksm/run > /dev/null
240+
fi
241+
226242
# Give the VMs hostnames so we don't have to refer to them with
227243
# hardcoded IP addresses.
228244
#
229245
# vm0: Initial VM we install dependencies and build ZFS on.
230246
# vm1..2 Testing VMs
231-
for i in {0..9} ; do
247+
for ((i=0; i<=VMs; i++)); do
232248
echo "192.168.122.1$i vm$i" | sudo tee -a /etc/hosts
233249
done
234250

.github/workflows/scripts/qemu-3-deps-vm.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ function debian() {
3232

3333
echo "##[group]Install Development Tools"
3434
sudo apt-get install -y \
35-
acl alien attr autoconf bc cpio cryptsetup curl dbench dh-python dkms \
36-
fakeroot fio gdb gdebi git ksh lcov isc-dhcp-client jq libacl1-dev \
35+
acl alien attr autoconf bc cpio cron cryptsetup curl dbench dh-python \
36+
dkms fakeroot fio gdb gdebi git ksh lcov isc-dhcp-client jq libacl1-dev \
3737
libaio-dev libattr1-dev libblkid-dev libcurl4-openssl-dev libdevmapper-dev \
3838
libelf-dev libffi-dev libmount-dev libpam0g-dev libselinux-dev libssl-dev \
3939
libtool libtool-bin libudev-dev libunwind-dev linux-headers-$(uname -r) \
@@ -77,8 +77,8 @@ function rhel() {
7777
fi
7878

7979
sudo dnf install -y \
80-
acl attr bc bzip2 cryptsetup curl dbench dkms elfutils-libelf-devel fio \
81-
gdb git jq kernel-rpm-macros ksh libacl-devel libaio-devel \
80+
acl attr bc bzip2 cronie cryptsetup curl dbench dkms elfutils-libelf-devel \
81+
fio gdb git jq kernel-rpm-macros ksh libacl-devel libaio-devel \
8282
libargon2-devel libattr-devel libblkid-devel libcurl-devel libffi-devel \
8383
ncompress libselinux-devel libtirpc-devel libtool libudev-devel \
8484
libuuid-devel lsscsi mdadm nfs-utils openssl-devel pam-devel pamtester \

.github/workflows/scripts/qemu-5-setup.sh

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,50 @@ PID=$(pidof /usr/bin/qemu-system-x86_64)
1414
tail --pid=$PID -f /dev/null
1515
sudo virsh undefine openzfs
1616

17-
# default values per test vm:
18-
VMs=2
19-
CPU=2
20-
2117
# cpu pinning
2218
CPUSET=("0,1" "2,3")
2319

2420
case "$OS" in
2521
freebsd*)
26-
# FreeBSD can't be optimized via ksmtuned
22+
# FreeBSD needs only 6GiB
2723
RAM=6
2824
;;
2925
*)
30-
# Linux can be optimized via ksmtuned
31-
RAM=8
26+
# Linux needs more memory, but can be optimized to share it via KSM
27+
RAM=7
3228
;;
3329
esac
3430

35-
# this can be different for each distro
36-
echo "VMs=$VMs" >> $ENV
37-
3831
# create snapshot we can clone later
3932
sudo zfs snapshot zpool/openzfs@now
4033

4134
# setup the testing vm's
4235
PUBKEY=$(cat ~/.ssh/id_ed25519.pub)
43-
for i in $(seq 1 $VMs); do
4436

37+
# generate some memory stats
38+
cat <<EOF > cronjob.sh
39+
exec 1>>/var/tmp/stats.txt
40+
exec 2>&1
41+
echo "********************************************************************************"
42+
uptime
43+
free -m
44+
zfs list
45+
EOF
46+
47+
sudo chmod +x cronjob.sh
48+
sudo mv -f cronjob.sh /root/cronjob.sh
49+
echo '*/5 * * * * /root/cronjob.sh' > crontab.txt
50+
sudo crontab crontab.txt
51+
rm crontab.txt
52+
53+
# start testing VMs
54+
for ((i=1; i<=VMs; i++)); do
4555
echo "Creating disk for vm$i..."
4656
DISK="/dev/zvol/zpool/vm$i"
4757
FORMAT="raw"
48-
sudo zfs clone zpool/openzfs@now zpool/vm$i
49-
sudo zfs create -ps -b 64k -V 80g zpool/vm$i-2
58+
sudo zfs clone zpool/openzfs@now zpool/vm$i-system
59+
sudo zfs create -ps -b 128k -V 64g zpool/vm$i-tests
60+
sudo zfs set sync=disabled redundant_metadata=none zpool/vm$i-tests
5061

5162
cat <<EOF > /tmp/user-data
5263
#cloud-config
@@ -83,40 +94,22 @@ EOF
8394
--graphics none \
8495
--cloud-init user-data=/tmp/user-data \
8596
--network bridge=virbr0,model=$NIC,mac="52:54:00:83:79:0$i" \
86-
--disk $DISK,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
87-
--disk $DISK-2,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
97+
--disk $DISK-system,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
98+
--disk $DISK-tests,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
8899
--import --noautoconsole >/dev/null
89100
done
90101

91-
# check the memory state from time to time
92-
cat <<EOF > cronjob.sh
93-
# $OS
94-
exec 1>>/var/tmp/stats.txt
95-
exec 2>&1
96-
echo "*******************************************************"
97-
date
98-
uptime
99-
free -m
100-
df -h /mnt/tests
101-
zfs list
102-
EOF
103-
sudo chmod +x cronjob.sh
104-
sudo mv -f cronjob.sh /root/cronjob.sh
105-
echo '*/5 * * * * /root/cronjob.sh' > crontab.txt
106-
sudo crontab crontab.txt
107-
rm crontab.txt
108-
109102
# check if the machines are okay
110103
echo "Waiting for vm's to come up... (${VMs}x CPU=$CPU RAM=$RAM)"
111-
for i in $(seq 1 $VMs); do
104+
for ((i=1; i<=VMs; i++)); do
112105
.github/workflows/scripts/qemu-wait-for-vm.sh vm$i
113106
done
114107
echo "All $VMs VMs are up now."
115108

116109
# Save the VM's serial output (ttyS0) to /var/tmp/console.txt
117110
# - ttyS0 on the VM corresponds to a local /dev/pty/N entry
118111
# - use 'virsh ttyconsole' to lookup the /dev/pty/N entry
119-
for i in $(seq 1 $VMs); do
112+
for ((i=1; i<=VMs; i++)); do
120113
mkdir -p $RESPATH/vm$i
121114
read "pty" <<< $(sudo virsh ttyconsole vm$i)
122115
sudo nohup bash -c "cat $pty > $RESPATH/vm$i/console.txt" &

.github/workflows/scripts/qemu-6-tests.sh

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ if [ -z ${1:-} ]; then
4545
echo 0 > /tmp/ctr
4646
date "+%s" > /tmp/tsstart
4747

48-
for i in $(seq 1 $VMs); do
48+
for ((i=1; i<=VMs; i++)); do
4949
IP="192.168.122.1$i"
5050
daemonize -c /var/tmp -p vm${i}.pid -o vm${i}log.txt -- \
5151
$SSH zfs@$IP $TESTS $OS $i $VMs $CI_TYPE
@@ -58,7 +58,7 @@ if [ -z ${1:-} ]; then
5858
done
5959

6060
# wait for all vm's to finish
61-
for i in $(seq 1 $VMs); do
61+
for ((i=1; i<=VMs; i++)); do
6262
tail --pid=$(cat vm${i}.pid) -f /dev/null
6363
pid=$(cat vm${i}log.pid)
6464
rm -f vm${i}log.pid
@@ -72,19 +72,46 @@ fi
7272
export PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
7373
case "$1" in
7474
freebsd*)
75+
TDIR="/usr/local/share/zfs"
7576
sudo kldstat -n zfs 2>/dev/null && sudo kldunload zfs
7677
sudo -E ./zfs/scripts/zfs.sh
77-
TDIR="/usr/local/share/zfs"
78+
sudo mv -f /var/tmp/*.txt /tmp
79+
sudo newfs -U -t -L tmp /dev/vtbd1 >/dev/null
80+
sudo mount -o noatime /dev/vtbd1 /var/tmp
81+
sudo chmod 1777 /var/tmp
82+
sudo mv -f /tmp/*.txt /var/tmp
7883
;;
7984
*)
8085
# use xfs @ /var/tmp for all distros
86+
TDIR="/usr/share/zfs"
87+
sudo -E modprobe zfs
8188
sudo mv -f /var/tmp/*.txt /tmp
8289
sudo mkfs.xfs -fq /dev/vdb
8390
sudo mount -o noatime /dev/vdb /var/tmp
8491
sudo chmod 1777 /var/tmp
8592
sudo mv -f /tmp/*.txt /var/tmp
86-
sudo -E modprobe zfs
87-
TDIR="/usr/share/zfs"
93+
94+
# no info messages about dropping caches in kernel log
95+
echo 4 | sudo tee /proc/sys/vm/drop_caches >/dev/null
96+
97+
# check the memory state from time to time
98+
cat <<EOF > cronjob.sh
99+
exec 1>>/var/tmp/stats.txt
100+
exec 2>&1
101+
echo "********************************************************************************"
102+
uptime
103+
free -m
104+
# don't waste memory with buffering
105+
echo "dropped caches:"
106+
sync
107+
echo 3 > /proc/sys/vm/drop_caches
108+
free -m
109+
EOF
110+
sudo chmod +x cronjob.sh
111+
sudo mv -f cronjob.sh /root/cronjob.sh
112+
echo '*/2 * * * * /root/cronjob.sh' > crontab.txt
113+
sudo crontab crontab.txt
114+
rm crontab.txt
88115
;;
89116
esac
90117

.github/workflows/scripts/qemu-7-prepare.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ BASE="$HOME/work/zfs/zfs"
2828
MERGE="$BASE/.github/workflows/scripts/merge_summary.awk"
2929

3030
# catch result files of testings (vm's should be there)
31-
for i in $(seq 1 $VMs); do
31+
for ((i=1; i<=VMs; i++)); do
3232
rsync -arL zfs@vm$i:$RESPATH/current $RESPATH/vm$i || true
3333
scp zfs@vm$i:"/var/tmp/*.txt" $RESPATH/vm$i || true
3434
scp zfs@vm$i:"/var/tmp/*.rpm" $RESPATH/vm$i || true
@@ -37,7 +37,7 @@ cp -f /var/tmp/*.txt $RESPATH || true
3737
cd $RESPATH
3838

3939
# prepare result files for summary
40-
for i in $(seq 1 $VMs); do
40+
for ((i=1; i<=VMs; i++)); do
4141
file="vm$i/build-stderr.txt"
4242
test -s $file && mv -f $file build-stderr.txt
4343

.github/workflows/scripts/qemu-8-summary.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fi
4545

4646
echo -e "\nFull logs for download:\n $1\n"
4747

48-
for i in $(seq 1 $VMs); do
48+
for ((i=1; i<=VMs; i++)); do
4949
rv=$(cat vm$i/tests-exitcode.txt)
5050

5151
if [ $rv = 0 ]; then

0 commit comments

Comments
 (0)