Sean Mooney | 224fe1b | 2023-08-07 19:30:31 +0000 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
| 3 | # Kernel Samepage Merging (KSM) |
| 4 | # ----------------------------- |
| 5 | |
| 6 | # Processes that mark their memory as mergeable can share identical memory |
| 7 | # pages if KSM is enabled. This is particularly useful for nova + libvirt |
| 8 | # backends but any other setup that marks its memory as mergeable can take |
| 9 | # advantage. The drawback is there is higher cpu load; however, we tend to |
| 10 | # be memory bound not cpu bound so enable KSM by default but allow people |
| 11 | # to opt out if the CPU time is more important to them. |
| 12 | ENABLE_KSM=$(trueorfalse True ENABLE_KSM) |
| 13 | ENABLE_KSMTUNED=$(trueorfalse True ENABLE_KSMTUNED) |
| 14 | function configure_ksm { |
| 15 | if [[ $ENABLE_KSMTUNED == "True" ]] ; then |
| 16 | install_package "ksmtuned" |
| 17 | fi |
| 18 | if [[ -f /sys/kernel/mm/ksm/run ]] ; then |
| 19 | echo $(bool_to_int ENABLE_KSM) | sudo tee /sys/kernel/mm/ksm/run |
| 20 | fi |
| 21 | } |
| 22 | |
| 23 | # Compressed swap (ZSWAP) |
| 24 | #------------------------ |
| 25 | |
| 26 | # as noted in the kernel docs https://docs.kernel.org/admin-guide/mm/zswap.html |
| 27 | # Zswap is a lightweight compressed cache for swap pages. |
| 28 | # It takes pages that are in the process of being swapped out and attempts |
| 29 | # to compress them into a dynamically allocated RAM-based memory pool. |
| 30 | # zswap basically trades CPU cycles for potentially reduced swap I/O. |
| 31 | # This trade-off can also result in a significant performance improvement |
| 32 | # if reads from the compressed cache are faster than reads from a swap device. |
| 33 | |
| 34 | ENABLE_ZSWAP=$(trueorfalse False ENABLE_ZSWAP) |
| 35 | # lz4 is very fast although it does not have the best compression |
| 36 | # zstd has much better compression but more latency |
| 37 | ZSWAP_COMPRESSOR=${ZSWAP_COMPRESSOR:="lz4"} |
| 38 | ZSWAP_ZPOOL=${ZSWAP_ZPOOL:="z3fold"} |
| 39 | function configure_zswap { |
Sean Mooney | 5c1736b | 2024-01-24 10:53:12 +0000 | [diff] [blame] | 40 | if [[ $ENABLE_ZSWAP == "True" ]] ; then |
Sean Mooney | 224fe1b | 2023-08-07 19:30:31 +0000 | [diff] [blame] | 41 | # Centos 9 stream seems to only support enabling but not run time |
| 42 | # tuning so dont try to choose better default on centos |
| 43 | if is_ubuntu; then |
| 44 | echo ${ZSWAP_COMPRESSOR} | sudo tee /sys/module/zswap/parameters/compressor |
| 45 | echo ${ZSWAP_ZPOOL} | sudo tee /sys/module/zswap/parameters/zpool |
| 46 | fi |
| 47 | echo 1 | sudo tee /sys/module/zswap/parameters/enabled |
| 48 | # print curent zswap kernel config |
| 49 | sudo grep -R . /sys/module/zswap/parameters || /bin/true |
| 50 | fi |
| 51 | } |
| 52 | |
| 53 | ENABLE_SYSCTL_MEM_TUNING=$(trueorfalse False ENABLE_SYSCTL_MEM_TUNING) |
| 54 | function configure_sysctl_mem_parmaters { |
| 55 | if [[ $ENABLE_SYSCTL_MEM_TUNING == "True" ]] ; then |
| 56 | # defer write when memory is available |
| 57 | sudo sysctl -w vm.dirty_ratio=60 |
| 58 | sudo sysctl -w vm.dirty_background_ratio=10 |
| 59 | sudo sysctl -w vm.vfs_cache_pressure=50 |
| 60 | # assume swap is compressed so on new kernels |
| 61 | # give it equal priority as page cache which is |
| 62 | # uncompressed. on kernels < 5.8 the max is 100 |
| 63 | # not 200 so it will strongly prefer swapping. |
| 64 | sudo sysctl -w vm.swappiness=100 |
| 65 | sudo grep -R . /proc/sys/vm/ || /bin/true |
| 66 | fi |
| 67 | } |
| 68 | |
| 69 | function configure_host_mem { |
| 70 | configure_zswap |
| 71 | configure_ksm |
| 72 | configure_sysctl_mem_parmaters |
| 73 | } |
| 74 | |
| 75 | ENABLE_SYSCTL_NET_TUNING=$(trueorfalse False ENABLE_SYSCTL_NET_TUNING) |
| 76 | function configure_sysctl_net_parmaters { |
| 77 | if [[ $ENABLE_SYSCTL_NET_TUNING == "True" ]] ; then |
| 78 | # detect dead TCP connections after 120 seconds |
| 79 | sudo sysctl -w net.ipv4.tcp_keepalive_time=60 |
| 80 | sudo sysctl -w net.ipv4.tcp_keepalive_intvl=10 |
| 81 | sudo sysctl -w net.ipv4.tcp_keepalive_probes=6 |
| 82 | # reudce network latency for new connections |
| 83 | sudo sysctl -w net.ipv4.tcp_fastopen=3 |
| 84 | # print tcp options |
| 85 | sudo grep -R . /proc/sys/net/ipv4/tcp* || /bin/true |
| 86 | # disable qos by default |
| 87 | sudo sysctl -w net.core.default_qdisc=pfifo_fast |
| 88 | fi |
| 89 | } |
| 90 | |
| 91 | function configure_host_net { |
| 92 | configure_sysctl_net_parmaters |
| 93 | } |
| 94 | |
| 95 | function tune_host { |
| 96 | configure_host_mem |
| 97 | configure_host_net |
huicoffee | 5f5255b | 2024-03-15 17:15:33 +0800 | [diff] [blame] | 98 | } |