Go最全常用调试golang的bug以及性能问题的实践方法_go有性能问题的代码,互联网行业“中年”危机

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

如何分析程序运行时间和CPU利用率情况

1.shell内置time指令

time是Unix/linux内置多命令,使用时一般不用传过多参数,直接跟上需要调试多程序即可。

$ time go run test2.go 
&{{0 0} 张三 0}

real	0m0.843s
user	0m0.216s
sys	0m0.389s

上面是使用time对 go run test2.go对执行程序坐了性能分析,得到3个指标。

● real:从程序开始到结束,实际度过的时间;
● user:程序在用户态度过的时间;
● sys:程序在内核态度过的时间。

一般情况下 real >= user + sys,因为系统还有其它进程(切换其他进程中间对于本进程会有空白期)

/usr/bin/time指令

这个指令比内置的time更加详细一些,使用的时候需要用绝对路径,而且要加上参数-v

$ /usr/bin/time -v go run test2.go  

	Command being timed: "go run test2.go"
	User time (seconds): 0.12
	System time (seconds): 0.06
	Percent of CPU this job got: 115%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.16
	Average shared text size (kbytes): 0
	Average unshared data size (kbytes): 0
	Average stack size (kbytes): 0
	Average total size (kbytes): 0
	Maximum resident set size (kbytes): 41172
	Average resident set size (kbytes): 0
	Major (requiring I/O) page faults: 1
	Minor (reclaiming a frame) page faults: 15880
	Voluntary context switches: 897
	Involuntary context switches: 183
	Swaps: 0
	File system inputs: 256
	File system outputs: 2664
	Socket messages sent: 0
	Socket messages received: 0
	Signals delivered: 0
	Page size (bytes): 4096
	Exit status: 0

可以看到这里的功能要强大多了,除了之前的信息外,还包括了:

● CPU占用率;
● 内存使用情况;
● Page Fault 情况;
● 进程切换情况;
● 文件系统IO;
● Socket 使用情况;
● ……

如何分析golang程序的内存使用情况?

1.内存占用情况查看

package main

import (
    "log"
    "runtime"
    "time"
)

func test() {
    //slice 会动态扩容,用slice来做堆内存申请
    container := make([]int, 8)

    log.Println(" ===> loop begin.")
    for i := 0; i < 32\*1000\*1000; i++ {
        container = append(container, i)
    }
    log.Println(" ===> loop end.")
}

func main() {
    log.Println("Start.")

    test()

    log.Println("force gc.")
    runtime.GC() //强制调用gc回收

    log.Println("Done.")

    time.Sleep(3600 \* time.Second) //睡眠,保持程序不退出
}

编译

$go build -o snippet && ./snippet

然后在./snippet进程没有执行完,我们再开一个窗口,通过top命令查看进程的内存占用情况

$top -p $(pidof snippet\_mem)

结果如下:
在这里插入图片描述
我们看出来,没有退出的snippet_mem进程有约830m的内存被占用。

直观上来说,这个程序在test()函数执行完后,切片contaner的内存应该被释放,不应该占用830M那么大。
结论:
1、在test()函数执行完后,demo程序中的切片容器所申请的堆空间都被垃圾回收器回收了。

2、如果此时在top指令查询内存的时候,如果依然是800+MB,说明垃圾回收器回收了应用层的内存后,(可能)并不会立即将内存归还给系统。

如何分析golang程序的CPU性能情况

1.性能分析注意事项

● 性能分析必须在一个
可重复的、稳定的环境中来进行。
○ 机器必须闲置
■ 不要在共享硬件上进行性能分析;
■ 不要在性能分析期间,在同一个机器上去浏览网页
○ 注意省电模式和过热保护,如果突然进入这些模式,会导致分析数据严重不准确
○ 不要使用虚拟机、共享的云主机,太多干扰因素,分析数据会很不一致;
○ 不要在 macOS 10.11 及以前的版本运行性能分析,有 bug,之后的版本修复了。

如果承受得起,购买专用的性能测试分析的硬件设备,上架。

● 关闭电源管理、过热管理;
● 绝不要升级,以保证测试的一致性,以及具有可比性。

如果没有这样的环境,那就一定要在多个环境中,执行多次,以取得可参考的、具有相对一致性的测试结果

2.CPU性能分析

利用以下代码进行测试:

package main

import (
    "bytes"
    "math/rand"
    "time"
    "log"
    "net/http"
    \_ "net/http/pprof"
)


func test() {

    log.Println(" ===> loop begin.")
    for i := 0; i < 1000; i++ {
        log.Println(genSomeBytes())
    }

    log.Println(" ===> loop end.")
}

//生成一个随机字符串
func genSomeBytes() \*bytes.Buffer {

    var buff bytes.Buffer

    for i := 1; i < 20000; i++ {
        buff.Write([]byte{'0' + byte(rand.Intn(10))})
    }

    return &buff
}

func main() {

    go func() {
        for {
            test()
            time.Sleep(time.Second \* 1)
        }
    }()

    //启动pprof
    http.ListenAndServe("0.0.0.0:10000", nil)

}

这里面还是启动了pprof的监听,有关pprof启动的代码如下:



![img](https://img-blog.csdnimg.cn/img_convert/cde144066f87219d03eba414d8787d3c.png)
![img](https://img-blog.csdnimg.cn/img_convert/8af3b0fc0b47ffcb14faee5fc74a4f62.png)
![img](https://img-blog.csdnimg.cn/img_convert/510db9811223c9aa9f11566ccf452a02.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

10437615)]
[外链图片转存中...(img-AIHExFHu-1715510437616)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值