Go实战之常用命令行工具(下)

简介: Go实战之常用命令行工具

3 环境变量

====

go命令及其调用的工具用于配置参考环境变量。如果环境变量未设置,则go命令使用合理的默认设置。要查看变量的有效设计可以运行go env <NAME>; 要更改变量的默认设计,运行命令go env -w <NAME>=<VALUE>

通用环境变量

image.png

go env general-purpose

用于cgo的环境变量

image.png

go env cgo

特定于体系结构的环境变量

image.png

go env arch

特殊用途的环境变量

image.png

go env special

go env中提供但未从环境中读取的其他信息

image.png

go env additional

4 逻辑和性能诊断工具

go生态系统提供了大量的API和工具来诊断go程序中的逻辑和性能问题,这一节是对这些可用工具的总结

诊断解决方案可以分为以下几类


性能分析 这类工具用于分析go程序的复杂性和成本,例如通过它的内存使用和频繁调用的函数来标识go程序的开销部分

追踪 是一种在调用或用户请求的整个生命周期中检测代码以分析延迟的方法,它提供了每个组件对系统的总延迟概述,可以跨越多个go进程进行

调试 允许我们暂停go程序并检查其执行。程序状态和流程可以通过调试来验证

运行时统计和事件 运行时统计和事件的收集和分析为go程序的健康提供了高层次的概述。尖峰/度量的监控指标有助于识别吞吐量、利用率和性能的变化

Tips 一些诊断工具可能相互干扰。例如,精准内存剖析可能影响CPU性能分析的准确性、goroutine阻塞分析会影响调度器跟踪。因此,单独使用工具获取更精确的信息


性能分析 对于识别昂贵的或频繁调用的代码段非常有用。go运行时以pprof可视化工具提供所期望格式的性能分析数据。在测试期间,也可以通过go test或net/http/pprof包中提供的endpoints来收集性能分析数据

由runtime/pprof预定义配置文件


cpu 决定了程序在actively状态(而不是在sleeping或waiting I/O)时花费的cpu时间

heap 报告内存分配示例;用于监视当前和历史内存使用情况,并检查内存泄漏

threadcreate 报告程序中引导创建新线程的部分

goroutine 报告当前所有goroutine的堆栈跟踪

block 显示goroutine阻塞等待同步原语(包括timer channels),block profile默认为未启用状态,使用runtime.SetBlockProfileRate可以启用它

mutex 报告锁争用。当您认为由于互斥争用导致CPU未充分利用时,请使用此profile。默认情况下mutex profile处于未启用状态,通过runtime.SetMutexProfileFraction可以启用它

其他分析器 在Linux上,可以使用perf工具分析go程序,perf可以配置和解开cgo/SWIG代码和内核,因此可以深入了解native/kernel性能瓶颈; 在MacOS上,可以使用Instruments分析go程序


生产服务性能分析 分析生产中的程序是安全的,但是启用某些profile(例如CPU profile)会增加成本。您可能想要定期分析生产服务性能问题,特别是在具有单个进程的多个副本的系统中,周期性地随机挑选一个副本是安全的选择。选择一个生产进程,每隔Y秒分析并保存它的结果以进行可视化分析;然后定期重复。可以手动和/或自动检查结果以发现问题。性能收集可能相互干扰,因此建议每次只收集单个概要文件


可视化数据分析方法 go使用go tool pprof工具提供text、graph和callgrind可视化


自定义profile go用户可以通过运行时提供的pprof.Profile创建他们的自定义配置文件,并使用现有的工具来检查它们。如下示例将监听7777端口并以 /custom_debug_path/profile endpoint,为pprof.Profile提供服务

package main
import (
    "log"
    "net/http"
    "net/http/pprof"
)
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/custom_debug_path/profile", pprof.Profile)
    log.Fatal(http.ListenAndServe(":7777", mux))
}

