Browse Source

Prefork tests to Go/fasthttp (#4462)

* updated Go/iris

* removed vendor from Go/iris

* fixed golang ver in Go/iris

* add go build, change go ver to 1.11.5

* add iris-prefork test

* changed go ver to 1.11.5 in fasthttp-postgresql

* added iris-quicktemplate

* fixed structure in go-std, added prefork

* add quicktemplate to go-std

* add prefork tests to Go/fasthttp
chunariov 6 years ago
parent
commit
59b706708a

+ 45 - 1
frameworks/Go/fasthttp/benchmark_config.json

@@ -24,6 +24,29 @@
       "notes": "",
       "versus": "go"
     },
+    "prefork": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/update?queries=",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "FastHTTP",
+      "notes": "",
+      "versus": "go"
+    },
     "postgresql": {
       "db_url": "/db",
       "query_url": "/queries?queries=",
@@ -44,6 +67,27 @@
       "display_name": "FastHTTP",
       "notes": "",
       "versus": "go"
+    },
+    "postgresql-prefork": {
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "FastHTTP",
+      "notes": "",
+      "versus": "go"
     }
   }]
-}
+}

+ 20 - 0
frameworks/Go/fasthttp/fasthttp-postgresql-prefork.dockerfile

@@ -0,0 +1,20 @@
+FROM golang:1.11.5
+
+ADD ./ /fasthttp
+WORKDIR /fasthttp
+
+RUN mkdir bin
+ENV GOPATH /fasthttp
+ENV PATH ${GOPATH}/bin:${PATH}
+
+RUN rm -rf ./pkg/*
+RUN go get -d -u github.com/jackc/pgx
+RUN go get -d -u github.com/valyala/fasthttp/...
+RUN go get -u github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+
+RUN rm -f ./server-postgresql
+RUN go generate templates
+RUN go build -gcflags='-l=4' server-postgresql
+
+CMD ./server-postgresql -prefork

+ 20 - 0
frameworks/Go/fasthttp/fasthttp-prefork.dockerfile

@@ -0,0 +1,20 @@
+FROM golang:1.11.5
+
+ADD ./ /fasthttp
+WORKDIR /fasthttp
+
+RUN mkdir bin
+ENV GOPATH /fasthttp
+ENV PATH ${GOPATH}/bin:${PATH}
+
+RUN rm -rf ./pkg/*
+RUN go get -d -u github.com/go-sql-driver/mysql
+RUN go get -d -u github.com/valyala/fasthttp/...
+RUN go get -u github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+
+RUN rm -f ./server-mysql
+RUN go generate templates
+RUN go build -gcflags='-l=4' server-mysql
+
+CMD ./server-mysql -prefork

+ 4 - 6
frameworks/Go/fasthttp/src/common/common.go

@@ -2,15 +2,15 @@ package common
 
 import (
 	"encoding/json"
-	"flag"
 	"log"
 	"math/rand"
 	"net"
 	"sort"
 	"sync"
 
-	"github.com/valyala/fasthttp"
 	"templates"
+
+	"github.com/valyala/fasthttp"
 )
 
 const worldRowCount = 10000
@@ -24,8 +24,6 @@ type World struct {
 	RandomNumber int32 `json:"randomNumber"`
 }
 
-var listenAddr = flag.String("listenAddr", ":8080", "Address to listen to")
-
 func JSONHandler(ctx *fasthttp.RequestCtx) {
 	r := jsonResponsePool.Get().(*JSONResponse)
 	r.Message = "Hello, World!"
@@ -65,8 +63,8 @@ func GetQueriesCount(ctx *fasthttp.RequestCtx) int {
 	return n
 }
 
-func GetListener() net.Listener {
-	ln, err := net.Listen("tcp4", *listenAddr)
+func GetListener(listenAddr string) net.Listener {
+	ln, err := net.Listen("tcp4", listenAddr)
 	if err != nil {
 		log.Fatal(err)
 	}

+ 50 - 0
frameworks/Go/fasthttp/src/common/prefork.go

@@ -0,0 +1,50 @@
+package common
+
+import (
+	"log"
+	"net"
+	"os"
+	"os/exec"
+	"runtime"
+)
+
+func DoPrefork(child bool, toBind string) net.Listener {
+	var listener net.Listener
+	if !child {
+		addr, err := net.ResolveTCPAddr("tcp", toBind)
+		if err != nil {
+			log.Fatal(err)
+		}
+		tcplistener, err := net.ListenTCP("tcp", addr)
+		if err != nil {
+			log.Fatal(err)
+		}
+		fl, err := tcplistener.File()
+		if err != nil {
+			log.Fatal(err)
+		}
+		children := make([]*exec.Cmd, runtime.NumCPU()/2)
+		for i := range children {
+			children[i] = exec.Command(os.Args[0], "-prefork", "-child")
+			children[i].Stdout = os.Stdout
+			children[i].Stderr = os.Stderr
+			children[i].ExtraFiles = []*os.File{fl}
+			if err := children[i].Start(); err != nil {
+				log.Fatal(err)
+			}
+		}
+		for _, ch := range children {
+			if err := ch.Wait(); err != nil {
+				log.Print(err)
+			}
+		}
+		os.Exit(0)
+	} else {
+		var err error
+		listener, err = net.FileListener(os.NewFile(3, ""))
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+	return listener
+}

+ 12 - 1
frameworks/Go/fasthttp/src/server-mysql/server.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"flag"
 	"log"
+	"net"
 	"runtime"
 
 	_ "github.com/go-sql-driver/mysql"
@@ -24,6 +25,9 @@ var (
 )
 
 func main() {
+	bindHost := flag.String("bind", ":8080", "set bind host")
+	prefork := flag.Bool("prefork", false, "use prefork")
+	child := flag.Bool("child", false, "is child proc")
 	flag.Parse()
 
 	var err error
@@ -46,7 +50,14 @@ func main() {
 		Handler: mainHandler,
 		Name:    "go",
 	}
-	ln := common.GetListener()
+
+	var ln net.Listener
+	if *prefork {
+		ln = common.DoPrefork(*child, *bindHost)
+	} else {
+		ln = common.GetListener(*bindHost)
+	}
+
 	if err = s.Serve(ln); err != nil {
 		log.Fatalf("Error when serving incoming connections: %s", err)
 	}

+ 15 - 1
frameworks/Go/fasthttp/src/server-postgresql/server.go

@@ -4,6 +4,7 @@ import (
 	"flag"
 	"fmt"
 	"log"
+	"net"
 	"runtime"
 
 	"github.com/jackc/pgx"
@@ -22,10 +23,16 @@ var (
 )
 
 func main() {
+	bindHost := flag.String("bind", ":8080", "set bind host")
+	prefork := flag.Bool("prefork", false, "use prefork")
+	child := flag.Bool("child", false, "is child proc")
 	flag.Parse()
 
 	var err error
 	maxConnectionCount := runtime.NumCPU() * 4
+	if *child {
+		maxConnectionCount = runtime.NumCPU()
+	}
 	if db, err = initDatabase("tfb-database", "benchmarkdbuser", "benchmarkdbpass", "hello_world", 5432, maxConnectionCount); err != nil {
 		log.Fatalf("Error opening database: %s", err)
 	}
@@ -34,7 +41,14 @@ func main() {
 		Handler: mainHandler,
 		Name:    "go",
 	}
-	ln := common.GetListener()
+
+	var ln net.Listener
+	if *prefork {
+		ln = common.DoPrefork(*child, *bindHost)
+	} else {
+		ln = common.GetListener(*bindHost)
+	}
+
 	if err = s.Serve(ln); err != nil {
 		log.Fatalf("Error when serving incoming connections: %s", err)
 	}