server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "log"
  6. "net"
  7. "net/http"
  8. _ "net/http/pprof"
  9. "sync/atomic"
  10. "time"
  11. "go-common/library/net/rpc/warden"
  12. "go-common/library/net/rpc/warden/benchmark/bench/proto"
  13. xtime "go-common/library/time"
  14. "github.com/prometheus/client_golang/prometheus/promhttp"
  15. "google.golang.org/grpc"
  16. )
  17. const (
  18. iws = 65535 * 1000
  19. iwsc = 65535 * 10000
  20. readBuffer = 32 * 1024
  21. writeBuffer = 32 * 1024
  22. )
  23. var reqNum uint64
  24. type Hello struct{}
  25. func (t *Hello) Say(ctx context.Context, args *proto.BenchmarkMessage) (reply *proto.BenchmarkMessage, err error) {
  26. s := "OK"
  27. var i int32 = 100
  28. args.Field1 = s
  29. args.Field2 = i
  30. atomic.AddUint64(&reqNum, 1)
  31. return args, nil
  32. }
  33. var host = flag.String("s", "0.0.0.0:8972", "listened ip and port")
  34. var isWarden = flag.Bool("w", true, "is warden or grpc client")
  35. func main() {
  36. go func() {
  37. log.Println("run http at :6060")
  38. http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
  39. h := promhttp.Handler()
  40. h.ServeHTTP(w, r)
  41. })
  42. log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
  43. }()
  44. flag.Parse()
  45. go stat()
  46. if *isWarden {
  47. runWarden()
  48. } else {
  49. runGrpc()
  50. }
  51. }
  52. func runGrpc() {
  53. log.Println("run grpc")
  54. lis, err := net.Listen("tcp", *host)
  55. if err != nil {
  56. log.Fatalf("failed to listen: %v", err)
  57. }
  58. s := grpc.NewServer(grpc.InitialWindowSize(iws),
  59. grpc.InitialConnWindowSize(iwsc),
  60. grpc.ReadBufferSize(readBuffer),
  61. grpc.WriteBufferSize(writeBuffer))
  62. proto.RegisterHelloServer(s, &Hello{})
  63. s.Serve(lis)
  64. }
  65. func runWarden() {
  66. log.Println("run warden")
  67. s := warden.NewServer(&warden.ServerConfig{Timeout: xtime.Duration(time.Second * 3)},
  68. grpc.InitialWindowSize(iws),
  69. grpc.InitialConnWindowSize(iwsc),
  70. grpc.ReadBufferSize(readBuffer),
  71. grpc.WriteBufferSize(writeBuffer))
  72. proto.RegisterHelloServer(s.Server(), &Hello{})
  73. s.Run(*host)
  74. }
  75. func stat() {
  76. ticker := time.NewTicker(time.Second * 5)
  77. defer ticker.Stop()
  78. var last uint64
  79. lastTs := uint64(time.Now().UnixNano())
  80. for {
  81. <-ticker.C
  82. now := atomic.LoadUint64(&reqNum)
  83. nowTs := uint64(time.Now().UnixNano())
  84. qps := (now - last) * 1e6 / ((nowTs - lastTs) / 1e3)
  85. last = now
  86. lastTs = nowTs
  87. log.Println("qps:", qps)
  88. }
  89. }