#!/bin/bash

# Kernel Samepage Merging (KSM)
# -----------------------------

# Processes that mark their memory as mergeable can share identical memory
# pages if KSM is enabled. This is particularly useful for nova + libvirt
# backends but any other setup that marks its memory as mergeable can take
# advantage. The drawback is there is higher cpu load; however, we tend to
# be memory bound not cpu bound so enable KSM by default but allow people
# to opt out if the CPU time is more important to them.
ENABLE_KSM=$(trueorfalse True ENABLE_KSM)
ENABLE_KSMTUNED=$(trueorfalse True ENABLE_KSMTUNED)
function configure_ksm {
    if [[ $ENABLE_KSMTUNED == "True" ]] ; then
        install_package "ksmtuned"
    fi
    if [[ -f /sys/kernel/mm/ksm/run ]] ; then
        echo $(bool_to_int ENABLE_KSM) | sudo tee /sys/kernel/mm/ksm/run
    fi
}

# Compressed swap (ZSWAP)
#------------------------

# as noted in the kernel docs https://docs.kernel.org/admin-guide/mm/zswap.html
# Zswap is a lightweight compressed cache for swap pages.
# It takes pages that are in the process of being swapped out and attempts
# to compress them into a dynamically allocated RAM-based memory pool.
# zswap basically trades CPU cycles for potentially reduced swap I/O.
# This trade-off can also result in a significant performance improvement
# if reads from the compressed cache are faster than reads from a swap device.

ENABLE_ZSWAP=$(trueorfalse False ENABLE_ZSWAP)
# lz4 is very fast although it does not have the best compression
# zstd has much better compression but more latency
ZSWAP_COMPRESSOR=${ZSWAP_COMPRESSOR:="lz4"}
ZSWAP_ZPOOL=${ZSWAP_ZPOOL:="z3fold"}
function configure_zswap {
    if [[ $ENABLE_ZSWAP == "True" ]] ; then
        # Centos 9 stream seems to only support enabling but not run time
        # tuning so dont try to choose better default on centos
        if is_ubuntu; then
            echo ${ZSWAP_COMPRESSOR} | sudo tee /sys/module/zswap/parameters/compressor
            echo ${ZSWAP_ZPOOL} | sudo tee /sys/module/zswap/parameters/zpool
        fi
        echo 1 | sudo tee /sys/module/zswap/parameters/enabled
        # print curent zswap kernel config
        sudo grep -R . /sys/module/zswap/parameters || /bin/true
    fi
}

ENABLE_SYSCTL_MEM_TUNING=$(trueorfalse False ENABLE_SYSCTL_MEM_TUNING)
function configure_sysctl_mem_parmaters {
    if [[ $ENABLE_SYSCTL_MEM_TUNING == "True" ]] ; then
        # defer write when memory is available
        sudo sysctl -w vm.dirty_ratio=60
        sudo sysctl -w vm.dirty_background_ratio=10
        sudo sysctl -w vm.vfs_cache_pressure=50
        # assume swap is compressed so on new kernels
        # give it equal priority as page cache which is
        # uncompressed. on kernels < 5.8 the max is 100
        # not 200 so it will strongly prefer swapping.
        sudo sysctl -w vm.swappiness=100
        sudo grep -R . /proc/sys/vm/  || /bin/true
    fi
}

function configure_host_mem {
    configure_zswap
    configure_ksm
    configure_sysctl_mem_parmaters
}

ENABLE_SYSCTL_NET_TUNING=$(trueorfalse False ENABLE_SYSCTL_NET_TUNING)
function configure_sysctl_net_parmaters {
    if [[ $ENABLE_SYSCTL_NET_TUNING == "True" ]] ; then
        # detect dead TCP connections after 120 seconds
        sudo sysctl -w net.ipv4.tcp_keepalive_time=60
        sudo sysctl -w net.ipv4.tcp_keepalive_intvl=10
        sudo sysctl -w net.ipv4.tcp_keepalive_probes=6
        # reudce network latency for new connections
        sudo sysctl -w net.ipv4.tcp_fastopen=3
        # print tcp options
        sudo grep -R . /proc/sys/net/ipv4/tcp* || /bin/true
        # disable qos by default
        sudo sysctl -w net.core.default_qdisc=pfifo_fast
    fi
}

function configure_host_net {
    configure_sysctl_net_parmaters
}

function tune_host {
    configure_host_mem
    configure_host_net
}
