一个正常的火焰图,应该呈现出如官网给出的样例(官网的火焰图是抓 C 级别函数):从上图可以看出,正常业务下的火焰图形状类似的“山脉”,“山脉”的“海拔”表示 worker 中业务函数的调用深度,“山脉”的“长度”表示 worker 中业务函数占用 CPU 的比例。下面将用一个实际应用中遇到问题抽象出来的示例( CPU 占用过高)来说明如何通过火焰图定位问题。
一般来说,当发现 CPU 的占用率和实际业务应该出现的占用率不相符,或者对 nginx worker 的资源使用率( CPU ,内存,磁盘 IO )出现怀疑的情况下,都可以使用火焰图进行抓取。另外,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下。
API ( Application Programming Interface )测试的自动化是软件测试最基本的一种类型。从本质上来说, API 测试是用来验证组成软件的那些单个方法的正确性,而不是测试整个系统本身。 API 测试也称为单元测试( Unit Testing )、模块测试( Module Testing )、组件测试( Component Testing )以及元件测试( Element Testing )。
单元测试( unit testing ),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数, Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
Lua 里面的函数必须放在调用的代码之前,下面的代码是一个常见的错误:local i = 100i = add_one(i)local function add_one(i) return i + 1end你会得到一个错误提示:[error] 10514#0: *5 lua entry thread aborted: runtime error: attempt to call global 'add_one' (a nil value)为什么放在调用后面就找不到呢?
大家在使用 Lua 的时候,一定会遇到不少和 nil 有关的坑吧。有时候不小心引用了一个没有赋值的变量,这时它的值默认为 nil 。如果对一个 nil 进行索引的话,会导致异常。 如下: local person = {name = "Bob", sex = "M"}-- do somethingperson = nil-- do somethingprint(person.