mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-12 05:37:32 +00:00
ipn/{ipnlocal,localapi},net/netkernelconf,client/tailscale,cmd/containerboot: optionally enable UDP GRO forwarding for containers (#12410)
Add a new TS_EXPERIMENTAL_ENABLE_FORWARDING_OPTIMIZATIONS env var that can be set for tailscale/tailscale container running as a subnet router or exit node to enable UDP GRO forwarding for improved performance. See https://tailscale.com/kb/1320/performance-best-practices#linux-optimizations-for-subnet-routers-and-exit-nodes This is currently considered an experimental approach; the configuration support is partially to allow further experimentation with containerized environments to evaluate the performance improvements. Updates tailscale/tailscale#12295 Signed-off-by: Irbe Krumina <irbe@tailscale.com>
This commit is contained in:
@@ -10,3 +10,9 @@ package netkernelconf
|
||||
func CheckUDPGROForwarding(tunInterface, defaultRouteInterface string) (warn, err error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// SetUDPGROForwarding is unimplemented for non-Linux platforms. Refer to the
|
||||
// docstring in _linux.go.
|
||||
func SetUDPGROForwarding(tunInterface, defaultRouteInterface string) error {
|
||||
return nil
|
||||
}
|
||||
|
@@ -9,15 +9,18 @@ import (
|
||||
"github.com/safchain/ethtool"
|
||||
)
|
||||
|
||||
const (
|
||||
rxWantFeature = "rx-udp-gro-forwarding"
|
||||
rxDoNotWantFeature = "rx-gro-list"
|
||||
txFeature = "tx-udp-segmentation"
|
||||
)
|
||||
|
||||
// CheckUDPGROForwarding checks if the machine is optimally configured to
|
||||
// forward UDP packets between the default route and Tailscale TUN interfaces.
|
||||
// It returns a non-nil warn in the case that the configuration is suboptimal.
|
||||
// It returns a non-nil err in the case that an error is encountered while
|
||||
// performing the check.
|
||||
func CheckUDPGROForwarding(tunInterface, defaultRouteInterface string) (warn, err error) {
|
||||
const txFeature = "tx-udp-segmentation"
|
||||
const rxWantFeature = "rx-udp-gro-forwarding"
|
||||
const rxDoNotWantFeature = "rx-gro-list"
|
||||
const kbLink = "\nSee https://tailscale.com/s/ethtool-config-udp-gro"
|
||||
errWithPrefix := func(format string, a ...any) error {
|
||||
const errPrefix = "couldn't check system's UDP GRO forwarding configuration, "
|
||||
@@ -52,3 +55,28 @@ func CheckUDPGROForwarding(tunInterface, defaultRouteInterface string) (warn, er
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// SetUDPGROForwarding enables UDP GRO forwarding for the provided default
|
||||
// interface. It validates if the provided tun interface has UDP segmentation
|
||||
// enabled and, if not, returns an error. See
|
||||
// https://tailscale.com/kb/1320/performance-best-practices#linux-optimizations-for-subnet-routers-and-exit-nodes
|
||||
func SetUDPGROForwarding(tunInterface, defaultInterface string) error {
|
||||
e, err := ethtool.NewEthtool()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to init ethtool: %w", err)
|
||||
}
|
||||
defer e.Close()
|
||||
tunFeatures, err := e.Features(tunInterface)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to retrieve TUN device features: %w", err)
|
||||
}
|
||||
if !tunFeatures[txFeature] {
|
||||
// if txFeature is disabled/nonexistent on the TUN then UDP GRO
|
||||
// forwarding doesn't matter, we won't be taking advantage of it.
|
||||
return fmt.Errorf("Not enabling UDP GRO forwarding as UDP segmentation is disabled for Tailscale interface")
|
||||
}
|
||||
if err := e.Change(defaultInterface, map[string]bool{rxWantFeature: true, rxDoNotWantFeature: false}); err != nil {
|
||||
return fmt.Errorf("error enabling UDP GRO forwarding: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user