Skip to content

Instantly share code, notes, and snippets.

@majek
Created September 18, 2015 11:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save majek/0bf03d5808599cafb19a to your computer and use it in GitHub Desktop.
Save majek/0bf03d5808599cafb19a to your computer and use it in GitHub Desktop.
tcp performance
package main
import (
"flag"
"fmt"
"net"
"os"
"strings"
"sync/atomic"
"time"
)
func main() {
flag.Parse()
parts := strings.Split(targetAddr, "://")
if parts[0][0:3] != "tcp" || len(parts) != 2 {
panic("")
}
addr, err := net.ResolveTCPAddr("tcp", parts[1])
if err != nil {
fmt.Fprintf(os.Stderr, "net.ResolveTCPAddr() %v\n", err)
os.Exit(3)
}
list_of_counters := make([]*uint64, concurrency)
for i := 0; i < concurrency; i++ {
c := uint64(0)
list_of_counters[i] = &c
go connect(addr, &c)
}
fmt.Printf("[*] Connecting to %q\n", addr.String())
for {
time.Sleep(1 * time.Second)
sum := uint64(0)
for i := 0; i < concurrency; i++ {
v := atomic.LoadUint64(list_of_counters[i])
atomic.AddUint64(list_of_counters[i], -v)
sum += v
}
fmt.Printf("%.3foMiB\n", float64(sum)/1024.0/1024.0)
}
}
func connect(addr *net.TCPAddr, c *uint64) {
for {
conn, err := net.DialTCP("tcp", nil, addr)
if err != nil {
fmt.Fprintf(os.Stderr, "net.DialTCP() %v\n", err)
time.Sleep(1 * time.Second)
continue
}
conn.SetReadBuffer(128*1024)
conn.SetWriteBuffer(128*1024)
go writeForever(conn)
buf := make([]byte, 1024*16)
for {
reqLen, err := conn.Read(buf)
if err != nil {
fmt.Fprintf(os.Stderr, "conn.Read() %v\n", err)
break
}
atomic.AddUint64(c, uint64(reqLen))
}
conn.Close()
time.Sleep(1 * time.Second)
}
}
func writeForever(conn net.Conn) {
buf := make([]byte, 16*1024)
for {
_, err := conn.Write(buf[:])
if err != nil {
fmt.Fprintf(os.Stderr, "conn.Write() %v\n", err)
break
}
}
conn.Close()
}
var (
targetAddr string
concurrency int
)
func init() {
flag.StringVar(&targetAddr, "t", "tcp://127.0.0.1:8181", "Target to connect to")
flag.IntVar(&concurrency, "c", 1, "Number of parallel connections")
}
package main
import (
"flag"
"fmt"
"net"
"os"
"strings"
)
func main() {
flag.Parse()
parts := strings.Split(listenAddr, "://")
if parts[0][0:3] != "tcp" || len(parts) != 2 {
panic("")
}
addr, err := net.ResolveTCPAddr("tcp", parts[1])
if err != nil {
fmt.Fprintf(os.Stderr, "net.ResolveTCPAddr() %v\n", err)
os.Exit(3)
}
srv, err := net.ListenTCP("tcp", addr)
if err != nil {
fmt.Fprintf(os.Stderr, "net.ListenTCP() %v\n", err)
os.Exit(3)
}
fmt.Printf("[*] Bound to %q\n", addr)
for {
conn, err := srv.Accept()
if err != nil {
fmt.Fprintf(os.Stderr, "srv.Accept() %v\n", err)
continue
}
go handle(conn.(*net.TCPConn))
}
}
func handle(conn *net.TCPConn) {
buf := make([]byte, 1024*16)
conn.SetReadBuffer(128*1024)
conn.SetWriteBuffer(128*1024)
for {
reqLen, err := conn.Read(buf)
if err != nil {
fmt.Fprintf(os.Stderr, "conn.Read() %v\n", err)
break
}
_, err = conn.Write(buf[:reqLen])
if err != nil {
fmt.Fprintf(os.Stderr, "conn.Write() %v\n", err)
break
}
}
conn.Close()
}
var (
listenAddr string
)
func init() {
flag.StringVar(&listenAddr, "l", "tcp://0.0.0.0:8181", "Bind to")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment