KEDA v2에서 메모리 프로파일링 활성화

9622 단어 keda
해결해야 할 사소한 메모리 누수 문제가 있습니다. KEDA에서 프로파일러를 어떻게 활성화할 수 있는지 궁금합니다. KEDA는 Operator SDK을 사용합니다.

Go lang에는 좋은 프로파일러가 있습니다.
  • Getting started with Go CPU and memory profiling
  • KEDA

  • 그것을 사용하는 것은 매우 간단합니다. 메모리 프로파일링을 위해 이 줄을 추가하기만 하면 됩니다.

    구성 및 문제



    설명서에 따르면 구성은 다음과 같습니다.

    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를 사용하여 프로파일링을 활성화하는 더 좋은 방법이 있는지 모르겠습니다. 알게 되면 이 블로그에 업데이트하겠습니다.

    참조


  • Handle Ctrl+C (Signal Interrupt) Close in the Terminal
  • 좋은 웹페이지 즐겨찾기