zhuizhuhaomeng Blog

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

从一个小例子学习 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 进行回归。 其次,它使用了非常多的测试技术来保障软件质量。 下面分享其中使用到的一些测试方法和技术,方便大家使用...

Add Open Telemetry Support for OpenResty

server { server_name example.com; return 301 $scheme://www.example.com$request_uri; } server { server_name “~^(?!www.).*” ; return 301 $scheme://www.$host$request_u...

Google Baidu 哪家强

openssl s_client 可以将握手信息打印出来,因此可以得到不少的信息。 通过 wireshark 抓包虽然也可以看到类似的信息,但是显然多一道手续。 我们需要关注那些信息呢? Certificate chain:证书链信息可以看到服务端发送的证书链是否完整。 Subject: 可以确认证书是否是泛域名证书 Peer signing digest: 证书签名的摘要...

使用 ipset 打造低成本的 IP 防火墙

问题 我们的 DNS 服务器遭到攻击了,每秒高达几万 qps,这个时候怎么办呢? 如果在应用层识别攻击流量并将其丢弃,虽然可以缓解部分问题问题,但是这对于 DDOS 的大流量攻击还是力不从心。 显然拦截报文应该在越靠近网卡收包的位置越好。目前比较理想的是用 ebpf,XDP 来实现报文的过滤。 虽然 ebpf,XDP 性能很高,但是他们不是简单的命令行操作就可以搞定的事情。 简单的重现...

如何利用多块不同规格的磁盘来打造高效的缓存

问题 大型网站都需要通过 CDN 实现就近访问来提升客户的服务满意度。很多客户直接使用 Nginx/OpenResty 来打造自己的 CDN 服务器。 这个时候就会出现一个问题:磁盘 IO 成为了服务器的性能瓶颈。 不假思索的方法就是使用更高性能的磁盘,但是高性能磁盘显然不是一个好的解决方案。 我们还可以通过将多块磁盘通过 RAID0 的方式组成磁盘阵列的方式来提升性能。但是 Nginx...