zhuizhuhaomeng Blog

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

Lua 协程缓存池的实现

性能优化的一个关键就是使用缓存。从硬件层面的 CPU 的一级缓存,二级缓存,三级缓存 到操作系统内核的各种文件缓存,目录缓存,文件元数据信息缓存以及应用软件各种缓存都是为了 加速访问。 而我今天遇到了一个没有使用缓存会导致内存膨胀的问题。之所以会导致内存膨胀是因为每创建一个协程, 会创建一个对应的 C 的内存结构,而这个 C 结构体的内存的生命周期和协程的生命周期是不一致的。 因此即使协程...

cosocket 的上游元表是如何生效的

回收资源是一个很重要的问题。函数之间的调用非常复杂,所以一个资源的生命周期可能很难确定。 如果有一个统一的入口和统一的出口实现资源的分配和回收那么就可以极大的简化问题。 Lua 个 gc 回调就是一个很好的时机,可以作为一种最终的兜底方案。 下面看看 ngx_http_lua_socket_tcp_upstream_t 这个 GC 对象是如何设置 gc 函数回收资源的。 元表的创建 在...

为什么同一个上游的响应时间差别很大

最近遇到一个奇怪的问题,用户通过代理后响应时间和不通过代理的响应时间差别很大。 不通过代理只有几毫秒,而通过代理需要 100 毫秒以上。 直接访问 通过代理 用户提出问题的时候,用户给的信息是很简单的。而这个时候我们需要像医生给病人看病一样, 需要深入的询问病史而不是简单的接受病人提供的信息就一头栽进去。 我想应该是安装这样的步骤分析问题: 首先,我们需要仔细验证用户...

Heap Algorithm and C implememtation

这里并没有啥新意,只是为了方便我自己拷贝算法。 虽然号称 AI 能给很好的代码,但是我搜索的时候经常找不到满意的代码。 堆的介绍 我们经常会听说堆排序,最大堆,最小堆。这里的堆跟内存分配中的堆栈的堆是没有关系的。内存分配中的堆是有别于栈的另一个内存空间,堆是不会自动回收的, 而栈在函数调用返回后就自动收缩了。 我们这里要讨论的是一种排序算法。以最大堆为例,最大堆的根节点的值整个堆里面...

How to dump a process memory

By the time we realize the problem, it is already happening. If we want to know what caused the problem, we usually need to understand how it happened. It’s kind of like the chicken or the egg ca...

Lua GC 接口探讨

垃圾回收 LuaJIT 是使用 Lua 5.1 的标准。 跟 Lua 5.1 一样, LuaJIT 也是使用增量标记和扫描回收的算法。Lua 5.2 ~ 5.4 的垃圾回收算法已经更新成分代垃圾回收算法,可以参考 云风的博客。 LuaJIT 的垃圾回收是在主线程中执行的,而不是像 JAVA/GO 在一个独立的线程中执行,如果主线程不执行,那么垃圾回收肯定也不会执行。 因此 LuaJIT ...

How to debug web problem using curl

All you need to know about curl https://everything.curl.dev/http/redirects.html Connect to the specific host You should always use the –resolve to connecto the the specific host. For example 1...

How to write error log when checking the arguments?

A good error log should help you to resolve the problem. Or give you enough information to find the cause of the problem. For the error log of the Lua code, I think it should at least include the ...

How to do request ratelimt on OpenResty?

#

使用 OpenResty 共享字典的注意事项

OpenResty 共享内存的字典如果设置得太大,那么就会进程占用太多的宝贵内存; 如果内存设置得过小,那么内存不足会导致申请失败或者提前淘汰未过期的表项。 如何用好共享字典其实是很有讲究的。我们来看看共享字典的一些问题。 OpenResty 共享内存字典如何淘汰表项 OpenResty 共享字典淘汰表项主要可以分为淘汰过期表项和淘汰未过期表项。 淘汰过期表项是每次操作都会进行的,而淘...