Преглед изворни кода

Add configurable meek cached response buffer and pool sizes

Rod Hynes пре 9 година
родитељ
комит
bcdd7e51e8
2 измењених фајлова са 48 додато и 8 уклоњено
  1. 30 0
      psiphon/server/config.go
  2. 18 8
      psiphon/server/meek.go

+ 30 - 0
psiphon/server/config.go

@@ -179,6 +179,36 @@ type Config struct {
 	// used as the client IP.
 	MeekProxyForwardedForHeaders []string
 
+	// MeekCachedResponseBufferSize is the size of a private,
+	// fixed-size buffer allocated for every meek client. The buffer
+	// is used to cache response payload, allowing the client to retry
+	// fetching when a network connection is interrupted. This retry
+	// makes the OSSH tunnel within meek resilient to interruptions
+	// at the HTTP TCP layer.
+	// Larger buffers increase resiliency to interruption, but consume
+	// more memory as buffers as never freed. The maximum size of a
+	// response payload is a function of client activity, network
+	// throughput and throttling.
+	// A default of 64K is used when MeekCachedResponseBufferSize is 0.
+	MeekCachedResponseBufferSize int
+
+	// MeekCachedResponsePoolBufferSize is the size of a fixed-size,
+	// shared buffer used to temporarily extend a private buffer when
+	// MeekCachedResponseBufferSize is insufficient. Shared buffers
+	// allow some clients to sucessfully retry longer response payloads
+	// without allocating large buffers for all clients.
+	// A default of 64K is used when MeekCachedResponsePoolBufferSize
+	// is 0.
+	MeekCachedResponsePoolBufferSize int
+
+	// MeekCachedResponsePoolBufferCount is the number of shared
+	// buffers. Shared buffers are allocated on first use and remain
+	// allocated, so shared buffer count * size is roughly the memory
+	// overhead of this facility.
+	// A default of 1024 is used when MeekCachedResponsePoolBufferCount
+	// is 0.
+	MeekCachedResponsePoolBufferCount int
+
 	// UDPInterceptUdpgwServerAddress specifies the network address of
 	// a udpgw server which clients may be port forwarding to. When
 	// specified, these TCP port forwards are intercepted and handled

+ 18 - 8
psiphon/server/meek.go

@@ -72,7 +72,7 @@ const (
 	MEEK_MAX_SESSION_ID_LENGTH          = 20
 	MEEK_DEFAULT_RESPONSE_BUFFER_LENGTH = 65536
 	MEEK_DEFAULT_POOL_BUFFER_LENGTH     = 65536
-	MEEK_DEFAULT_POOL_BUFFER_COUNT      = 2048
+	MEEK_DEFAULT_POOL_BUFFER_COUNT      = 1024
 )
 
 // MeekServer implements the meek protocol, which tunnels TCP traffic (in the case of Psiphon,
@@ -109,10 +109,17 @@ func NewMeekServer(
 
 	checksumTable := crc64.MakeTable(crc64.ECMA)
 
-	// TODO: configurable buffer parameters
-	bufferPool := NewCachedResponseBufferPool(
-		MEEK_DEFAULT_POOL_BUFFER_LENGTH,
-		MEEK_DEFAULT_POOL_BUFFER_COUNT)
+	bufferLength := MEEK_DEFAULT_POOL_BUFFER_LENGTH
+	if support.Config.MeekCachedResponsePoolBufferSize != 0 {
+		bufferLength = support.Config.MeekCachedResponsePoolBufferSize
+	}
+
+	bufferCount := MEEK_DEFAULT_POOL_BUFFER_COUNT
+	if support.Config.MeekCachedResponsePoolBufferCount != 0 {
+		bufferCount = support.Config.MeekCachedResponsePoolBufferCount
+	}
+
+	bufferPool := NewCachedResponseBufferPool(bufferLength, bufferCount)
 
 	meekServer := &MeekServer{
 		support:       support,
@@ -518,9 +525,12 @@ func (server *MeekServer) getSession(
 		},
 		clientSessionData.MeekProtocolVersion)
 
-	// TODO: configurable buffer parameters
-	cachedResponse := NewCachedResponse(
-		MEEK_DEFAULT_RESPONSE_BUFFER_LENGTH, server.bufferPool)
+	bufferLength := MEEK_DEFAULT_RESPONSE_BUFFER_LENGTH
+	if server.support.Config.MeekCachedResponseBufferSize != 0 {
+		bufferLength = server.support.Config.MeekCachedResponseBufferSize
+	}
+
+	cachedResponse := NewCachedResponse(bufferLength, server.bufferPool)
 
 	session = &meekSession{
 		clientConn:          clientConn,