-
Go 性能调优
https://www.liwenzhou.com/posts/Go/pprof/ 四个方面 CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory profile(Heap Profile:内存使用情况 Block profiling:goroutine 不在运行的状态,可以用来分析和查找死锁等性能瓶颈 Goroutine profiling:goroutines的使用情况,以及调用关系 Go语言内置了获取程序的运行数据的工具,包括以下两个标准库: runtime/pprof:采集工具型应用运行数据进行分析 net/http/pprof:采集服务型应用运行时数据进行分析 CPU的采集 pprof.StartCPUProfile(w io.Writer) pprof.StopCPUProfile() 得到采样数据之后,使用go tool pprof工具进行内存性能分析。 内存 pprof.WriteHeapProfile(w io.Writer) go tool pprof默认是使用-inuse_space进行统计,还可以使用-inuse-objects查看分配对象的数量。 import _ “net/http/pprof” 你的 HTTP 服务都会多出/debug/pprof endpoint ![[Pasted image 20250802111822.png]] (pprof) top3 Showing nodes accounting for 100.37s, 87.68% of...
-
Go 1.23 iter 学习
(https://mp.weixin.qq.com/s?biz=MzA4ODg0NDkzOA==&mid=2247510020&idx=1&sn=c4daaaf3e895bf17a76e2481a74bf243&chksm=91a791e540e5ee433099f24654eaf06126750dd2392d660bf9144cbf33582e4e0022a6f060f9#rd) 也就是说只有符合上述函数签名的函数类型才是可以被for range支持的iterator。即所谓自定义iterator,本质上就是一个接受一个函数类型参数的函数(如上图中红框①),按惯例,这个函数类型的参数被命名为yield(见红框②)。从Backward函数的返回值(一个iterator)的实现来看,当yield函数返回false时,迭代结束;否则迭代继续进行,直到集合类型(如slice)中所有元素都被遍历完。 其实,for range+自定义iterator可以看成是Go提供的又一个“语法糖”,它是通过Go编译器在编译阶段的代码转换来实现的。下面我们还基于Backward那个例子来看看这个转换过程:
-
tRPC-GO
tRPC-go https://trpc.group 先说一说RPC remote procedure call protocol 远程调用协议 客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 C/S 架构 当客户端发送的请求消息到达服务器时,服务器上的操作系统就将他传递给服务器存根(server stub), 服务器存根是客户存根在服务器端的对应程序和真正实现,用来将通过网络输入的请求转化为本地过程调用 服务器存根一直在等待客户端的调用,处于阻塞状态,等待消息输入。 RPC流程 客户端进程以正常方式调用客户存根 客户存根生成一个消息。然后调用本地操作系统的网络通信模块,存根进入阻塞状态。 客户端操作系统将网络消息发送给远程操作系统。 远程操作系统将网络消息交给服务器存根。 服务器存根从网络消息将参数提取出来,而后调用服务器存根。 服务器执行相应的程序,操作完成后将结果返回给服务器存根。 服务器存根打包消息,调用本地操作系统。 发送给客户端操作系统。 客户端操作系统将消息交给客户端存根,存根从阻塞状态回复,进入运行状态。 客户端存根从消息中提取结果,返回调用的客户端。 过程中需要考虑的问题: 参数传递 通信协议 出错 超时处理 一些说明 既然是协议就只是一套规范。那么就需要有人遵循这套规范来进行实现 典型的RPC协议 Dubbo Thrift gRPC Hetty 网络协议和网络io模型 对其透明 既然RPC的客户端认为自己是在调用本地对象。那么传输层使用的是TCP/UDP还是HTTP协议,又或者是一些其他的网络协议它就不需要关心了。 信息格式对其透明. 应该有跨语言能力, 调用方也不清楚远程服务器的应用程序是使用的什么语言与你性的,对于调用方来说,无论服务器方使用的什么语言,本次调用都应该成功。并且放回置应该按照调用方程序语言所能理解的形式表达。 IDL interface definition language protocol buffer language .proto version...