zhuizhuhaomeng Blog

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

LuaJIT 的参数传递

FFI 的方式调用 C 函数可以说是很简单,但是有时候缺个例子也是非常的难。 本文通过几个例子来展示 FFI 调用 C 函数。相信对于需要用到可变参数函数 以及需要传递数组参数的会有帮助。 传递数值类型参数 传递数值类型的参数可以说是最简单的了。FFI 会自动将数值转换为需要的类型。 比如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1...

使用 GDB 验证动态链接的过程

背景 对于动态链接的详细工作过程一直很好奇,终于搞明白了其中的缘由,记录一下。 以前一直以为自己明白了,其实不明白。动手验证,细节就是魔鬼。 本次验证使用了 gdb,过程非常有趣,你也可以自己动手试试看。 测试代码 这是一个最小化的代码,调用的 printf 函数是 libc 提供的,因此就涉及到动态链接的过程了。 #include<stdio.h> int mai...

通过 LuaJIT FFI 接口集成原有的 C 模块

LuaJIt FFI 接口和 Lua API 有什么差别 Lua 提供了一些接口用来实现和 C 代码的交互。比如 void lua_pushnumber(lua_State *L, lua_Number n) 这样的函数。更多的函数可以参考 Luajit 的 头文件。 传统上通过 Lua 的调用栈来传递参数的方法来跟 C 交互是非常麻烦的,而且有一些 Lua 的代码是晦涩难懂。 比如 m...

查看添加到 epoll 的文件描述符对应的事件

找到要分析的进程 比如我们要分析 nginx worker 进程的 epoll 都添加了哪些句柄,他们的 events 是如何。 我们用下列命令找到要分析的 nginx 进程。 1 2 $ ps aux | grep "nginx: worker" nobody 606535 0.0 0.0 78076 8488 ? S 17:22 0:11 ngi...

排查 PostgreSQL 慢查询发现 mlocate-updatedb 导致的 IO 瓶颈

背景 客户其中一套系统的 PostgreSQL 出现很多的慢查询,发现 PostgreSQL 所在机器的 IO 利用率很高。 因为该机器有好多块硬盘,而且硬盘的型号以及相应的服务都不一样,因此我们只能一块块硬盘来分析。 分析过程 我们使用 iotop 工具来分析磁盘 IO 的占用问题。比如 1 2 3 4 5 6 Total DISK READ : 66.61 K/s | ...

谁占用了我的磁盘空间

背景 有一台线上机器报警说磁盘空间不足,磁盘利用率接近 95%。 同事上登陆机器查看并清理了数据库的日志文件,但是磁盘空间利用率并没有明显变化。 我接手分析该问题,刚开始也是按照常规的思路分析,发现有一些备份文件占用了绝大多数的磁盘空间, 因此给出了将备份数据转移到其它机器的建议。但是同时我还发现 du -hs 统计的磁盘空间和实际的 磁盘空间利用率差别比较大,因此就不得不深入分析到底谁还...

nginx worker_shutdown_timeout 是怎么工作的

背景 我们修改 nginx 的配置之后,为了让新的配置生效,我们需要重新载在 nginx 的配置文件。 为了让配置生效,我们需要执行 nginx -s reload 这样的命令。根据实际情况可能会有所不同, 比如有的系统上是 systemctl reload nginx, 如果是 OpenResty,那么是 systemctl reload openresty。 这些命令最后都是向 ngi...

SSH 打造开发环境

使用 SSH 访问国际网络 1 2 3 # 如果防火墙打开的话 sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp ssh -qTfnN -D 0.0.0.0:8080 user@remote-host 使用 SSH 构建一个 SOCK5 代理,我们使用到如下的 SSH 选项: 1 2 3 4 5 -q ...

怎么选择内存分配器

很多软件,我们没有必要对其内存使用进行优化。这是因为有些软件的内存消耗非常的小,不值得再继续优化; 有些软件虽然开销很大,但是对于业务运行没有影响,因此也就没有必要 (动力) 优化。 我们需要执行优化,很多时候是使用(测试/压测)过程发现了问题。软件还是那个软件,但是因为使用的场景变化了, 新的问题就出现了。比如个人使用 OpenResty 做反向代理来管理自己的几个小站点,这个时候就不容...

Glibc Memory Allocation Tune

<2.26 export MALLOC_ARENA_MAX=1 =2.26 GLIBC_TUNABLES=glibc.malloc.mmap_max=1:glibc.malloc.top_pad=1 参考资料 https://sourceware.org/glibc/wiki/MallocInternals https://www.gnu.org/software/lib...