|
@@ -8,56 +8,74 @@ import (
|
|
|
"github.com/mhaya/game/game_cluster/internal/code"
|
|
|
"github.com/mhaya/game/game_cluster/internal/param"
|
|
|
mhayaLogger "github.com/mhaya/logger"
|
|
|
+ "math/rand"
|
|
|
"strconv"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
// 定义命令行标志
|
|
|
userOffset := flag.Int("userOffset", 0, "用户偏移量")
|
|
|
- count := flag.Int("count", 50000, "请求总数")
|
|
|
- flag.Int("qps", 2000, "最大并发数")
|
|
|
- url := flag.String("url", "", "请求url")
|
|
|
- flag.Int("duration", 120, "测试持续时间")
|
|
|
+ count := flag.Int("count", 20000, "请求总数")
|
|
|
+ qps := flag.Int("qps", 50, "最大并发数")
|
|
|
+ url := flag.String("url", "http://127.0.0.1:20000", "请求url")
|
|
|
+ url1 := flag.String("url1", "http://127.0.0.1:20001", "请求url")
|
|
|
+ url2 := flag.String("url2", "http://127.0.0.1:20002", "请求url")
|
|
|
+ url3 := flag.String("url3", "http://127.0.0.1:20003", "请求url")
|
|
|
+ duration := flag.Int("duration", 120, "测试持续时间")
|
|
|
flag.Parse()
|
|
|
|
|
|
- //startTime := time.Now()
|
|
|
- //var wg sync.WaitGroup
|
|
|
- //wg.Add(*count)
|
|
|
+ startTime := time.Now()
|
|
|
+ var wg sync.WaitGroup
|
|
|
+ wg.Add(*count)
|
|
|
// 创建一个 channel 来控制请求的速率
|
|
|
- //reqCh := make(chan struct{}, *qps)
|
|
|
-
|
|
|
- //// 控制请求速率的 goroutine
|
|
|
- //go func() {
|
|
|
- // ticker := time.NewTicker(time.Second / time.Duration(*qps))
|
|
|
- // defer ticker.Stop()
|
|
|
- // for range ticker.C {
|
|
|
- // reqCh <- struct{}{}
|
|
|
- // }
|
|
|
- //}()
|
|
|
+ reqCh := make(chan struct{}, *qps)
|
|
|
+
|
|
|
+ // 控制请求速率的 goroutine
|
|
|
+ go func() {
|
|
|
+ ticker := time.NewTicker(time.Second / time.Duration(*qps))
|
|
|
+ defer ticker.Stop()
|
|
|
+ for range ticker.C {
|
|
|
+ reqCh <- struct{}{}
|
|
|
+ }
|
|
|
+ }()
|
|
|
|
|
|
// 发送请求的 goroutine
|
|
|
- //go func() {
|
|
|
- for i := *userOffset; i < *count; i++ {
|
|
|
- //<-reqCh
|
|
|
- //go func() {
|
|
|
- // defer wg.Done()
|
|
|
- str := strconv.Itoa(i)
|
|
|
- account := ¶m.LoginReq{
|
|
|
- Pid: 2,
|
|
|
- OpenID: str,
|
|
|
- Platform: "ios",
|
|
|
- Channel: "tg",
|
|
|
+ go func() {
|
|
|
+ for i := *userOffset; i < *count; i++ {
|
|
|
+ <-reqCh
|
|
|
+ go func() {
|
|
|
+ defer wg.Done()
|
|
|
+ str := strconv.Itoa(i)
|
|
|
+ account := ¶m.LoginReq{
|
|
|
+ Pid: 2,
|
|
|
+ OpenID: str,
|
|
|
+ Platform: "ios",
|
|
|
+ Channel: "tg",
|
|
|
+ }
|
|
|
+ n := rand.Intn(1)
|
|
|
+ switch n {
|
|
|
+ case 0:
|
|
|
+ RunRobot(*url, account, i)
|
|
|
+ case 1:
|
|
|
+ RunRobot(*url1, account, i)
|
|
|
+ case 2:
|
|
|
+ RunRobot(*url2, account, i)
|
|
|
+ case 3:
|
|
|
+ RunRobot(*url3, account, i)
|
|
|
+ }
|
|
|
+
|
|
|
+ }()
|
|
|
}
|
|
|
- RunRobot(*url, account, i)
|
|
|
- //}()
|
|
|
- }
|
|
|
- //}()
|
|
|
+ }()
|
|
|
|
|
|
// 等待所有请求完成
|
|
|
- //wg.Wait()
|
|
|
+ wg.Wait()
|
|
|
fmt.Println("All goroutines have finished.")
|
|
|
- //qpsAchieved := float64(*count) / time.Since(startTime).Seconds()
|
|
|
+ qpsAchieved := float64(*count) / time.Since(startTime).Seconds()
|
|
|
+ fmt.Printf("Sent %d requests in %v, achieved QPS: %.2f\n", *count, duration, qpsAchieved)
|
|
|
}
|
|
|
|
|
|
func RunRobot(url string, val *param.LoginReq, num int) {
|
|
@@ -184,18 +202,21 @@ func Login(url string, params map[string]interface{}, token string) {
|
|
|
requestURL := fmt.Sprintf("%s/login", url)
|
|
|
jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
|
|
|
if err != nil {
|
|
|
- mhayaLogger.Warn(err)
|
|
|
+ mhayaLogger.Warnf("login err: %v", err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
rsp := &code.Result{}
|
|
|
err = jsoniter.Unmarshal(jsonBytes, rsp)
|
|
|
if err != nil {
|
|
|
- mhayaLogger.Warn(err)
|
|
|
+ mhayaLogger.Warnf("login Unmarshal err :%v ", err)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- mhayaLogger.Debugf("Login OK")
|
|
|
+ if rsp.Code == 0 {
|
|
|
+ mhayaLogger.Debugf("Login OK : %v", rsp.Code)
|
|
|
+ } else {
|
|
|
+ mhayaLogger.Debugf("Login Fail : %v", rsp.Code)
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|