화염 그래프 파트 1

3028 단어 perf
개발자/시스템 관리자는 perf 도구로 기록된 시스템 성능 데이터의 시각화를 생성하기 위해 생성flamegraphs할 수 있습니다. 이 perf 출력은 총 #N개의 샘플에 대해 스택 추적과 카운트를 보여줍니다.

git clone 플레임그래프 스크립트:
cd /home/ubuntugit clone https://github.com/brendangregg/FlameGraph
linuxmint iso를 다운로드하는 go 프로그램 샘플링

package main
import (
    "fmt"
    "net/http"
    "io"
    "os"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    d1 := []byte("helo world\n")
    for i := 0; i < 10000; i++ {
        resp, err := http.Get("https://mirrors.layeronline.com/linuxmint/stable/21/linuxmint-21-cinnamon-64bit.iso")
        //body, err := io.ReadAll(resp.Body)
        fmt.Println(resp.StatusCode)
        check(err)
        defer resp.Body.Close()
        file, err := os.Create("/tmp/hello.iso")
        size, err := io.Copy(file, resp.Body)
        defer file.Close()
        fmt.Printf("downloaded %s with size %d", file, size)
        err = os.WriteFile("/tmp/check.txt", d1, 0644)
        check(err)
    }
}


main.go를 컴파일/빌드하고 실행합니다./main.
예를 들어 ps aux | grep main 기본 프로세스 ID를 가져옵니다.
perf record -a -F 99 -g -p 1464 -- sleep 20위 명령을 실행하면 perf.data 파일이 생성됩니다.
perf script > perf.script//기본적으로 현재 작업 디렉토리에서 perf.data를 읽고 stdout을 파일 perf.script(ascii 파일)로 리디렉션합니다.
이 명령은 입력 파일을 읽고 기록된 추적을 표시합니다.

불꽃 그래프 만들기:-

./FlameGraph/stackcollapse-perf.pl perf.script  | ./FlameGraph/flamegraph.pl > flame1006.svg


브라우저에서 flame1006.svg 다운로드 및 보기



여기서 우리는 io.copybuffer 함수가 대부분의 CPU 시간을 사용하고 있음을 관찰할 수 있습니다(io.copy source).
더 멀리 보는 것net.(*netFD).Read은 대부분의 CPU 시간을 사용하는 함수 호출입니다. 이 net.(*netFD).Read 구현func (*IPConn) Read Conn은 일반 스트림 지향 네트워크 연결입니다.
이 함수는 연결에서 데이터를 읽습니다. 이 함수https://go.dev/src/net/http/transfer.go
ksys_read()가 호출되는 것도 볼 수 있습니다. 이 함수는 사용자가 전달한 파일 설명자와 일치하는 struct fd 검색을 담당합니다. struct fd 구조는 그 안에 struct file_operations 구조를 포함합니다.


소켓에서 메시지를 수신하면 sock_read_iter가 실행됩니다.
그래프를 보면 메인 프로그램의 CPU 사용량이 대부분 연결에서 데이터를 읽는 데 소비된다는 결론을 내릴 수 있습니다.

좋은 웹페이지 즐겨찾기