KEDA v2에서 메모리 프로파일링 활성화
9622 단어 keda
Go lang에는 좋은 프로파일러가 있습니다.
그것을 사용하는 것은 매우 간단합니다. 메모리 프로파일링을 위해 이 줄을 추가하기만 하면 됩니다.
구성 및 문제
설명서에 따르면 구성은 다음과 같습니다.
go get github.com/pkg/profile
그런 다음 main.go
에 다음 줄을 추가합니다.
import (
//...
"github.com/pkg/profile"
)
:
defer profile.Start(profile.MemProfile).Stop()
내 로컬 컴퓨터에서 KEDA를 실행합니다. 그러나 작동하지 않습니다. 근본 원인은 ctr+c로 operator sdk를 중지해야 한다는 것입니다. 이 경우 defer
메서드는 Stop()
메서드를 실행하지 않습니다.
ushio@DESKTOP-KIUTRHV:~/Code/keda$ make run ARGS="--zap-log-level=debug"
/home/ushio/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go run \
-ldflags "-X=github.com/kedacore/keda/version.GitCommit=d0788b943ecf94f7f7c5b1a09f777cc3af6b746e -X=github.com/kedacore/keda/version.Version=v2" \
./main.go --zap-log-level=debug
2020/10/20 09:19:49 profile: memory profiling enabled (rate 4096), /tmp/profile174831365/mem.pprof
:
^C2020/10/20 09:20:02 profile: caught interrupt, stopping profiles
Exit 0 for profiling
make: *** [Makefile:96: run] Interrupt
$ ls -l /tmp/profile287657069/mem.pprof
-rw-r--r-- 1 ushio ushio 0 Oct 20 09:18 /tmp/profile287657069/mem.pprof
해결책
SIG 인터럽트를 처리하려면 신호를 처리하는 방법signal.Notify
을 사용할 수 있습니다.
func SetupCloseHandler() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("\r- Ctrl+C pressed in Terminal")
DeleteFiles()
os.Exit(0)
}()
}
main.go을 읽었는데 신호 처리 부분도 있습니다. 호출profile.Stop()
방식으로 변경해 보겠습니다.
func main() {
// Memory profiling
f := profile.Start(profile.MemProfile, profile.NoShutdownHook)
:
// if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
// setupLog.Error(err, "problem running manager")
// os.Exit(1) // Profiling test
// }
fmt.Println("-----SetupCloseHandler")
setupSignalHandler := func() (stopCh <-chan struct{}) {
stop := make(chan struct{})
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Exit 0 for profiling")
f.Stop()
os.Exit(1) // second signal. Exit directly.
}()
return stop
}
if err := mgr.Start(setupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
그것을 실행합니다. 공장!
$ ls -l /tmp/profile388737932/mem.pprof
-rw-r--r-- 1 ushio ushio 47888 Oct 20 09:31 /tmp/profile388737932/mem.pprof
뷰어
다음 단계는 분석 보고서를 보는 것입니다.
graphviz이 필요해 보입니다. 그것을 설치하십시오.
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH
$ sudo apt install graphviz
공장!
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
Operator SDK를 사용하여 프로파일링을 활성화하는 더 좋은 방법이 있는지 모르겠습니다. 알게 되면 이 블로그에 업데이트하겠습니다.
참조
go get github.com/pkg/profile
import (
//...
"github.com/pkg/profile"
)
:
defer profile.Start(profile.MemProfile).Stop()
ushio@DESKTOP-KIUTRHV:~/Code/keda$ make run ARGS="--zap-log-level=debug"
/home/ushio/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go run \
-ldflags "-X=github.com/kedacore/keda/version.GitCommit=d0788b943ecf94f7f7c5b1a09f777cc3af6b746e -X=github.com/kedacore/keda/version.Version=v2" \
./main.go --zap-log-level=debug
2020/10/20 09:19:49 profile: memory profiling enabled (rate 4096), /tmp/profile174831365/mem.pprof
:
^C2020/10/20 09:20:02 profile: caught interrupt, stopping profiles
Exit 0 for profiling
make: *** [Makefile:96: run] Interrupt
$ ls -l /tmp/profile287657069/mem.pprof
-rw-r--r-- 1 ushio ushio 0 Oct 20 09:18 /tmp/profile287657069/mem.pprof
SIG 인터럽트를 처리하려면 신호를 처리하는 방법
signal.Notify
을 사용할 수 있습니다.func SetupCloseHandler() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("\r- Ctrl+C pressed in Terminal")
DeleteFiles()
os.Exit(0)
}()
}
main.go을 읽었는데 신호 처리 부분도 있습니다. 호출
profile.Stop()
방식으로 변경해 보겠습니다.func main() {
// Memory profiling
f := profile.Start(profile.MemProfile, profile.NoShutdownHook)
:
// if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
// setupLog.Error(err, "problem running manager")
// os.Exit(1) // Profiling test
// }
fmt.Println("-----SetupCloseHandler")
setupSignalHandler := func() (stopCh <-chan struct{}) {
stop := make(chan struct{})
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Exit 0 for profiling")
f.Stop()
os.Exit(1) // second signal. Exit directly.
}()
return stop
}
if err := mgr.Start(setupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
그것을 실행합니다. 공장!
$ ls -l /tmp/profile388737932/mem.pprof
-rw-r--r-- 1 ushio ushio 47888 Oct 20 09:31 /tmp/profile388737932/mem.pprof
뷰어
다음 단계는 분석 보고서를 보는 것입니다.
graphviz이 필요해 보입니다. 그것을 설치하십시오.
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH
$ sudo apt install graphviz
공장!
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
Operator SDK를 사용하여 프로파일링을 활성화하는 더 좋은 방법이 있는지 모르겠습니다. 알게 되면 이 블로그에 업데이트하겠습니다.
참조
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH
$ sudo apt install graphviz
$ go tool pprof --pdf /tmp/profile356144532/mem.pprof > file.pdf
Reference
이 문제에 관하여(KEDA v2에서 메모리 프로파일링 활성화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tsuyoshiushio/enabling-memory-profiling-on-keda-v2-157g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)