use new buffer pool

This commit is contained in:
ginuerzh 2020-03-25 19:01:21 +08:00
parent 7c16e3e519
commit 97ff9b846b
11 changed files with 53 additions and 60 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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
View File

@ -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 {

View File

@ -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
View File

@ -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")