创新推出 | Serverless 场景排查问题利器:函数实例命令行操作
作者 | 丛霄(阿里云函数计算研发工程师)
背景介绍
全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力,在 Serverless 落地的过程中,遇到的一个很大的挑战是 Serverless 平台如何给予开发者足够的安全感。让开发者们无负担地使用并信任 Serverless,是我们一直追求的目标。
实例 Exec 功能定位及使用方式
只能对还存活着的实例(包括预留常驻实例和按量活跃实例)执行 Exec 操作,如果按量实例空闲超时被释放,则无法再执行; InstanceExec 请求不占用实例的并发度。因此即使函数的实例并发度设置为 1,也可以同时执行 InvokeFunction
和InstanceExec
操作;InstanceExec 的一次操作被视作一次 InvokeFunction
请求调用。只要 InstanceExec 请求建立的websocket
连接没有和函数实例断开,那么函数实例将一直处于活跃状态,和InvokeFunction
采用同样的计费规则。用户可以设置 InstantceExec 的idleTimeout
参数让客户端在空闲指定时间后主动断开连接。
1、控制台登录实例


2、SDK 调用
OnStdout
、OnStderr
传入两个回调函数,回调函数定义了处理 Exec 通道返回数据的具体逻辑 ;同时可以使用返回的execConn
输入stdin
消息以传输给远端的Exec
通道。command := []string{"/bin/bash"}
execConn, err := client.InstanceExec(
fc.NewInstanceExecInput(
serviceName, functionName, instanceID, command,
).WithStdin(true)
.WithStdout(true)
.WithStderr(true)
.WithTTY(true)
.WithIdleTimeout(120)
.OnStdout(
func(data []byte) { fmt.Printf("STDOUT: %s\n", data) },
).OnStderr(
func(data []byte) { fmt.Printf("STDERR: %s\n", data) },
))
if err != nil {
fmt.Printf("%v", err)
}
if err := execConn.WriteStdin([]byte("ls\r")); err != nil {
fmt.Println("Write Stdin error", err)
}
适用场景
1. 排查线上问题
s exec {instance_id} ENV
,便能一步定位问题。登录进实例内部后,先安装 tcpdump 工具,需要执行
apt-get update
和apt-get install tcpdump
两条命令:

安装完毕后,执行 tcpdump
命令,对远端服务 IP 的请求进行抓包,并将抓包结果保存在tcpdump.cap
文件中:

抓包完毕,借助 OSS 命令行工具 ossutil64 ,将
tcpdump.cap
文件上传到自己的 OSS ,然后下载到本地借助分析工具 wireshark 可以进行分析。


2. 程序性能优化
登录进入实例后,下载 golang 安装包 :

并解压安装 go :

执行
go tool pprof
命令,并产生分析文件:/root/pprof/pprof.bootstrap.samples.cpu.001.pb.gz
,

最后借助 OSS 命令行工具 ossutil64, 运行
./ossutil64 cp
命令,将分析文件上传到自己的 OSS Bukcet 中 ,便可以下载到用户本地进行可视化分析。

总结
实例命令行功能的推出希望能消除用户使用 Serverless 的“最后一公里”,直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个“黑盒”,用户可以更加信任和依赖 Serverless 平台来扩展更多的业务场景和规模。

奖励看到最后的你
# 将本文分享至朋友圈(不设置分组)
# 然后,将截图发送至后台,试试手气?
# 本周互动奖品是“云小宝”
# 本期礼品开奖时间1月5日

一键四连精彩资讯不错过

戳原文,查看函数计算更多详情!
评论