화염 그래프 파트 1
3028 단어 perf
git clone 플레임그래프 스크립트:
cd /home/ubuntu
git 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 사용량이 대부분 연결에서 데이터를 읽는 데 소비된다는 결론을 내릴 수 있습니다.
Reference
이 문제에 관하여(화염 그래프 파트 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sherpaurgen/flamegraphs-part-1-2ncl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)