zhuizhuhaomeng Blog

「记录下来,一切都会更容易理解」

给 TLS 添加扩展头部

TLS 协议本身已经定义了很多标准的扩展头字段,同事它允许用户添加自定义的扩展头字段, 这就给我们增加新的功能添加了无限的想象空间。 比如我们需要在 SSL 握手完成之前做一些动作,那么我们可以给 Client Hello 这个扩展头添加 一个扩展字段来实现我们的目的。因为这个字段是明文,因此我们不能在这里传输明文的敏感信息。 比如下图中的红框部分就是一些扩展头 那么我们如何添加扩...

astyle 格式化 C 代码

为什么使用 astyle 我们公司对代码风格要求非常的严格,要求严格准寻 nginx style,以至于在这里浪费了非常多的时间。 到现在,即使是 GPTCHAT,也没有办法重构代码,给函数取一个合适的名称。 但是代码的缩进和换行能够让工具来做已经是非常现实和常规的操作。 这里给出 astyle 的配置,让代码基本遵循 nginx style 的风格,但是结果仍然需要手工调整。 比如,函...

使用 jemalloc 的 prof_leak 功能分析内存泄漏

内存泄漏的问题 一般情况下,我们提到内存泄漏就是指忘记调用内存释放函数释放内存了的情况。 我们可以使用 valgrind 来检测内存泄漏,但是 valgrind 运行速度很慢,会让程序运行速度下降 成百上千倍,因此在一些场景下我们无法接受。比如,运行大量的测试的时候, 我们不希望等待太久才知道最终结果;线上环境使用 valgrind 则完全无法提供正常服务。 对于线上环境使用 Jemal...

使用 jemalloc 的 prof.dump 功能分析内存泄漏

内存泄漏的问题 内存泄漏的表项形式多种多样,不同的泄漏形式需要使用不同的工具来分析。 如果内存的使用随着程序运行而不断的增长,但是在进程退出的时候又完全释放干净, 那么这种内存泄漏就是假泄漏。这些泄漏形式如果要 valgrind 来检查,那么 valgrind 会 报告没有内存泄漏。因此 Valgrind 不适合用来分析这种形式的问题。 Jemalloc 也提供了内存泄漏的检测功能,一样...

从一个小例子学习 Lua GC 回收是怎么回事

Lua GC 的回顾 Lua 是一门带 GC 回收的语言,因此程序员很幸福,不需要自己处理内存的分配和回收。 但是为了复用现有的生态或者利用 C 来实现高效的算法,就需要跟 C 语言进行交互。 跟 C 语言交互免不了需要使用 C 的数据结果,比如一个数组等等。 LuaJIT 的 FFI 接口让 Lua 和 C 的交互变得非常的简单。调用 C 函数不再需要通过传统的通过 Lua 栈的方式 ...

如何阅读代码 -- LuaJIT GC 对象代码分析

应该配置哪些参数 在使用 GDB 手动分析问题的时候,我不希望 GDB 的主动分页功能干扰, 也不希望密密麻麻的信息揉在一起影响分析过程。因此,我一般会执行下面的命令来禁用分页并开启 格式化打印的功能。 set pagination off set print pretty on LuaJIT GC 对象 LuaJIT 的 GC 对象的定义如下所示。我们可以看到,Lua 中包含了 ...

如何阅读代码 -- 巧借 GCC 选项分析真正使用的宏

阅读代码的难题 开源软件一般都会为了兼容各种不同的操作系统、不同的依赖软件版本、调试等目的而定义很多的宏。 这些宏给代码阅读带来了很多的障碍,分不清楚到底周到哪个代码路径。 特别是分析 Bug 的时候,更希望确认具体走的是哪个具体的代码路径。 我们怎么才能够确认这些宏是否定义呢?宏定义的值是多少呢? 如果你想通过查看源码的方式来确认这些宏的定义,那么就形成了先有鸡还是先有蛋的问题。 ...

OpenResty Lua GC 优化

OpenResty 是一个非常优秀的网关,很多企业采用 OpenResty 网关作来管理所有的入口流量。 在不优化的情况下,OpenResty 性能也十分优异,但是每一个企业都有自己特定的定制,难免 在一些地方引入性能瓶颈。因此需要对网关进行优化,避免在一些情况下网关出现性能故障。 比如各种活动引起的大流量问题,被攻击情况下异常流量引发的问题等等。 这里从 GC 的角度探讨一下 Lua 的...

SSL/TLS 握手开销测试

TLS 握手的性能问题 TLS 握手开销是很高的,因此就有了会话恢复这样的技术来缓解由于握手带来的额外性能开销。 我们这里搭建了一个 OpenResty 的服务器来测试一下各种场景下的请求速率。 证书生成脚本 搭建的服务器是 2048 bits RSA 签名的证书,使用如下的脚本生成。 1 2 3 4 5 6 7 8 9 10 11 #! /usr/bin/env bash ope...

OpenResty 是怎么保证软件质量的

OpenResty 的软件质量是非常高的,这个得益于 OpenResty 创始人 章亦春 对代码要求非常高有直接关系。 除了个人特质只要,OpenResty 使用了哪些技术来提高软件质量呢? 首先,OpenResty 的每一个仓库都有非常详尽的用例覆盖,修改都会自动跑 CI 进行回归。 其次,它使用了非常多的测试技术来保障软件质量。 下面分享其中使用到的一些测试方法和技术,方便大家使用...