go語言並發獲取hls,測試流媒體服務的拉流壓力


前兩天,我們的開發的兄弟們終於將我們的流媒體整體方案實現並部署了,雖然都是用的開源的項目,但是我們內部還是要測試服務表現的,這個任務就被扔給我了。

先不看內部各個鏈路的性能損耗,先測試單源,多路點播取流的場景。

使用golang,寫程序如下:

package main
 
         
import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"os"
	"regexp"
	"strconv"
	"time"
)
 
         
/*this application is used to get rtsp stream data for me*/
 
         
func main() {
	var Host = ""
	var Tim = 1
	for _, a := range os.Args[1:] {
		if string(a) == "--help" {
			fmt.Println("用法為-g 輸入goal")
			fmt.Println("用法為-t 輸入threat num")
		}
		if string(a) == "/?" {
			fmt.Println("用法為-g 輸入goal")
			fmt.Println("用法為-t 輸入threat num")
		}
		m, err := regexp.MatchString("^-[g,t]", string(a))
		reg := regexp.MustCompile(`^-[g,t]`)
		if m {
			host := reg.FindAllString(string(a), -2)[0]
			if host == "-g" {
				pp := []rune(a)
				Host = string(pp[2:len(pp)])
			}
			if host == "-t" {
				pp := []rune(a)
				tim, err := strconv.Atoi(string(pp[2:len(pp)]))
				Tim = tim
				if err != nil {
					fmt.Printf("輸入數字哦")
					return
				}
			}
		}
		if err != nil {
			fmt.Println(err)
			return
		}
	}
 
         
	if Host == "" {
		fmt.Println("please input /? for help")
		fmt.Println(string(Tim))
		return
	} else {
		for i := 1; i < Tim; i++ {
			fmt.Printf("拉起第%d個文件流\n", i)
			go getHttpHls(Host)
		}
		fmt.Println("拉起主線程文件流")
		getHttpHls(Host)
	}
}
 
         
func getHttpHls(h string) {
	req, _ := http.NewRequest("GET", h, nil)
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		// handle error
		fmt.Println(err)
		return
	}
	defer resp.Body.Close()
 
         
	//here we open a loop to read stream
	buffer := make([]byte, 8192)
	for {
		time.Sleep(500)
		_, _ = resp.Body.Read(buffer)
	}
}

  

 使用步驟:
1、使用命令:go build get_hls.go,編譯
2、使用:./get_hls  -ghttp://127.0.0.1:8082/live/20_unv01_1.flv -t1000,通過這樣的方式來獲取1000個流,並將流直接拋棄
 

 

 

 

說明:

1、我這邊自己到網上下載了一個流媒體拉流的工具,使用的時候,流媒體拉流工具的性能消耗比我的srs消耗還要大,而且一段時間會自動kill掉,所以寫以上程序來埋坑

2、因為公司局域網是百兆局域網,是沒有辦法測試出我們服務的壓力的,所以這里都是使用還回的方式在用,單路碼率為4Mbps左右,拉22路碼流就上不去了

 

上面這個程序很鄙陋,希望能夠有高手予以指導,程序中,后面的buffer是讀取到垃圾里面的,但是如果能夠不讀取,直接new處理一下,應該效果更好。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM