Skip to content

Instantly share code, notes, and snippets.

@andrewstuart
Last active October 21, 2021 20:25
Show Gist options
  • Save andrewstuart/85c79dd4b5cb6b7c88e692b6b988d74f to your computer and use it in GitHub Desktop.
Save andrewstuart/85c79dd4b5cb6b7c88e692b6b988d74f to your computer and use it in GitHub Desktop.
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
var ctx, cancel = context.WithCancel(context.Background())
func init() {
go func() {
ch := make(chan os.Signal, 2)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT)
i := 0
for range ch {
i++
if i > 1 {
os.Exit(1)
}
cancel()
}
}()
}
func main() {
if len(os.Args) <= 1 {
log.Fatalf("Usage: %s <address>", os.Args[0])
}
server := http.Server{
Addr: os.Args[1],
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
n := 800000.0
for i := 0; i < 10000000; i++ {
n /= 1.01
}
fmt.Fprintf(w, "%s, %s\n%#v\n\n", r.Host, r.URL.Path, r)
}),
}
go func() {
log.Fatal(server.ListenAndServe())
}()
<-ctx.Done()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
server.Shutdown(ctx)
}
~  docker run -p 8080:8080 -it echo :8080

No limits at all (16 core ryzen)

~  hey -n 100 -c 50 http://localhost:8080/echo

Summary:
  Total:        0.0220 secs
  Slowest:      0.0189 secs
  Fastest:      0.0024 secs
  Average:      0.0090 secs
  Requests/sec: 4554.2092

  Total data:   70800 bytes
  Size/request: 708 bytes

Response time histogram:
  0.002 [1]     |■
  0.004 [6]     |■■■■■■■
  0.006 [23]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.007 [19]    |■■■■■■■■■■■■■■■■■■■■■■■
  0.009 [10]    |■■■■■■■■■■■■
  0.011 [0]     |
  0.012 [3]     |■■■■
  0.014 [33]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.016 [0]     |
  0.017 [0]     |
  0.019 [5]     |■■■■■■


Latency distribution:
  10% in 0.0046 secs
  25% in 0.0055 secs
  50% in 0.0076 secs
  75% in 0.0130 secs
  90% in 0.0137 secs
  95% in 0.0185 secs
  99% in 0.0189 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0010 secs, 0.0024 secs, 0.0189 secs
  DNS-lookup:   0.0004 secs, 0.0000 secs, 0.0038 secs
  req write:    0.0002 secs, 0.0000 secs, 0.0030 secs
  resp wait:    0.0078 secs, 0.0024 secs, 0.0153 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0000 secs

Status code distribution:
  [200] 100 responses

2 CPUs:

➜  ~  hey -n 100 -c 50 http://localhost:8080/echo

Summary:
  Total:	0.0631 secs
  Slowest:	0.0595 secs
  Fastest:	0.0025 secs
  Average:	0.0265 secs
  Requests/sec:	1583.6750

  Total data:	70800 bytes
  Size/request:	708 bytes

Response time histogram:
  0.002 [1]	|■
  0.008 [19]	|■■■■■■■■■■■■■■■■■■■■■■■■
  0.014 [32]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.020 [4]	|■■■■■
  0.025 [0]	|
  0.031 [0]	|
  0.037 [0]	|
  0.042 [3]	|■■■■
  0.048 [23]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.054 [7]	|■■■■■■■■■
  0.060 [11]	|■■■■■■■■■■■■■■


Latency distribution:
  10% in 0.0049 secs
  25% in 0.0110 secs
  50% in 0.0124 secs
  75% in 0.0450 secs
  90% in 0.0551 secs
  95% in 0.0555 secs
  99% in 0.0595 secs

Details (average, fastest, slowest):
  DNS+dialup:	0.0009 secs, 0.0025 secs, 0.0595 secs
  DNS-lookup:	0.0004 secs, 0.0000 secs, 0.0059 secs
  req write:	0.0012 secs, 0.0000 secs, 0.0092 secs
  resp wait:	0.0225 secs, 0.0024 secs, 0.0490 secs
  resp read:	0.0008 secs, 0.0000 secs, 0.0074 secs

Status code distribution:
  [200]	100 responses

1 CPU

➜  ~  hey -n 100 -c 50 http://localhost:8080/echo