追踪 这是一种在调用链的整个生命周期中检测代码以分析时延的方法,go提供golang.org/x/net/trace包作为每个go节点的最小跟踪后端,并用一个简单的dashboard提供一个最小的检测库,go还提供了一个可执行的Tracer来追踪间隔期间内运行时事件。追踪可以为我们提供


检测并分析go进程中的应用程序延迟

在一个很长的调用链中测量特定调用的成本

找出利用率并改进性能。没有跟踪数据,瓶颈并不总是显而易见

在单体系统中,从程序的构建块收集诊断数据相对容易,所有模块都在一个进程中,并共享公共资源来报告日志、错误和其他诊断信息。一旦系统由单体进程扩展到分布式微服务,就很难定位从前端Web服务器到所有后台的调用,以及响应返回给用户。这也是分布式追踪在测试和分析生产系统方面发挥重要作用的地方


分布式追踪是一种在用户请求的整个生命周期中检测代码以分析延迟的方法。当系统是分布式的,并且传统的分析和调试工具无法扩展时,您可能希望使用分布式跟踪工具来分析用户请求和RPC的性能。分布式追踪系统是我们能够


在大型系统中检测并分析应用程序延迟

跟踪用户请求生命周期内的所有RPC,并查看仅在生产中可见的集成问题

找出可以应用于我们系统的性能改进。在跟踪数据收集之前,许多瓶颈是不明显的

go生态系统为每个追踪系统提供了不同的分布式跟踪库和对后端透明的库

调试 调试是识别程序错误行为的过程,调试器允许我们了解程序的执行流程和当前状态。go用户主要使用以下调试器


**Delve ** 作为go编程语言的调试器,它支持go的运行时概念和内置类型。Delve正试图成为一个功能齐全的可靠的go程序调试器

GDB go通过标准go编译器和gccgo提供GDB支持。堆栈管理、线程和运行时包含不同于执行模型的方面,GDB可能混淆调试器,即使程序是用gccgo编译的。尽管GDB可以用来调试go程序,但它并不理想,可能会造成混乱

运行时统计和事件 运行时提供用户内部事件的统计和报告,以便在运行时级别诊断性能和使用问题。用户可以监视这些统计信息,以便更好地了解go程序的整体健康和性能。一些经常监视的统计数据和状态


runtime.ReadMemStats 报告与堆分配和垃圾收集相关的度量指标。内存统计对于监视进程消耗多少内存资源、进程是否可以充分利用内存以及捕获内存泄漏是有用的

debug.ReadGCStats 读取垃圾收集的统计信息。查看gc暂停上花费了多少资源是很有用的。它还报告了垃圾收集器暂停和暂停时间百分比的时间线

debug.Stack 返回当前堆栈跟踪,堆栈跟踪对于查看当前正在运行的goroutine的数量、它们正在执行的操作以及它们是否被阻止非常有用

debug.WriteHeapDump 暂停所有goroutine的执行并允许您将堆转储到文件。堆转储是在给定时间内go进程内存的快照。它包含所有分配的对象以及goroutine、finalizers等

runtime.NumGoroutine 返回当前goroutine的数目。可以监视该值以查看是否有足够的goroutine供使用,或检测goroutine泄漏

go附带运行时Execution Tracer来捕获大量运行时事件。调度、SysCall、垃圾回收、堆大小和其他事件由运行时收集,并可用于go工具跟踪可视化。Tracer可用于


了解goroutine如何执行

了解一些核心运行时事件,例如GC

识别并行性差的执行

小结

go提供了丰富的命令行和工具,在日常运维开发中熟练使用命令/工具能够大大提升效率。本文是关于命令行和常用工具的简单总结,希望能对您有所帮助


参考

https://studygolang.com/articles/23764


目录
相关文章
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1833 162
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
1127 158
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1338 0
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
651 0
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。
726 152
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
1158 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
数据采集 编解码 监控
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。

热门文章

最新文章