iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Modern Web

Let's Go! 解剖Go server開發到部署的過程系列 第 15

day 15 - 從執行時間開始優化

經過了前面幾天的步驟, 已經算是走過一遍本機開發到交付的流程了,
接下來再依照團隊推上k8s的流程新增好對應的deployment.yaml,
服務架上共用環境之後就會開始進行畫面介接跟規格確認, 異動跟新增的需求也會開始隨之而來。

趁著這個空檔可以檢視一下API接口執行時間: 首先先評估API被呼叫的平均頻率大部分會落在哪裡, 然後再評估API被呼叫的頻率高峰次數會落在哪裡, 最後是高峰頻率乘上3~5倍來測試, 透過調整呼叫API的頻率來觀察API執行回應時間是否在可接受的範圍內。
這邊我會寫個簡單的可以看出執行時間差異的測試程式:

package main

import (
	"context"
	"fmt"
	"log"
	"sync"
	"time"

	coconut "github.com/evelynocean/coconut/pb"
	"github.com/go-redis/redis"
	"google.golang.org/grpc"
)

func main() {
	// 連線到遠端 gRPC 伺服器。
	conn, err := grpc.Dial("localhost:32100", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("conn 連線失敗:%v", err)
	}

	defer conn.Close()

	coco := coconut.NewCoconutClient(conn)

	n := 1000 
	var sum float64
	req := &coconut.PointsRequest{
		Level_1: "aaa",
		Level_2: "bbb",
		Level_3: "ccc",
	}
	wait := &sync.WaitGroup{}

	for i := 0; i < n; i++ {
		wait.Add(1)
		go func() {
			defer func() {
				wait.Done()
			}()
			start := time.Now()
			_, _ = coco.UpdatePoints(context.Background(), req)
			sum += time.Since(start).Seconds()
		}()
	}
	wait.Wait()

	fmt.Println("total count:", n, ", avg execute_time:", (sum / float64(n)))
}

func newRedisConnection() (client *redis.Client, err error) {
	client = redis.NewClient(&redis.Options{
		Addr: "127.0.0.1:6379",
		DB:   2,
	})

	_, err = client.Ping().Result()

	return
}

  • 先測試跑 10 次看一下平均執行時間
total count: 10 , avg execute_time: 0.04420415439999999
  • 跑100次的平均執行時間
total count: 100 , avg execute_time: 0.14994730453000005
  • 跑 1000 次的平均執行時間
total count: 1000 , avg execute_time: 1.034294797929

看起來隨著併發打API的次數拉高, API平均回應時間也跟著拉長了,
可以嘗試針對這支API的內容進行調整, 看看是否能縮短執行時間。

今天就先到這裡, 明天再來調校程式!


上一篇
day 14 - drone 的go-test & golangci-lint
下一篇
day 16 - 開啟git worktree 進行redis lua-script 測試比較
系列文
Let's Go! 解剖Go server開發到部署的過程30

尚未有邦友留言

立即登入留言