Summary:
  Total:	0.3605 secs
  Slowest:	0.2584 secs
  Fastest:	0.0029 secs
  Average:	0.1163 secs
  Requests/sec:	277.4020

  Total data:	70800 bytes
  Size/request:	708 bytes

Response time histogram:
  0.003 [1]	|■■
  0.028 [9]	|■■■■■■■■■■■■■■
  0.054 [0]	|
  0.080 [24]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.105 [16]	|■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.131 [6]	|■■■■■■■■■■
  0.156 [0]	|
  0.182 [25]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.207 [18]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.233 [0]	|
  0.258 [1]	|■■


Latency distribution:
  10% in 0.0564 secs
  25% in 0.0616 secs
  50% in 0.1056 secs
  75% in 0.1661 secs
  90% in 0.2001 secs
  95% in 0.2007 secs
  99% in 0.2584 secs

Details (average, fastest, slowest):
  DNS+dialup:	0.0006 secs, 0.0029 secs, 0.2584 secs
  DNS-lookup:	0.0002 secs, 0.0000 secs, 0.0009 secs
  req write:	0.0003 secs, 0.0000 secs, 0.0020 secs
  resp wait:	0.1153 secs, 0.0029 secs, 0.2570 secs
  resp read:	0.0000 secs, 0.0000 secs, 0.0005 secs

Status code distribution:
  [200]	100 responses

0.5 CPUs

➜  ~  hey -n 100 -c 50 http://localhost:8080/echo

Summary:
  Total:	0.6315 secs
  Slowest:	0.5314 secs
  Fastest:	0.0025 secs
  Average:	0.1958 secs
  Requests/sec:	158.3472

  Total data:	70800 bytes
  Size/request:	708 bytes

Response time histogram:
  0.002 [1]	|■■
  0.055 [25]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.108 [3]	|■■■■■
  0.161 [20]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.214 [20]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.267 [0]	|
  0.320 [1]	|■■
  0.373 [17]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.426 [2]	|■■■
  0.479 [0]	|
  0.531 [11]	|■■■■■■■■■■■■■■■■■■


Latency distribution:
  10% in 0.0031 secs
  25% in 0.0072 secs
  50% in 0.1964 secs
  75% in 0.3311 secs
  90% in 0.5271 secs
  95% in 0.5307 secs
  99% in 0.5314 secs

Details (average, fastest, slowest):
  DNS+dialup:	0.0008 secs, 0.0025 secs, 0.5314 secs
  DNS-lookup:	0.0006 secs, 0.0000 secs, 0.0043 secs
  req write:	0.0004 secs, 0.0000 secs, 0.0039 secs
  resp wait:	0.1941 secs, 0.0024 secs, 0.5269 secs
  resp read:	0.0001 secs, 0.0000 secs, 0.0007 secs

Status code distribution:
  [200]	100 responses

And with 0.1 CPUs (100m cores as used in many production services)

docker run --cpus=0.1 -p 8080:8080 -it echo :8080
➜  ~  hey -n 100 -c 50 http://localhost:8080/echo

Summary:
  Total:        3.6369 secs
  Slowest:      3.4372 secs
  Fastest:      0.0024 secs
  Average:      1.3670 secs
  Requests/sec: 27.4961

  Total data:   70800 bytes
  Size/request: 708 bytes

Response time histogram:
  0.002 [1]     |■■
  0.346 [16]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.689 [13]    |■■■■■■■■■■■■■■■■■■■■■■■
  1.033 [5]     |■■■■■■■■■
  1.376 [14]    |■■■■■■■■■■■■■■■■■■■■■■■■
  1.720 [23]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  2.063 [9]     |■■■■■■■■■■■■■■■■
  2.407 [4]     |■■■■■■■
  2.750 [5]     |■■■■■■■■■
  3.094 [2]     |■■■
  3.437 [8]     |■■■■■■■■■■■■■■


Latency distribution:
  10% in 0.0039 secs
  25% in 0.5001 secs
  50% in 1.5368 secs
  75% in 1.8994 secs
  90% in 2.8365 secs
  95% in 3.4368 secs
  99% in 3.4372 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0007 secs, 0.0024 secs, 3.4372 secs
  DNS-lookup:   0.0003 secs, 0.0000 secs, 0.0021 secs
  req write:    0.0002 secs, 0.0000 secs, 0.0018 secs
  resp wait:    1.3660 secs, 0.0024 secs, 3.4362 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0001 secs

Status code distribution:
  [200] 100 responses
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment