use new buffer pool
This commit is contained in:
parent
7c16e3e519
commit
97ff9b846b
@ -1,6 +1,6 @@
|
||||
FROM golang:1-alpine as builder
|
||||
|
||||
RUN apk add --no-cache musl-dev git gcc
|
||||
RUN apk add --no-cache musl-dev gcc
|
||||
|
||||
ADD . /src
|
||||
|
||||
|
5
dns.go
5
dns.go
@ -14,6 +14,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
@ -59,8 +60,8 @@ func (h *dnsHandler) Init(opts ...HandlerOption) {
|
||||
func (h *dnsHandler) Handle(conn net.Conn) {
|
||||
defer conn.Close()
|
||||
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, err := conn.Read(b)
|
||||
if err != nil {
|
||||
|
1
go.mod
1
go.mod
@ -15,6 +15,7 @@ require (
|
||||
github.com/ginuerzh/gosocks4 v0.0.1
|
||||
github.com/ginuerzh/gosocks5 v0.2.0
|
||||
github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796
|
||||
github.com/go-gost/bpool v1.0.0
|
||||
github.com/go-gost/relay v0.1.0
|
||||
github.com/go-log/log v0.1.0
|
||||
github.com/gobwas/glob v0.2.3
|
||||
|
4
go.sum
4
go.sum
@ -28,6 +28,8 @@ github.com/ginuerzh/gosocks5 v0.2.0 h1:K0Ua23U9LU3BZrf3XpGDcs0mP8DiEpa6PJE4TA/MU
|
||||
github.com/ginuerzh/gosocks5 v0.2.0/go.mod h1:qp22mr6tH/prEoaN0pFukq76LlScIE+F2rP2ZP5ZHno=
|
||||
github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796 h1:VPXbYRvZUzTemsI7u0FzOnEuHeHwQuMTPXApAu8aeX4=
|
||||
github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796/go.mod h1:YyzP8PQrGwDH/XsfHJXwqdHLwWvBYxu77YVKm0+68f0=
|
||||
github.com/go-gost/bpool v1.0.0 h1:Og+6SH6SooHqf8CIwuxcPRHq8k0Si4YEfO2mBEi3/Uk=
|
||||
github.com/go-gost/bpool v1.0.0/go.mod h1:y/Pywm22A4OrJqNF/mL4nW7yb9fCdhlO8cxjyparkFI=
|
||||
github.com/go-gost/relay v0.1.0 h1:UOf2YwAzzaUjY5mdpMuLfSw0vz62iIFYk7oJQkuhlGw=
|
||||
github.com/go-gost/relay v0.1.0/go.mod h1:YFCpddLOFE3NlIkeDWRdEs8gL/GFsqXdtaf8SV5v4YQ=
|
||||
github.com/go-log/log v0.1.0 h1:wudGTNsiGzrD5ZjgIkVZ517ugi2XRe9Q/xRCzwEO4/U=
|
||||
@ -48,6 +50,8 @@ github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE
|
||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/reedsolomon v1.7.0 h1:pLFmRKGko2ZieiTGyo9DahLCIuljyxm+Zzhz/fYEonE=
|
||||
github.com/klauspost/reedsolomon v1.7.0/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
||||
github.com/libp2p/go-buffer-pool v0.0.3-0.20191206215133-4016316b51a2 h1:pSnSOZz0cmK3c6944tZdBq7Je9Qf28w80n+PCaq+2Qk=
|
||||
github.com/libp2p/go-buffer-pool v0.0.3-0.20191206215133-4016316b51a2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
|
||||
github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f h1:sSeNEkJrs+0F9TUau0CgWTTNEwF23HST3Eq0A+QIx+A=
|
||||
github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04=
|
||||
github.com/lucas-clemente/quic-go v0.10.0 h1:xEF+pSHYAOcu+U10Meunf+DTtc8vhQDRqlA0BJ6hufc=
|
||||
|
19
gost.go
19
gost.go
@ -13,7 +13,6 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-log/log"
|
||||
@ -32,24 +31,6 @@ var (
|
||||
largeBufferSize = 32 * 1024 // 32KB large buffer
|
||||
)
|
||||
|
||||
var (
|
||||
sPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, smallBufferSize)
|
||||
},
|
||||
}
|
||||
mPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, mediumBufferSize)
|
||||
},
|
||||
}
|
||||
lPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, largeBufferSize)
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
// KeepAliveTime is the keep alive time period for TCP connection.
|
||||
KeepAliveTime = 180 * time.Second
|
||||
|
5
relay.go
5
relay.go
@ -13,6 +13,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-gost/relay"
|
||||
"github.com/go-log/log"
|
||||
)
|
||||
@ -338,8 +339,8 @@ func (c *relayConn) Write(b []byte) (n int, err error) {
|
||||
nsize := 2 + len(b)
|
||||
var buf []byte
|
||||
if nsize <= mediumBufferSize {
|
||||
buf = mPool.Get().([]byte)
|
||||
defer mPool.Put(buf)
|
||||
buf = bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(buf)
|
||||
} else {
|
||||
buf = make([]byte, nsize)
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
)
|
||||
|
||||
@ -120,8 +121,8 @@ func transport(rw1, rw2 io.ReadWriter) error {
|
||||
}
|
||||
|
||||
func copyBuffer(dst io.Writer, src io.Reader) error {
|
||||
buf := lPool.Get().([]byte)
|
||||
defer lPool.Put(buf)
|
||||
buf := bpool.Get(largeBufferSize)
|
||||
defer bpool.Put(buf)
|
||||
|
||||
_, err := io.CopyBuffer(dst, src, buf)
|
||||
return err
|
||||
|
21
socks.go
21
socks.go
@ -15,6 +15,7 @@ import (
|
||||
|
||||
"github.com/ginuerzh/gosocks4"
|
||||
"github.com/ginuerzh/gosocks5"
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
smux "gopkg.in/xtaci/smux.v1"
|
||||
)
|
||||
@ -1238,8 +1239,8 @@ func (h *socks5Handler) transportUDP(relay, peer net.PacketConn) (err error) {
|
||||
var clientAddr net.Addr
|
||||
|
||||
go func() {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
for {
|
||||
n, laddr, err := relay.ReadFrom(b)
|
||||
@ -1275,8 +1276,8 @@ func (h *socks5Handler) transportUDP(relay, peer net.PacketConn) (err error) {
|
||||
}()
|
||||
|
||||
go func() {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
for {
|
||||
n, raddr, err := peer.ReadFrom(b)
|
||||
@ -1318,8 +1319,8 @@ func (h *socks5Handler) tunnelClientUDP(uc *net.UDPConn, cc net.Conn) (err error
|
||||
var clientAddr *net.UDPAddr
|
||||
|
||||
go func() {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
for {
|
||||
n, addr, err := uc.ReadFromUDP(b)
|
||||
@ -1458,8 +1459,8 @@ func (h *socks5Handler) tunnelServerUDP(cc net.Conn, pc net.PacketConn) (err err
|
||||
errc := make(chan error, 2)
|
||||
|
||||
go func() {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
for {
|
||||
n, addr, err := pc.ReadFrom(b)
|
||||
@ -2033,8 +2034,8 @@ func (c *socks5UDPConn) Read(b []byte) (n int, err error) {
|
||||
}
|
||||
|
||||
func (c *socks5UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
data := mPool.Get().([]byte)
|
||||
defer mPool.Put(data)
|
||||
data := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(data)
|
||||
|
||||
n, err = c.UDPConn.Read(data)
|
||||
if err != nil {
|
||||
|
29
ss.go
29
ss.go
@ -11,6 +11,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/ginuerzh/gosocks5"
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
@ -61,8 +62,8 @@ func (c *shadowConnector) ConnectContext(ctx context.Context, conn net.Conn, net
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rawaddr := sPool.Get().([]byte)
|
||||
defer sPool.Put(rawaddr)
|
||||
rawaddr := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(rawaddr)
|
||||
|
||||
n, err := socksAddr.Encode(rawaddr)
|
||||
if err != nil {
|
||||
@ -340,8 +341,8 @@ func (h *shadowUDPHandler) transportPacket(conn, cc net.PacketConn) (err error)
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, addr, err := conn.ReadFrom(b)
|
||||
if err != nil {
|
||||
@ -377,8 +378,8 @@ func (h *shadowUDPHandler) transportPacket(conn, cc net.PacketConn) (err error)
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, addr, err := cc.ReadFrom(b)
|
||||
if err != nil {
|
||||
@ -452,8 +453,8 @@ func (h *shadowUDPHandler) transportUDP(conn net.Conn, cc net.PacketConn) error
|
||||
go func() {
|
||||
for {
|
||||
er := func() (err error) {
|
||||
b := mPool.Get().([]byte)
|
||||
defer mPool.Put(b)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, addr, err := cc.ReadFrom(b)
|
||||
if err != nil {
|
||||
@ -514,8 +515,8 @@ type shadowUDPPacketConn struct {
|
||||
}
|
||||
|
||||
func (c *shadowUDPPacketConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
buf := mPool.Get().([]byte)
|
||||
defer mPool.Put(buf)
|
||||
buf := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(buf)
|
||||
|
||||
buf[0] = 0
|
||||
buf[1] = 0
|
||||
@ -553,8 +554,8 @@ func (c *shadowUDPPacketConn) WriteTo(b []byte, addr net.Addr) (n int, err error
|
||||
return
|
||||
}
|
||||
|
||||
buf := mPool.Get().([]byte)
|
||||
defer mPool.Put(buf)
|
||||
buf := bpool.Get(mediumBufferSize)
|
||||
defer bpool.Put(buf)
|
||||
|
||||
copy(buf, rawaddr[:nn])
|
||||
n = copy(buf[nn:], b)
|
||||
@ -611,8 +612,8 @@ func initShadowCipher(info *url.Userinfo) (cipher core.Cipher) {
|
||||
|
||||
func readSocksAddr(r io.Reader) (*gosocks5.Addr, error) {
|
||||
addr := &gosocks5.Addr{}
|
||||
b := sPool.Get().([]byte)
|
||||
defer sPool.Put(b)
|
||||
b := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
_, err := io.ReadFull(r, b[:1])
|
||||
if err != nil {
|
||||
|
17
tuntap.go
17
tuntap.go
@ -10,6 +10,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
"github.com/shadowsocks/go-shadowsocks2/shadowaead"
|
||||
@ -260,8 +261,8 @@ func (h *tunHandler) transportTun(tun net.Conn, conn net.PacketConn, raddr net.A
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := sPool.Get().([]byte)
|
||||
defer sPool.Put(b)
|
||||
b := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, err := tun.Read(b)
|
||||
if err != nil {
|
||||
@ -334,8 +335,8 @@ func (h *tunHandler) transportTun(tun net.Conn, conn net.PacketConn, raddr net.A
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := sPool.Get().([]byte)
|
||||
defer sPool.Put(b)
|
||||
b := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, addr, err := conn.ReadFrom(b)
|
||||
if err != nil &&
|
||||
@ -636,8 +637,8 @@ func (h *tapHandler) transportTap(tap net.Conn, conn net.PacketConn, raddr net.A
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := sPool.Get().([]byte)
|
||||
defer sPool.Put(b)
|
||||
b := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, err := tap.Read(b)
|
||||
if err != nil {
|
||||
@ -696,8 +697,8 @@ func (h *tapHandler) transportTap(tap net.Conn, conn net.PacketConn, raddr net.A
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := sPool.Get().([]byte)
|
||||
defer sPool.Put(b)
|
||||
b := bpool.Get(smallBufferSize)
|
||||
defer bpool.Put(b)
|
||||
|
||||
n, addr, err := conn.ReadFrom(b)
|
||||
if err != nil &&
|
||||
|
5
udp.go
5
udp.go
@ -7,6 +7,7 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/bpool"
|
||||
"github.com/go-log/log"
|
||||
)
|
||||
|
||||
@ -90,7 +91,7 @@ func UDPListener(addr string, cfg *UDPListenConfig) (Listener, error) {
|
||||
func (l *udpListener) listenLoop() {
|
||||
for {
|
||||
// NOTE: this buffer will be released in the udpServerConn after read.
|
||||
b := mPool.Get().([]byte)
|
||||
b := bpool.Get(mediumBufferSize)
|
||||
|
||||
n, raddr, err := l.ln.ReadFrom(b)
|
||||
if err != nil {
|
||||
@ -243,7 +244,7 @@ func (c *udpServerConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
case bb := <-c.rChan:
|
||||
n = copy(b, bb)
|
||||
if cap(bb) == mediumBufferSize {
|
||||
mPool.Put(bb[:cap(bb)])
|
||||
bpool.Put(bb[:cap(bb)])
|
||||
}
|
||||
case <-c.closed:
|
||||
err = errors.New("read from closed connection")
|
||||
|
Loading…
Reference in New Issue
Block a user