Skip to content

Commit

Permalink
use bigger socket buffers and optimizations on idle connections
Browse files Browse the repository at this point in the history
  • Loading branch information
harshavardhana committed May 15, 2024
1 parent 3dce7f8 commit d91e41d
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions main_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,16 @@ func setTCPParameters(_, _ string, c syscall.RawConn) error {

_ = unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)

{
// Enable big buffers
_ = unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_SNDBUF, opts.SendBufSize)

Check failure on line 38 in main_linux.go

View workflow job for this annotation

GitHub Actions / Test on Go 1.21.x and ubuntu-latest

undefined: opts

Check failure on line 38 in main_linux.go

View workflow job for this annotation

GitHub Actions / Analysis (1.21.8)

undefined: opts

_ = unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_RCVBUF, opts.RecvBufSize)

Check failure on line 40 in main_linux.go

View workflow job for this annotation

GitHub Actions / Test on Go 1.21.x and ubuntu-latest

undefined: opts (typecheck)

Check failure on line 40 in main_linux.go

View workflow job for this annotation

GitHub Actions / Analysis (1.21.8)

undefined: opts
}

// Enable TCP open
// https://lwn.net/Articles/508865/ - 16k queue size.
_ = syscall.SetsockoptInt(fd, syscall.SOL_TCP, unix.TCP_FASTOPEN, 16*1024)
// https://lwn.net/Articles/508865/ - 32k queue size.
_ = syscall.SetsockoptInt(fd, syscall.SOL_TCP, unix.TCP_FASTOPEN, 32*1024)

// Enable TCP fast connect
// TCPFastOpenConnect sets the underlying socket to use
Expand All @@ -46,6 +53,26 @@ func setTCPParameters(_, _ string, c syscall.RawConn) error {
// Enable TCP quick ACK, John Nagle says
// "Set TCP_QUICKACK. If you find a case where that makes things worse, let me know."
_ = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, unix.TCP_QUICKACK, 1)

// The time (in seconds) the connection needs to remain idle before
// TCP starts sending keepalive probes
_ = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, 15)

// Number of probes.
// ~ cat /proc/sys/net/ipv4/tcp_keepalive_probes (defaults to 9, we reduce it to 5)
_ = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPCNT, 5)

// Wait time after successful probe in seconds.
// ~ cat /proc/sys/net/ipv4/tcp_keepalive_intvl (defaults to 75 secs, we reduce it to 15 secs)
_ = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, 15)

// Set tcp user timeout in addition to the keep-alive - tcp-keepalive is not enough to close a socket
// with dead end because tcp-keepalive is not fired when there is data in the socket buffer.
// https://blog.cloudflare.com/when-tcp-sockets-refuse-to-die/
// This is a sensitive configuration, it is better to set it to high values, > 60 secs since it can
// affect clients reading data with a very slow pace (disappropriate with socket buffer sizes)
_ = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, unix.TCP_USER_TIMEOUT, 600000)

})
return nil
}

0 comments on commit d91e41d

Please sign in to comment.