-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathnetwork-tunings.sh
More file actions
124 lines (93 loc) · 2.86 KB
/
Copy pathnetwork-tunings.sh
File metadata and controls
124 lines (93 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
set -euo pipefail
NETDEV_BUDGET="600"
PREFERRED_RX="4096"
FALLBACK_RX="2047"
DISPATCHER_SCRIPT="/etc/NetworkManager/dispatcher.d/45-ethtool"
SYSCTL_FILE="/etc/sysctl.d/99-netdev-budget.conf"
if [[ $EUID -ne 0 ]]; then
echo "Run this as root."
exit 1
fi
command -v ethtool >/dev/null || {
echo "ethtool is not installed. Install it first."
exit 1
}
get_physical_interfaces() {
for path in /sys/class/net/*; do
iface="$(basename "$path")"
[[ "$iface" == "lo" ]] && continue
[[ -d "$path/device" ]] || continue
echo "$iface"
done
}
detect_rx_size() {
local iface="$1"
if ethtool -G "$iface" rx "$PREFERRED_RX" >/dev/null 2>&1; then
echo "$PREFERRED_RX"
elif ethtool -G "$iface" rx "$FALLBACK_RX" >/dev/null 2>&1; then
echo "$FALLBACK_RX"
else
echo ""
fi
}
echo "Detecting physical interfaces..."
mapfile -t INTERFACES < <(get_physical_interfaces)
if [[ ${#INTERFACES[@]} -eq 0 ]]; then
echo "No physical interfaces found."
exit 1
fi
echo "Found interfaces: ${INTERFACES[*]}"
echo
echo "Testing and applying RX ring settings..."
declare -A RX_SIZE_BY_IFACE
for iface in "${INTERFACES[@]}"; do
rx_size="$(detect_rx_size "$iface")"
if [[ -n "$rx_size" ]]; then
RX_SIZE_BY_IFACE["$iface"]="$rx_size"
echo "$iface: using RX ring size $rx_size"
else
echo "$iface: could not set RX ring to $PREFERRED_RX or $FALLBACK_RX, skipping"
fi
done
echo
echo "Setting net.core.netdev_budget=$NETDEV_BUDGET"
sysctl -w net.core.netdev_budget="$NETDEV_BUDGET"
echo
echo "Writing static dispatcher script: $DISPATCHER_SCRIPT"
[[ -f "$DISPATCHER_SCRIPT" ]] && cp "$DISPATCHER_SCRIPT" "$DISPATCHER_SCRIPT.bak"
cat > "$DISPATCHER_SCRIPT" <<'EOF'
#!/bin/bash
EOF
for iface in "${INTERFACES[@]}"; do
rx_size="${RX_SIZE_BY_IFACE[$iface]:-}"
[[ -z "$rx_size" ]] && continue
cat >> "$DISPATCHER_SCRIPT" <<EOF
if [ "\$1" == "$iface" ] && [ "\$2" == "up" ]; then
ethtool -G "$iface" rx "$rx_size"
fi
EOF
done
chmod +x "$DISPATCHER_SCRIPT"
echo "Writing persistent sysctl config: $SYSCTL_FILE"
[[ -f "$SYSCTL_FILE" ]] && cp "$SYSCTL_FILE" "$SYSCTL_FILE.bak"
cat > "$SYSCTL_FILE" <<EOF
net.core.netdev_budget=$NETDEV_BUDGET
EOF
if ! sysctl -p "$SYSCTL_FILE" >/dev/null; then
echo "Warning: failed to apply sysctl settings from $SYSCTL_FILE" >&2
fi
echo
echo "Validating applied settings..."
ACTUAL_BUDGET="$(sysctl -n net.core.netdev_budget)"
if [[ "$ACTUAL_BUDGET" == "$NETDEV_BUDGET" ]]; then
echo "✓ net.core.netdev_budget correctly set to $NETDEV_BUDGET"
else
echo "✗ Warning: net.core.netdev_budget is $ACTUAL_BUDGET (expected $NETDEV_BUDGET)"
fi
echo
echo "Done."
echo "Dispatcher script created at: $DISPATCHER_SCRIPT"
echo "Sysctl persistence created at: $SYSCTL_FILE"
[[ -f "$DISPATCHER_SCRIPT.bak" ]] && echo "Backup saved at: $DISPATCHER_SCRIPT.bak"
[[ -f "$SYSCTL_FILE.bak" ]] && echo "Backup saved at: $SYSCTL_FILE.bak"