|
|
|
|
@ -68,10 +68,15 @@ func init() {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// main -mode=deliver -users=10 -send=10
|
|
|
|
|
func main() { |
|
|
|
|
runtime.GOMAXPROCS(runtime.NumCPU()) |
|
|
|
|
|
|
|
|
|
flag.StringVar(&gatewayHttp, "gateway", "http://192.168.110.36:7000", "http gateway address") |
|
|
|
|
flag.StringVar(&benchmarkMode, "mode", "deliver", "benchmark mode: deliver/group") |
|
|
|
|
flag.IntVar(&mockUsers, "users", 10, "mock users") |
|
|
|
|
flag.IntVar(&eachUserSend, "send", 10, "each user send msg count") |
|
|
|
|
flag.Parse() |
|
|
|
|
|
|
|
|
|
if benchmarkMode == "group" { |
|
|
|
|
benchmarkGroup() |
|
|
|
|
@ -109,29 +114,9 @@ func benchmark() {
|
|
|
|
|
// go prof.StartPprof(":8888")
|
|
|
|
|
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
|
|
go records(ctx) |
|
|
|
|
mockUsersConnect(ctx) |
|
|
|
|
|
|
|
|
|
mockNetUsers = make([]*NetUser, mockUsers) |
|
|
|
|
// initial uids
|
|
|
|
|
for i := 0; i < mockUsers; i++ { |
|
|
|
|
uid := strconv.Itoa(110000 + i) |
|
|
|
|
token, err := getToken(uid) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
conn, err := getConn(token) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
err = handleConn(ctx, uid, token, conn) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
mockNetUsers[i] = &NetUser{ |
|
|
|
|
Uid: uid, |
|
|
|
|
Conn: conn, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
go records(ctx) |
|
|
|
|
|
|
|
|
|
for i := 0; i < mockUsers; i++ { |
|
|
|
|
netUser := mockNetUsers[i] |
|
|
|
|
@ -145,9 +130,6 @@ func benchmark() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func benchmarkGroup() { |
|
|
|
|
benchmarkMode = "groupDeliver" |
|
|
|
|
runtime.GOMAXPROCS(runtime.NumCPU()) |
|
|
|
|
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
|
|
shutdown.AddHook(cancel) |
|
|
|
|
|
|
|
|
|
@ -163,33 +145,15 @@ func benchmarkGroup() {
|
|
|
|
|
} |
|
|
|
|
groupId := "9527" |
|
|
|
|
|
|
|
|
|
// initial mock users, join to postal group
|
|
|
|
|
mockNetUsers = make([]*NetUser, mockUsers) |
|
|
|
|
for i := 0; i < mockUsers; i++ { |
|
|
|
|
uid := strconv.Itoa(110000 + i) |
|
|
|
|
token, err := getToken(uid) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
conn, err := getConn(token) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
err = handleConn(ctx, uid, token, conn) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
mockNetUsers[i] = &NetUser{ |
|
|
|
|
Uid: uid, |
|
|
|
|
Conn: conn, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mockUsersConnect(ctx) |
|
|
|
|
for _, user := range mockNetUsers { |
|
|
|
|
// join group
|
|
|
|
|
err = groupDeliver.GroupJoin(context.Background(), uid, []string{groupId}) |
|
|
|
|
err := groupDeliver.GroupJoin(context.Background(), user.Uid, []string{groupId}) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
shutdown.AddHook(func() { |
|
|
|
|
if err := groupDeliver.GroupDissolve(context.Background(), groupId); err != nil { |
|
|
|
|
logger.Error("dissolve group error: ", err) |
|
|
|
|
@ -201,7 +165,7 @@ func benchmarkGroup() {
|
|
|
|
|
go records(ctx) |
|
|
|
|
|
|
|
|
|
// send group message
|
|
|
|
|
message := &chat.ChatMessage{Sender: "100001", Content: "hello"} |
|
|
|
|
message := &chat.ChatMessage{Sender: "10001", Content: "hi"} |
|
|
|
|
for i := 0; i < eachUserSend; i++ { |
|
|
|
|
err := groupDeliver.DeliverGroup(context.Background(), groupId, message) |
|
|
|
|
if err != nil { |
|
|
|
|
@ -213,6 +177,44 @@ func benchmarkGroup() {
|
|
|
|
|
shutdown.Await() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// mockUsersConnect 并行快速创建链接
|
|
|
|
|
func mockUsersConnect(ctx context.Context) { |
|
|
|
|
// initial mock users, join to postal group
|
|
|
|
|
mockNetUsers = make([]*NetUser, mockUsers) |
|
|
|
|
|
|
|
|
|
concurrent := 100 |
|
|
|
|
wg := sync.WaitGroup{} |
|
|
|
|
wg.Add(concurrent) |
|
|
|
|
each := (mockUsers / concurrent) + 1 |
|
|
|
|
|
|
|
|
|
for i := 0; i < concurrent; i++ { |
|
|
|
|
go func(segment int) { |
|
|
|
|
begin, end := segment*each, (segment+1)*each |
|
|
|
|
for i := begin; i < end && i < mockUsers; i++ { |
|
|
|
|
uid := strconv.Itoa(110000 + i) |
|
|
|
|
token, err := getToken(uid) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
conn, err := getConn(token) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
err = handleConn(ctx, uid, token, conn) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
mockNetUsers[i] = &NetUser{ |
|
|
|
|
Uid: uid, |
|
|
|
|
Conn: conn, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
wg.Done() |
|
|
|
|
}(i) |
|
|
|
|
} |
|
|
|
|
wg.Wait() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func sendBatchChatMessage(ctx context.Context, uid string, conn *websocket.Conn, count int) { |
|
|
|
|
r := rand.New(rand.NewSource(time.Now().UnixMilli())) |
|
|
|
|
for i := 0; i < count; i++ { |
|
|
|
|
|