压力测试

使用golang的pprof查看内存泄漏

导入包

"net/http"
   _ "net/http/pprof"

开一个端口

go func() {
  log.Println(http.ListenAndServe(":6060", nil))
}()

访问地址

说明

  • allocs:查看过去所有内存分配的样本(历史累计)。
  • block:查看导致阻塞同步的堆栈跟踪(历史累计)。
  • cmdline: 当前程序的命令行的完整调用路径(从程序一开始运行时决定)。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪(实时变化)。
  • heap:查看活动对象的内存分配情况(实时变化)。
  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪(历史累计)。
  • 在这个页面下,点击profiletrace总是会下载文件。

终端使用

go tool pprof http://localhost:6060/debug/pprof/XXX
  • 参数
    • -seconds=5:收集5秒内的数据


规范的压力测试过程

  • 当第一个连接成功完成了第一个业务就可以发送下一个连接
  • 多台电脑同时测试
  • 压测3个月,服务器还可以跑,说明程序没有问题

压力测试的目的

  • 查看是否有内存泄漏

压测中发现的问题

  • golang在开了大量的G之后,所有G都结束之后,内存不会变回和原来一样,会多出一部分
    • pprof查看,发现是runtime.malg占用了内存
      • runtime.malg是给G分配栈内存的
    • 网上查找说的是大量的G产生后会有内存碎片化的情况
    • 也有说是runtime.malg会保留一部分内存来让下一次更快的产生G

Tags:

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *

       

粤公网安备44011302004556号