mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-04 20:09:03 +00:00
derp: intern key.NodePublic across the server
Consistently interning the NodePublic's throughout DERP, particularly inside the maps reduces memory usage and reduces lookup costs in the associated data structures. It is not clear exactly how efficient the weak pointers will be in practice, but estimating this using derpstress with 10k conns pushing 40kpps in each direction, this is patch grows heap at approximately half the rate vs. the old code and has fewer instances of long stalls that trigger i/o timeouts for the clients. Updates tailscale/corp#24485 Signed-off-by: James Tucker <james@tailscale.com>
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"unique"
|
||||
|
||||
"go4.org/mem"
|
||||
"golang.org/x/crypto/curve25519"
|
||||
@@ -174,6 +175,16 @@ func (p NodePublic) Compare(p2 NodePublic) int {
|
||||
return bytes.Compare(p.k[:], p2.k[:])
|
||||
}
|
||||
|
||||
// Handle returns a unique.Handle for this NodePublic. The Handle is more
|
||||
// efficient for storage and comparison than the NodePublic itself, but is also
|
||||
// more expensive to create. It is best to keep a copy of the Handle on a longer
|
||||
// term object representing a NodePublic, rather than creating it on the fly,
|
||||
// but in doing so if the Handle is used in multiple other data structures the
|
||||
// cost of Handle storage and comparisons on lookups will quickly amortize.
|
||||
func (p NodePublic) Handle() unique.Handle[NodePublic] {
|
||||
return unique.Make(p)
|
||||
}
|
||||
|
||||
// ParseNodePublicUntyped parses an untyped 64-character hex value
|
||||
// as a NodePublic.
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user