#!/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:="zsmalloc"}
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
}
