go语言内联汇编 go 汇编( 三 )


2.golang项目
网址为。
介绍:Go语言的早期源码使用C语言和汇编语言写成 。从Go 1.5版本自举后,完全使用Go语言自身进行编写 。Go语言的源码对了解Go语言的底层调度有极大的参考意义,建议希望对Go语言有深入了解的读者读一读 。
3.Kubernetes项目
网址为。
介绍:Google公司开发的构建于Docker之上的容器调度服务 , 用户可以通过Kubernetes集群进行云端容器集群管理 。
4.etcd项目
网址为。
介绍:一款分布式、可靠的KV存储系统,可以快速进行云配置 。
5.beego项目
网址为。
介绍:beego是一个类似Python的Tornado框架,采用了RESTFul的设计思路,使用Go语言编写的一个极轻量级、高可伸缩性和高性能的Web应用框架 。
6.martini项目
网址为。
介绍:一款快速构建模块化的Web应用的Web框架 。
7.codis项目
网址为Labs/codis 。
介绍:国产的优秀分布式Redis解决方案 。
8.delve项目
网址为。
介绍:Go语言强大的调试器,被很多集成环境和编辑器整合 。
bpftrace动态追踪golang应用-函数内联问题在上一篇文章的golang代码中 , 函数add的上一行,增加了一条注释语句://go:noinline。在bpftrace追踪时,是否可以去掉?有什么作用?
为了说明该问题,设计一个例子 。
golang代码中,有两个求和函数 。其中,add1加上//go:noinline,另一个add2不加 。代码如下:
bpftrace程序分别对函数add1和add2的输入参数、返回值进行追踪,代码如下:
执行程序后,可以看到bpftrace程序能够正常追踪到函数add1,但是无法追踪到函数add2 。
通过上文中的示例代码,可以看到,没有加//go:noinline的函数无法被bpftrace程序追踪到 。通过查阅golang相关文档 , 可以知道,//go:noinline表示该函数在编译时,不会被内联 。
使用objump -S生成golang程序的汇编代码如下:
通过汇编代码,我们可以看到,主函数中,地址0x498e52处callq 498e00调用了add1函数,地址0x498ebb处movq $0x4,(%rsp)直接计算求值 。
因此,golang编译器在编译代码时 , 会对代码进行分析,并按照内联规则 , 将某些函数生成内联代码 。一旦函数被内联,bpftrace将无法追踪到对应函数 。也就是,上文中函数add2无法被追踪到 。
针对golang程序中编译器内联的问题,可以通过禁止内联的方式来解决 。禁止内联的方式有:
在实践中,可以通过go build -gcflags="-m -m"来查看,哪些函数会在编译时执行内联,如:
从输出中,可以看到:
关于golang编译器进行内联的场景 , 可以参考golang源码: 。
由于golang编译器内联优化 , bpftrace可能无法正常追踪golang程序 。在编写bpftrace脚本时,可以先使用nm命令查看一下可执行程序 , 是否存在需要追踪的函数的符号信息 。如果没有则bpftrace将不能对其进行追踪 。
前面的示例中 , 都是对int类型的参数进行追踪,那对于string类型的参数 , 是否也可以用同样的方式进行追踪?将在下一篇中进行讨论 。
Go语言的优势有哪些1. 部署简单
Go
编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖 。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担 。
2. 并发性好
Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题 。单个Go应用也能有效的利用多个CPU核,并行执行的性能好 。

推荐阅读