Я пытаюсь профилировать свой обработчик http, написанный на go. Который на каждый http-запрос загружает изображение с S3, изменяет его размер/обрезает и пишет в ответ.
Я следил за этим link и попытался профилировать мой код, как указано, используя как простой, так и сложный метод. Теперь, когда я использую следующую строку, как указано в коде.
defer profile.Start(profile.CPUProfile).Stop()
В файле /tmp/profie[some number]/cpu.pprof
ничего не пишет
func main() {
defer profile.Start(profile.CPUProfile).Stop()
if err := http.ListenAndServe(":8081", http.HandlerFunc(serveHTTP)); err != nil {
logFatal("Error when starting or running http server: %v", err)
}
}
func serveHTTP(w http.ResponseWriter, r *http.Request) {
keyName := r.URL.Path[1:]
s3Client := s3.New(session.New(), &aws.Config{Region: aws.String(region)})
params := &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
}
mw := imagick.NewMagickWand()
defer mw.Destroy()
...
}
Более того, когда я использовал строку defer profile.Start(profile.CPUProfile).Stop()
внутри serveHTTP
, например:
func serveHTTP(w http.ResponseWriter, r *http.Request) {
defer profile.Start(profile.CPUProfile).Stop()
......
}
Он создает несколько файлов в папке /tmp/profile[some number]
. Итак, первый вопрос, почему он не записывается в файл, а во-вторых, не должен ли он находиться внутри serveHTTP method
, потому что сервер запустится только один раз. Следовательно, main()
будет вызываться один раз, тогда как serveHTTP
будет вызываться при каждом запросе.
Часть 1
. 124: s3Client := s3.New(session.New(), &aws.Config{Region: aws.String(region)})
. . 125: params := &s3.GetObjectInput{
. . 126: Bucket: aws.String(masterBucketName),
. . 127: Key: aws.String(keyName),
. 32.01kB 128: }
. . 129:
. . 130: mw := imagick.NewMagickWand()
. . 131: defer mw.Destroy()
. . 132:
. . 133: out, err := s3Client.GetObject(params)
. . 134:
. . 135: if strings.EqualFold(keyName[strings.LastIndex(keyName,".")+1:len(keyName)], "gif") {
. . 136:
. 40.11kB 137: blobGiff, err := ioutil.ReadAll(out.Body)
. . 138: w.Header().Set("Content-Type", "image/gif")
. . 139: w.Header().Set("Cache-Control", "max-age: 604800, public")
. . 140: w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat))
. . 141: w.Header().Set("Expires", time.Now().AddDate(1, 0, 0).Format(http.TimeFormat))
. . 142:
Часть 2 :
else {
. . 167: img, err := ioutil.ReadAll(out.Body)
. . 168: if err != nil {
. . 169:
. . 170: w.WriteHeader(http.StatusNotFound)
. 1.56MB 171: return
. . 172: }
Кроме того, в приведенных выше двух частях строки 128, 137 и 171 есть утечки памяти, верно? Кроме того, я не нахожу возможности закрыть/уничтожить s3Client
и blobGiff
(байт []).
defer
вmain
никогда не запускается, потому чтоhttp.ListenAndServe
блокируется навсегда. Вы получаете несколько файлов, когда помещаете их в обработчик запросов, потому что обработчик вызывается несколько раз и каждый раз создает новый профиль. - person thwd   schedule 12.02.2016serveHTTP
. В файл ничего не пишет. - person Naresh   schedule 12.02.2016defer profile.Start(profile.CPUProfile).Stop()
в main, так как отсрочка никогда не будет вызвана (ListenAndServe блокируется и ждет вечно). Когда вы вызываетеdefer profile.Start(profile.CPUProfile).Stop()
в своей функции serveHTTP, профилировщик уже запущен (из основного), поэтому он ничего не запишет (поскольку профилировщик не может запускаться более одного раза за раз). - person nussjustin   schedule 12.02.2016