#!/bin/bash # Rocky9 compatible # script to tune network settings for better VoIP performance . /usr/src/k_framework/main.sh # ---- VARS ----- SCRIPT_NAME="Network Tune" VERSION="1.1.7" TX_QUEUELEN_MAX=20000 NF_CONNTRACK_MAX=1000000 NF_CONNTRACK_TIMEOUT_MAX=7200 IP_DEFAULT_TTL=253 MEM_MAX=6553600 BACKLOG=2000 TEST=0 # 1 - do not execute changes # ---- FUNCTIONS ----- set_ring_buffers() { k_detect_vm if [[ $VM_DETECTED == 1 ]]; then report "VM detected: $VM_TYPE. Skipping ETH Ring Buffer tune" 3 return fi report "Setting ring-buffers for $1" 3 MAX_RX=`ethtool -g $1 | grep -m 1 RX: | awk '{print $2}'` MAX_TX=`ethtool -g $1 | grep -m 1 TX: | awk '{print $2}'` report " Max RX: $MAX_RX" 0 report " Max TX: $MAX_TX" 0 ethtool -G $1 rx $MAX_RX tx $MAX_TX > /dev/null 2>&1 } configure_network() { report "Configuring network" 3 k_set_sysctl net.ipv4.conf.all.arp_announce 2 k_set_sysctl net.ipv4.conf.all.arp_ignore 1 k_set_sysctl net.ipv4.conf.all.rp_filter 0 k_set_sysctl net.ipv4.ip_default_ttl $IP_DEFAULT_TTL # not supported on older kernels? #k_set_sysctl net.netfilter.nf_conntrack_max $NF_CONNTRACK_MAX #k_set_sysctl net.netfilter.nf_conntrack_tcp_timeout_established $NF_CONNTRACK_TIMEOUT_MAX k_set_sysctl net.core.wmem_max $MEM_MAX k_set_sysctl net.core.wmem_default $MEM_MAX k_set_sysctl net.core.rmem_max $MEM_MAX k_set_sysctl net.core.rmem_default $MEM_MAX # This causes No audio for kernelized streams on Rocky #k_set_sysctl net.core.default_qdisc fq k_set_sysctl net.core.netdev_max_backlog $BACKLOG ETHS=`netstat -i | tail -n +3 | awk '{print $1}' | grep -v 'lo'` for ETH in $ETHS do report "Configuring NIC: $ETH" 3 report " Set txqueuelen $TX_QUEUELEN_MAX" 0 ifconfig $ETH txqueuelen $TX_QUEUELEN_MAX report " Set autoneg off rx off tx off" 0 ethtool -A $ETH autoneg off rx off tx off > /dev/null 2>&1 report " Set rp_filter = 0" 0 echo 0 > /proc/sys/net/ipv4/conf/$ETH/rp_filter report " Set TSO off" 0 ethtool -K $ETH tso off report " Set coalesce (hw interrupts) rx-usecs 1022" 0 ethtool -C $ETH rx-usecs 1022 > /dev/null 2>&1 set_ring_buffers $ETH done # reload /etc/sysctl.conf sysctl -p > /dev/null } check_permission() { if [ `whoami` != "root" ];then report "Need root permission" 1 k_exit 1 fi } # ---- MAIN ----- k_start if [ "$TEST" == "1" ]; then report "***** TEST MODE ON. Changes will not be applied *****" 8 fi if command -v netstat | grep -q netstat; then report "netstat present" 0 else report "Installing netstat" 3 yum -y install net-tools fi check_permission configure_network # run on reboot if cat /etc/crontab | grep -q "@reboot root /usr/src/k_framework/maintenance/network_tune.sh >> /var/log/network_tune.log"; then report "Script startup already enabled" 0 else echo "@reboot root /usr/src/k_framework/maintenance/network_tune.sh >> /var/log/network_tune.log" >> /etc/crontab report "Script startup enabled" 0 fi k_exit $EXIT_CODE