Go 服务性能分析 pprof 的使用

Go 服务性能分析 pprof 的使用 go 是主打性能的语言 所以官方集成了方便性能检测的工具 go tool pprof 方便好用,主要可以收集如下指标 profile : 程序 cpu 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 heap : 程序 heap 内存使用情况,和调用关系 goroutine : 程序内 goroutine 启动数,各自的调用情况。 block : 报告导致阻塞的同步原语的情况 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈。默认情况下未启用,需要手动调用runtime.SetBlockProfileRate启用。 mutex: 报告锁竞争。默认情况下未启用,需要手动调用runtime.SetMutexProfileFraction启用。 集成到服务 服务应用 常驻的服务型应用要使用 pprof 首先得在服务启动入口导入包 import _ "net/http/pprof" ··· go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() 然后浏览器访问http://localhost:6060/debug/pprof/,显示如下页面 如上如果服务是 http 服务且使用的是 http.DefaultServeMux 不需要做任何路由注册默认会注册相关路由,初始化调用了init 函数会自动注册,路径为 /debug/pprof/,显示上图,能大概看个当前 goroutine 数目、堆分配情况、锁的情况,具体分析还是要使用下文的 go tool pprof 工具。 如果使用的是自定义的 ServeMux 或 Handler 需要我们自己手动注册需要的路由,比如使用 echo 框架的时候...

December 16, 2022 · 6 min · 1082 words · Fython

Go 中的类型和比较

Go 中的类型和比较 go 是一个强类型的语言,map 中要求键(key)必须是可比较的(comparable),什么是可比较呢?就是能用操作符 == 的类型, 我们知道必须两个类型一致才能比较,否则编译器会报 invalid operation: a == c (mismatched types...) 的错误,准确的说基本类型(int8,float32,string)符合上面的原则,但 golang 中又有复合类型就不一样,先来看 go 中的类型 1. 基本类型 (Basic Types) 数字类型: int8, uint8 (byte), int16, uint16, int32 (rune), uint32, int64, uint64, int, uint, uintptr. float32, float64. complex64, complex128. 布尔类型: bool 字符串类型: string 2. 复合类型 (Basic Types) 结构体(struct)类型 函数:go 中函数是一等公民,也是一种类型 数组(array):包括长度和类型,不同长度的相同类型不属于同一类型 切片(slice):切片有动态的长度和容量是一种引用类型 字典(map):底层是哈希表也是一种引用类型 指针类型(pointer) 管道(channel) 接口类型(interface) 类型重定义(Type Definitions)和类型别名(Type Alias Declarations) 讲完了类型再来看看用户可以创建自己的类型(类型重定义)和创建别名,先看类型定义 // Define a solo new type. // type NewTypeName SourceType type MyInt int type Num int 上面定义了 MyInt , Num 两个类型,虽然他们的源类型都是 int 但他们是不同的类型,所以他们是不可以比较的,但可以通过转换成相同类型的再比较如...

May 29, 2022 · 4 min · 730 words · Fython

Go 中的 Arrays 和 Slices

Golang 中的 Arrays 和 Slices 在 go 语言中,我们经常使用Slices类型因为它的方便和灵活,它和另一个Arrays类型有着密切的关系,Slices 是建立在 Arrays 的基础上的,搞明白它们的原理能使我们更加的轻松的使用它们 Arrays Arrays 和别的语言(C、Java)的类型一样,有固定的长度,在内存里是一块连续的空间,用以存储相同类型的 types。用如下方式申明 var array [5]int 像[size]T在 go 中申明array,size 是 type 的一部分 如上面的[5]int代表 5 个 int 元素的 Arrays,和另一个如[10]int是不同的类型,Arrays 有确定的长度。并且申明之后带默认值(各类型的零值)。也可以使用[...]符号省略 size 申明,编译器自动计算 如array := [...]int{1, 2, 3, 4, 5} 变量array引用的是整个 Array 而不是 Array 的第一个元素,如果将一个数组另外赋值是将这个数组拷贝了一份,数组作为函数参数也是将整个数组拷贝一份,非引用数组的指针 Slices 就是因为 Arrays 比较难用,go 在此基础上建立了 Slices,它是可以动态调整长度(dynamically-sized)的描述 Arrays 一部分的 types,Slices 可以使用切片数组的方式得到 array := [5]int{1, 2, 3, 4, 5} // Arrays var slice = array[1:4] // same as `var slice []int = array[1:4]` fmt....

April 8, 2021 · 3 min · 507 words · Fython