рдЧреЛ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдЯреЗрд╕реНрдЯ

рд╢реБрдн рджреЛрдкрд╣рд░, рд╣рдмрд░рд╣рд╛рдмред
рдЖрдк рд╢рд╛рдпрдж JMeter рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдпрджрд┐ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг, рдЗрд╕рдХреА рдорд╣рд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдХрдИ, рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХрд╣рд╛рдВ рд╕реЗ рд╣реБрдИ

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рднрд░реА рд╣реБрдИ рдиреЛрдб рд╣реИ, рдЬреЗрдореАрдЯрд░ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорджрдж рдХреАред рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдиреЗ рдЕрдкрдирд╛ рд▓рд╛рдн рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред JMeter рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрд╛, рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдореЛрдб рдХреЗ 10 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, OutOfMemory рдЬрдЧрд╣ рд▓реЗ рд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЧрддрд┐ рдореЗрдВ рдХрд╛рдлреА рдХрдореА рдЖрдИ, рдЬрдмрдХрд┐ CPU рд▓реЛрдб 400% рдерд╛, рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ред рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЕрд╕рд╣рдЬ рдерд╛ред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдИ рд╣реИ рд╡рд╣ рд╣реИ рдЕрдкрдирд╛ рдорд┐рдиреА-рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЬреЛ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЧреЛ рдХреЗ рд╕реНрд╡рд╛рдж рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рддреЛ рдЧреЛ-рдореАрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред рд▓рд┐рдЦрддреЗ рд╕рдордп, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢реНрди рдереЗ, рдЬрд┐рдирдХреЗ рдЙрддреНрддрд░ рдпрд╛ рддреЛ рдирд╣реАрдВ рдереЗ, рдпрд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХреА рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдФрд░ рдХрд╛рд░реНрдп рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ рдирд┐рд╡реЗрджрди рдХрд░рддрд╛ рд╣реВрдВред

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХреА рднрд╛рд╖рд╛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЖрдк рд╣рдореЗрд╢рд╛ рдореВрд▓ рддрддреНрд╡реЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рджреМрд░рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрд╣ рднреА рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдкрдиреЗ рдЧреЛ рдХреНрдпреЛрдВ рдЪреБрдирд╛? рдРрд╕реЗ рдХрдИ рдорд╛рдирджрдВрдб рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ: рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо, рдРрд╕реЗ рдкреНрд░рд╡рд╛рд╣ рд╣реИрдВ рдЬреЛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВ, рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдирд╛ рднреА рдерд╛ред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдФрд░ рд╕рдлрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд)ред JSON рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдкрдврд╝реЗрдВ:
func (this *Settings) Load(fileName string) error { file, e := ioutil.ReadFile(fileName); if e != nil { return e } e = json.Unmarshal(file, this); if e != nil { return e } return nil } 


рдФрд░ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрди-рдереНрд░реЗрдбреНрд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╡рд░реНрдХрдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдХреЛ рдПрдЧреНрд░реАрдЧреЗрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рд╖рд╛ рдореЗрдВ рдЪреИрдирд▓ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдкрд╛рдЗрдк"ред рдХреЛрдИ рддреБрд▓реНрдпрдХрд╛рд▓рди, рддрд╛рд▓реЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдПрдХ рдереНрд░реЗрдб рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдереНрд░реЗрдб рдкреВрд░реЗ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред рдзрд╛рд░рд╛рдПрдБ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрдирд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВрдЧреА:
 type Status struct { IsError bool IsWarning bool IsSuccess bool Duration *time.Duration Size int64 IsFinished bool Error *error FinishedAt *time.Time StartedAt *time.Time } 

рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП M-time HTTP рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ POST рдЕрдиреБрд░реЛрдз рд╣реИ, рддреЛ рдЕрднреА рднреА рдХреБрдЫ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:
 func StartThread(setts *settings.Settings, source *Source, c chan *Status){ iteration := setts.Threads.Iteration //  key, value    header := map[string]string{} for _, s := range setts.Request.Headers { keyValue := regexp.MustCompile("=").Split(s, -1) header[keyValue[0]] = keyValue[1] } sourceLen := len(*source) // URL url := setts.Remote.Protocol + "://" + setts.Remote.Host + ":" + strconv.Itoa(setts.Remote.Port) + setts.Request.Uri if iteration < 0 { iteration = sourceLen } index := -1 for ;iteration > 0; iteration-- { status := &Status{false, false, false, nil, 0, false, nil, nil, nil} index++ if index >= sourceLen { if setts.Request.Source.RestartOnEOF { index = 0 } else { index-- } } //     var s *bytes.Buffer if strings.ToLower(setts.Request.Method) != "get" { s = bytes.NewBuffer((*source)[index]) } // HTTP  req, err := http.NewRequest(setts.Request.Method, url, s); if err != nil { status.Error = &err status.IsError = true c <- status break } //  for k,v := range header { req.Header.Set(k,v) } //  startTime := time.Now() //  res, err := http.DefaultClient.Do(req); if err != nil { status.Error = &err status.IsError = true c <- status break } endTime := time.Now() //   status.FinishedAt = &endTime status.StartedAt = &startTime diff := endTime.Sub(startTime) //        3  (Error, Warning, Success) checkStatus(setts.Levels, res, diff, status) //  ioutil.ReadAll(res.Body) res.Body.Close() //   c <- status //    ,   if setts.Threads.Delay > 0 { sleep := time.Duration(setts.Threads.Delay) time.Sleep(time.Millisecond * sleep) } } //      status := &Status{false, false, false, nil, 0, true, nil, nil, nil} c <- status } 


рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╣рдорд╛рд░реЗ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЙрдирд╕реЗ рдбреЗрдЯрд╛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ
 c := make(chan *Status, iteration * setts.Threads.Count) for i := 0; i < setts.Threads.Count; i++{ go StartThread(&setts, source, c) } for i := iteration * setts.Threads.Count; i>0 ; i-- { counter(<-c) } fmt.Println("Completed") 


рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖рдг рд╣реИрдВред GitHub рдкрд░ рд╕рднреА рд╕реНрд░реЛрдд рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рд╡рд╣рд╛рдВ рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рдкреВрд░реЗ рдЪрдХреНрд░ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдЪрдорддреНрдХрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд░реВрдЪрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛; рдЬрдм рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬреЗрдПрдордореАрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 3 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдерд╛, рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рд╢рд╛рдпрдж рд╣реА рдХрднреА 15% рд╕реЗ рдЕрдзрд┐рдХ рдерд╛ред
рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ MongoDB рдФрд░ Redis рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде HTTP рд░рд┐рд╕реНрдЯрдлрд╝реБрд▓ рд╡реЗрдм рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In187212/


All Articles