You've already forked go-profiler-notes
mirror of
https://github.com/DataDog/go-profiler-notes.git
synced 2025-07-12 23:50:13 +02:00
87 lines
1.3 KiB
Go
87 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"runtime"
|
|
"runtime/pprof"
|
|
"time"
|
|
|
|
"golang.org/x/sync/errgroup"
|
|
)
|
|
|
|
func main() {
|
|
if err := run(); err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func run() error {
|
|
runtime.SetBlockProfileRate(1)
|
|
|
|
listening := make(chan struct{})
|
|
g := &errgroup.Group{}
|
|
g.Go(func() error {
|
|
return server(listening)
|
|
})
|
|
|
|
<-listening
|
|
time.Sleep(time.Second)
|
|
|
|
if err := client(); err != nil {
|
|
return err
|
|
}
|
|
if err := g.Wait(); err != nil {
|
|
return err
|
|
}
|
|
|
|
f, err := os.Create("block.pb.gz")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
if err := pprof.Lookup("block").WriteTo(f, 0); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func server(listening chan struct{}) error {
|
|
l, err := net.Listen("tcp", "localhost:9090")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
listening <- struct{}{}
|
|
|
|
conn, err := l.Accept()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("[server] accepted: %v\n", conn)
|
|
buf := make([]byte, 1024)
|
|
n, err := conn.Read(buf)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
buf = buf[:n]
|
|
fmt.Printf("[server] read: %s\n", buf)
|
|
return nil
|
|
}
|
|
|
|
func client() error {
|
|
conn, err := net.Dial("tcp", "localhost:9090")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
fmt.Printf("[client] connected: %v\n", conn)
|
|
_, err = conn.Write([]byte("hello world"))
|
|
return err
|
|
}
|