Skip to content

Instantly share code, notes, and snippets.

@tidwall
Created March 13, 2019 17:46
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tidwall/b119d907d0961a3ca70026142929a2ea to your computer and use it in GitHub Desktop.
Save tidwall/b119d907d0961a3ca70026142929a2ea to your computer and use it in GitHub Desktop.
Go 1.12 network slowdown on Darwin
package main
import (
"fmt"
"io"
"log"
"net"
"os"
"sync"
"sync/atomic"
"time"
)
func main() {
switch {
case len(os.Args) > 1 && os.Args[1] == "bench":
bench()
case len(os.Args) > 1 && os.Args[1] == "server":
server()
default:
fmt.Fprintf(os.Stderr, "usage: <command> server|bench\n")
os.Exit(1)
}
}
func server() {
log.Printf("echo server started\n")
os.RemoveAll("socket")
ln, err := net.Listen("unix", "socket")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
go func(conn net.Conn) {
defer conn.Close()
var packet [256]byte
for {
n, err := conn.Read(packet[:])
if err != nil {
return
}
conn.Write(packet[:n])
}
}(conn)
}
}
func bench() {
c := 50
n := 100000
log.Printf("echo benchmark connecting %d clients\n", c)
start := time.Now()
var total int32
var wg sync.WaitGroup
wg.Add(c)
for i := 0; i < c; i++ {
go func() {
defer wg.Done()
conn, err := net.Dial("unix", "socket")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
packet := []byte("ping\n")
for i := 0; i < n/c; i++ {
conn.Write(packet)
if _, err := io.ReadFull(conn, packet); err != nil {
log.Fatal(err)
}
if atomic.AddInt32(&total, 1)%3131 == 0 {
fmt.Printf("\r%.0f ops/sec ",
float64(total)/time.Since(start).Seconds())
}
}
}()
}
wg.Wait()
fmt.Printf("\r%.0f ops/sec\n",
float64(total)/time.Since(start).Seconds())
}
@c1982
Copy link

c1982 commented May 16, 2019

Still continue in 1.12.5

go 1.11     darwin  268.093 ops/sec
go 1.12.5   darwin  71.273 ops/sec 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment