Просмотр исходного кода

Merge pull request #139 from 9seconds/memory-direct

Memory optimizations for direct mode
tags/v1.0.4^2
Sergey Arkhipov 6 лет назад
Родитель
Сommit
2d9f2345dc
Аккаунт пользователя с таким Email не найден
2 измененных файлов: 37 добавлений и 7 удалений
  1. 4
    3
      proxy/direct.go
  2. 33
    4
      wrappers/stream/obfuscated2.go

+ 4
- 3
proxy/direct.go Просмотреть файл

11
 	"github.com/9seconds/mtg/protocol"
11
 	"github.com/9seconds/mtg/protocol"
12
 )
12
 )
13
 
13
 
14
-const directPipeBufferSize = 1024 * 1024
14
+const directPipeBufferSize = 1024
15
 
15
 
16
 func directConnection(request *protocol.TelegramRequest) error {
16
 func directConnection(request *protocol.TelegramRequest) error {
17
 	telegramConnRaw, err := obfuscated2.TelegramProtocol(request)
17
 	telegramConnRaw, err := obfuscated2.TelegramProtocol(request)
42
 		wg.Done()
42
 		wg.Done()
43
 	}()
43
 	}()
44
 
44
 
45
-	buf := make([]byte, directPipeBufferSize)
46
-	if _, err := io.CopyBuffer(dst, src, buf); err != nil {
45
+	buf := [directPipeBufferSize]byte{}
46
+
47
+	if _, err := io.CopyBuffer(dst, src, buf[:]); err != nil {
47
 		logger.Debugw("Cannot pump sockets", "error", err)
48
 		logger.Debugw("Cannot pump sockets", "error", err)
48
 	}
49
 	}
49
 }
50
 }

+ 33
- 4
wrappers/stream/obfuscated2.go Просмотреть файл

1
 package stream
1
 package stream
2
 
2
 
3
 import (
3
 import (
4
+	"bytes"
4
 	"crypto/cipher"
5
 	"crypto/cipher"
5
 	"fmt"
6
 	"fmt"
6
 	"net"
7
 	"net"
8
+	"sync"
7
 	"time"
9
 	"time"
8
 
10
 
9
 	"go.uber.org/zap"
11
 	"go.uber.org/zap"
11
 	"github.com/9seconds/mtg/conntypes"
13
 	"github.com/9seconds/mtg/conntypes"
12
 )
14
 )
13
 
15
 
16
+var (
17
+	poolWrapperObfuscated2WritePool = sync.Pool{
18
+		New: func() interface{} {
19
+			return &bytes.Buffer{}
20
+		},
21
+	}
22
+)
23
+
24
+func poolWrapperObfuscated2WritePoolAcquire() *bytes.Buffer {
25
+	return poolWrapperObfuscated2WritePool.Get().(*bytes.Buffer)
26
+}
27
+
28
+func poolWrapperObfuscated2WritePoolRelease(buf *bytes.Buffer) {
29
+	buf.Reset()
30
+	poolWrapperObfuscated2WritePool.Put(buf)
31
+}
32
+
14
 type wrapperObfuscated2 struct {
33
 type wrapperObfuscated2 struct {
15
 	encryptor cipher.Stream
34
 	encryptor cipher.Stream
16
 	decryptor cipher.Stream
35
 	decryptor cipher.Stream
40
 }
59
 }
41
 
60
 
42
 func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
61
 func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
43
-	buf := make([]byte, len(p))
44
-	copy(buf, p)
62
+	buffer := poolWrapperObfuscated2WritePoolAcquire()
63
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
64
+
65
+	buffer.Write(p)
66
+
67
+	buf := buffer.Bytes()
68
+
45
 	w.encryptor.XORKeyStream(buf, buf)
69
 	w.encryptor.XORKeyStream(buf, buf)
46
 
70
 
47
 	return w.parent.WriteTimeout(buf, timeout)
71
 	return w.parent.WriteTimeout(buf, timeout)
48
 }
72
 }
49
 
73
 
50
 func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
74
 func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
51
-	buf := make([]byte, len(p))
52
-	copy(buf, p)
75
+	buffer := poolWrapperObfuscated2WritePoolAcquire()
76
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
77
+
78
+	buffer.Write(p)
79
+
80
+	buf := buffer.Bytes()
81
+
53
 	w.encryptor.XORKeyStream(buf, buf)
82
 	w.encryptor.XORKeyStream(buf, buf)
54
 
83
 
55
 	return w.parent.Write(buf)
84
 	return w.parent.Write(buf)

Загрузка…
Отмена
Сохранить