Golang程序性能pprof使用介绍
Mar 29, 2021 · 4 min read对于Golang程序性能分析,pprof 可以说是一大利器,它是用来性能分析的工具,主要可以分析CPU使用情况、内存使用情况、阻塞情况、竞争互斥锁等性能问题。 整个分析主要分为三个部分: 项目中引入相关的包; 编译程序运行并收集运行时的数据; 分析相关数据 引入并收集数据 Golang标准库中提供了两种引入方式: runtime/pprof: 将程序运行时的性能分析数据写入到文件中,然后可通过pprof可视化分析工具进行分析;支持使用标准测试包构建的性能分析基准测试; net/http/pporf: 通过HTTP Server的方式提供pprof可视化工具所需要的性能分析数据; runtime/pprof 支持基准测试:以下命令在当 …
阅读更多Nosql 目前主流说法已经从 no sql 变为现在的 not only sql,这个不仅仅是因为 nosql 数据库提供了类似 sql 的查询语言,更是因为它为我们解决复杂场景下业务需求和分布式数据处理提供了有效解决方法。 目前nosql数据库已经有200多个(从 https://hostingdata.co.uk/nosql-database/ 可以看到已经有225个),但是我们目前常用的数据库有以下四类: KV数据库、文档数据库、列式数据库、全文搜索引擎。本文就以redis、mongodb、hbase、ES为例说明这几种数据的区别以及各自的适用场景。 Redis 以redis 为代表的键/值对存储数据库,可以允许你将键/值存 …
阅读更多单测是提高代码质量的重要一环,在提交代码尤其是开源社区单测一般是必需要随代码一起提交的,下面我们来看一下Golang中是如何写单元测试的。 Go中提供了专门用来写单元测试的包 testing, 运行时只需要 go test 即可。 单元测试主要分为以下三类: 功能测试(Test) 性能测试(Benchmark) 示例测试(Example) 测试文件名称一般是源代码文件加上 "_test.go", 比如 源代码文件为 add.go ,则测试文件名称为add_test.go。 在展开单元测试之前先讲下,testing包中的输出函数: t.Log() : 正常日志输出; t.Errorf(): 错误日志输出,当前函数继 …
阅读更多要处理timewait 过多的问题,首先应该清楚这个状态是由来,即需要了解TCP 状态迁移的过程; TCP 三次握手四次挥手状态迁移 1 TCP A TCP B 2 3 1. CLOSED LISTEN 4 5 2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED 6 7 3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 8 9 4. ESTABLISHED --> …
阅读更多什么是 Kubernetes Kubernetes(简称K8s) 是由 Google 在2014年开源的容器编排与调度管理框架,主要是为用户提供一个具有普遍意义的容器编排工具。该项目是Google内部大规模集群管理系统-Borg的一个开源版本,目前是由CNCF(Cloud Native Computing Foundation)托管项目。 Kubernetes 的主要特点: 可扩展:Kubernetes 是高度可配置且可扩展的。 可移植:Kubernetes 不限于特定平台,可以在各种公共或者私有云平台上运行。 自动化:Kubernetes 是一个高度自动化的平台:可自动部署/回滚、自我修复、自动扩缩容。 Kubernetes …
阅读更多Go语言 最大的特点是提供简单易用的并发编程,这个并发的执行单元就是goroutine, 这个goroutine 是运行在用户态,并由GO自身来调度。调度器来决定谁来使用CPU资源,谁该让出CPU资源。 本文就来深入探讨一下Go的调度原理。 GMP调度模型 Go采用的是GMP调度模型。 核心概念 G :即Goroutine ,使用关键字 go 即可创建一个协程来处理用户程序,如下所示: 1 go func() //创建协程来执行函数 M :Machine 系统抽象的线程,代表真正的机器资源,目前最多10000,超过这个数量会panic. P :Process,虚拟处理器,代表goroutine的上下文,用于关联G和M;P的数量可以通 …
阅读更多知其然,也要知其所以然,从今天开始研究一下golang的底层实现,首先从其启动开始; 找到启动点 1. 写一个hello world. 1package main 2 3import ( 4 "fmt" 5) 6 7func main() { 8 fmt.Println("hello world") 9} 2.编译后使用gdb找到entry point 1$ gdb hello 2 ..... 3 file type mach-o-x86-64. 4 Entry point: 0x1052720 5 0x0000000001001000 - 0x0000000001093074 is .text 6 …
阅读更多程序组成 程序由代码和数据组成,数据又有静态与动态之分; 动态数据:存放在堆区和栈区; 静态数据:静态只读数据可以放在代码区,也可以放在特定的只读数据区; 可读写的已初始化的静态数据放在数据区,可读写的未初始化的静态数据放在bss区; 寄存器 伪寄存器 FP(Frame pointer): 表示参数以及返回值的基地址; 通过 SYMBOL+/-ffset(FP) PC(Program counter): 跳转寄存器,存储下一条指令地址; SB(Static base pointer): 全局静态起始地址. SP(Stack pointer): 表示本地变量的起始地址; 使用方式 symbol + offset(SP), 例如第一个变 …
阅读更多Go module 是golang最新的包管理工具,可以使依赖包版本信息更明确与可控。module 是关于Go packages的集合,存储在根目录下的go.mod文件中,go.mod 定义了模块的模块路径以及模块的依赖属性,依赖属性包含模块路径以及特定寓意的版本信息。 需要注意的是:在Go 1.13之前go module 在GOPATH下是默认不开启的,这是为了兼容的需要,如果需要使用go module可以在GOPATH/src外的路径创建go.mod文件。 本文会介绍Go module的一些基本用法; 常见命令 创建一个模块 添加一个依赖 升级依赖 其他命令 常见命令 go mod 提供了以下命令 download: 下载依赖包 …
阅读更多shell 使用超强组合 oh-my-zsh + zsh-autosuggestions + z - jump around。 oh-my-zsh : 目前非常火的终端配置,只需要简单下载到本地,就可以使用; autosuggestions: 补全已经输入过的命令; jump around : 感觉这个非常有用,在目录的跳转之间节省大量的时间; 命令 hstr: 查找历史命令,比Ctrl+R 方便太多,如果使用zsh 需要执行hstr --show-configuration >> ~/.zshrc , source ~/.zshrc ; htop: 加强版的top, 安装与介绍可以看一下这里
阅读更多