共计 3293 个字符,预计需要花费 9 分钟才能阅读完成。
作者:丛霄(阿里云函数计算研发工程师)
背景介绍
全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力,在 Serverless 落地的过程中,遇到的一个很大的挑战是 Serverless 平台如何给予开发者足够的安全感。让开发者们无累赘地应用并信赖 Serverless,是咱们始终谋求的指标。
全托管的初衷是为了减小开发者的应用和运维复杂度,但这肯定水平上削减了用户对本身服务的管制势力。比方在很多场景中,用户会想晓得,如何可能把握本人利用的理论运行状况?利用呈现问题时如何能疾速确认是本身问题还是云平台问题?如果是云平台的问题,如何能疾速复原服务,及时止损?
这些问题的根本原因,都是用户对云平台无奈做到齐全的信赖,这也进一步妨碍了他们迁徙利用和扩大业务场景。所以咱们也在思考,如何突破这种不信赖场面,让用户领有更多资源层面上的掌控力,但又能远离资源层的简单运维。
在这样的背景和需要下,阿里云函数计算翻新推出了 Serverless 场景下的函数实例命令行操作性能,反对用户在控制台界面登录进函数实例外部,或者应用工具对实例执行指定的命令。 本文将具体介绍这个性能的应用形式和应用场景。
实现 Exec 功能定位及应用形式
实例命令行操作性能提供和 K8s Pod Exec 与 Docker Container Exec 统一的应用体验,反对在函数实例的实在运行环境中执行具体命令。
同时,因为 Serverless 极致弹性、按量免费等个性,在 Serverless 场景下的实例 Exec 性能又与 K8s 和 Docker 有着一些实质的区别:
- 只能对还 存活着的实例(包含预留常驻实例和按量沉闷实例) 执行 Exec 操作,如果按量实例闲暇超时被开释,则无奈再执行;
- InstanceExec 申请 不占用实例的并发度。因而即便函数的实例并发度设置为 1,也能够同时执行 InvokeFunction 和 InstanceExec 操作;
- InstanceExec 的一次操作被视作一次 InvokeFunction 申请调用。只有 InstanceExec 申请建设的 websocket 连贯没有和函数实例断开,那么函数实例将始终处于沉闷状态,和 InvokeFunction 采纳同样的计费规定。用户能够设置 InstantceExec 的 idleTimeout 参数让客户端在闲暇指定工夫后被动断开连接。
实例命令行操作性能反对在管制台上登录实例、应用 Serverless Devs 工具执行命令,或者 SDK 调用接口,执行命令。
控制台登录实例
在函数计算官网管制台上在函数详情 - 监控指标 - 实例指标页面,在最右侧能够对实例执行登陆操作。
点击“登录实例”,界面将会调到一个终端界面,即可马上登录进实例,执行命令进行问题排查。
在函数详情 - 监控指标 - 实例指标页面,点击实例 ID 能够进入到函数的实例详情页面,界面右上方有登录实例的按钮,点击即可进入实例。
SDK 调用
以 golang SDK 为例,其它 SDK 的调用形式大都相似。
SDK 对 InstanceExec API 进行了封装,在调用接口的时候须要应用建 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)
}
实用场景
排查线上问题
在一些日常的场景下,实例命令行操作会带来更合乎用户习惯、更高效便捷的排查问题形式。
用户小王是 Serverless 小白用户,写完一个程序部署到函数计算后,发现函数中设置的环境变量不失效,如果进一步排查,则须要批改代码,打印日志,重新部署,查看日志,应用这样繁琐的排查形式。当初借助实例命令行操作,小王能够间接命令:s exec {instance_id} ENV,便能一步定位问题。
实例命令行操作提供了便捷的登录体验,能帮忙用户解决简单场景下的利用问题。 一些状况下,用户曾经无奈通过函数日志、监控指标来具体定位问题,须要借助比方 coredump、tcpdump、jmap 等工具进行深刻排查。
比方,用户小李发现自己的线上程序最近会呈现一些函数谬误,报错内容都是连贯近程某服务超时。小李狐疑是函数实例与远端服务的网络链接不稳固,想进入实例外部,考察剖析下实例与远端服务的网络状况。他能够依照这样的步骤进行:
- 登录进实例外部后,先装置 tcpdump 工具,须要执行 apt-get update 和 apt-get install tcpdump 两条命令:
- 装置结束后,执行 tcpdump 命令,对远端服务 IP 的申请进行抓包,并将抓包后果保留在 tcpdump.cap 文件中:
- 抓包结束,借助 OSS 命令行工具 ossutil64,将 tcpdump.cap 文件上传到本人的 OSS,而后下载到本地借助剖析工具 wireshark 能够进行剖析。
程序性能优化
很多时候,开发者须要通过各种 profiling 工具来剖析性能、资源应用等问题。比方利用实例 CPU、内存等资源应用不合乎预期;利用性能低于预期,通过 profiling 工具找到瓶颈等等。通过实例命令行操作,开发者可能不便的运行语言、框架提供的各种 profiling 工具,优化程序性能和资源应用。
以运行在函数计算上的高德自主出行为例,其峰值 TPS 会达到数十万级别,作为实时在线利用,服务能承受的申请提早在几十毫秒级别。思考到老本压力,在上线前他们冀望压测出单实例最高能接受的 TPS 和对应的调用提早,以此评估须要的实例数量。
然而高德在压测中发现单实例的均匀 / 长尾延时不合乎预期,当单实例 TPS 达到 300 TPS 的时候,申请提早会直线回升。他们想确定,是否是本人的应用程序哪里存在性能瓶颈,或者是函数计算运行时的性能存在问题?借助实例命令行操作,他们能够登录进实例外部,通过 profiling 深入分析后发现了性能问题,最初优化了程序性能达到了上线规范。
上面以 custom runtime 为例:demo 示例程序应用 golang 编写并部署到函数计算上:
- 登录进入实例后,下载 golang 安装包:
- 并解压装置 go :
- 执行 go tool pprof 命令,并产生剖析文件:/root/pprof/pprof.bootstrap.samples.cpu.001.pb.gz,
- 最初借助 OSS 命令行工具 ossutil64,运行 ./ossutil64 cp 命令,将剖析文件上传到本人的 OSS Bukcet 中,便能够下载到用户本地进行可视化剖析。
总结
实例命令行性能的推出心愿能打消用户应用 Serverless 的“最初一公里”,间接将实在的函数运行环境展示给用户,尔后 Serverless 将不再是一个“黑盒”,用户能够更加信赖和依赖 Serverless 平台来扩大更多的业务场景和规模。
作者简介: 丛霄,阿里云函数计算研发工程师,专一于云原生 Serverless、分布式系统稳定性等畛域。
戳此处,查看函数计算更多详情!