一般来说,当发现 CPU 的占用率和实际业务应该出现的占用率不相符,或者对 Nginx worker 的资源使用率(CPU,内存,磁盘 IO )出现怀疑的情况下,都可以使用火焰图进行抓取。另外,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下。
火焰图是定位疑难杂症的神器,比如 CPU 占用高、内存泄漏等问题。特别是 Lua 级别的火焰图,可以定位到函数和代码级别。下图来自 OpenResty 的官网,显示的是一个正常运行的 OpenResty 应用的火焰图,先不用了解细节,有一个直观的了解。里面的颜色是随机选取的,并没有特殊含义。火焰图的数据来源,是通过systemtap定期收集。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
这个是高并发服务端常见的一个问题,一般的做法是修改 sysctl 的参数来解决。但是,做为一个有追求的程序猿,你需要多问几个为什么,为什么会出现 TIME_WAIT?出现这个合理吗?我们需要先回顾下 tcp 的知识,请看下面的状态转换图(图片来自「 The TCP/IP Guide 」):因为 TCP 连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。
比较传统的服务端程序(PHP、FAST CGI 等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放。由于进程创建、销毁对资源占用比较高,所以很多语言都通过常驻进程、线程等方式降低资源开销。
作为一个专业的服务端开发工程师,我们必须要对连接池、线程池、内存池等有较深理解,并且有自己熟悉的库函数可以让我们轻松驾驭这些不同的 池子。既然他们都叫某某池,那么他们从基础概念上讲,原理和目的几乎是一样的,那就是 复用。以连接池做引子,我们说说服务端工程师基础必修课。
其实选择 OpenResty 的同学,应该都是对执行性能、开发效率比较在乎的,而对于代码风格、规范等这些 小事 不太在意。作为一个从 Linux C/C++ 转过来的研发,脚本语言的开发速度,接近 C/C++ 的执行速度,在我轻视了代码规范后,一个 BUG 的发生告诉我,没规矩不成方圆。既然我们玩的是 OpenResty,那么很自然的联想到,OpenResty 自身组件代码风格是怎样的呢?
使用度最高的通讯协议,一定是 HTTP 了。优点有多少,相信大家肯定有切身体会。我相信每家公司对 HTTP 的使用都有自己的规则,甚至偏好。这东西没有谁对谁错,符合业务需求、量体裁衣是王道。这里我们想通过亲身体会,告诉大家利用好 OpenResty 的一些特性,会给我们带来惊喜。
对用户输入的数据进行合法性检查,避免错误非法的数据进入服务,这是业务系统最常见的需求。很可惜 Lua 目前没有特别好的数据合法性检查库。坦诚我们自己做的也不够好,这里只能抛砖引玉,看看大家是否有更好办法。
OpenResty,最擅长的应用场景之一就是 API Server。如果我们只有简单的几个 API 出口、入口,那么我们可以相对随意简单一些。举例几个简单API接口输出:server { listen 80; server_name localhost; location /app/set { content_by_lua_block { ngx.
我们做的还不够好,先占个坑。欢迎贡献章节。
性能测试应该有两个方向:单接口压力测试生产环境模拟用户操作高压力测试生产环境模拟测试,目前我们都是交给公司的 QA 团队专门完成的。
API(Application Programming Interface)测试的自动化是软件测试最基本的一种类型。从本质上来说,API 测试是用来验证组成软件的那些单个方法的正确性,而不是测试整个系统本身。API 测试也称为单元测试(Unit Testing)、模块测试(Module Testing)、组件测试(Component Testing)以及元件测试(Element Testing)。
这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
代码静态分析可以在不运行代码的情况下,提前检测代码。主要可以做两点语法检测编码规范检测作为开发人员,在日常编码中,难免会范一些低级错误,比如少个括号,少个逗号,使用了未定义变量等等,我们往往会使用编辑器的 lint 插件来检测此类错误。
在上一节我们介绍了 OCSP stapling。本节我们介绍另一种 HTTPS 性能优化的技巧,TLS session resumption。一个完整的 TLS 握手需要两次:Client 发送 ClientHello;Server 回复 ServerHelloClient 回复最终确定的 Key,Finished;Server 回复 Finished握手完毕,Client 发送加密后的 HTTP 请求;
关注时代Java