zhuizhuhaomeng Blog

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

When Will Nginx Send 'Connection: close' Header

长链接对于降低请求延时,减少服务器开销是非常有好处的。然而有时候由于配置不当,导致 Nginx 服务器发送响应头包含 ‘Connection: close’。客户端在收到带有 ‘Connection: close’ 的响应后会关闭连接。 那么什么情况下会导致 Nginx 发送 ‘Connection: close’ 呢? 对于 Nginx,我们可以通过搜索 r->keepalive...

如何运行 systemtap 的测试用例

参与一个软件的开发,提交 PR 就需要能够通过相关的用例集合。因此跑用例是一个基础的步骤。 这里主要记录如何跑 systemtap 的测试用例。 安装依赖 测试的时候要用到 runtest 这个组件,需要安装 dejagnu。 编译的时候依赖 elfutils-devel, 因此需要安装改组件。 其它的 python3 的系统应该默认就存在了。 1 2 3 4 5 6 7 8 9 10...

C/C++/Rust 的堆栈回溯是怎么实现的

好文推荐 使用 -O2 编译的程序如果没有传递 -fno-omit-framepointer 这个编译参数,那么 rbp 寄存器就不会被用来作为调用栈回溯的栈帧寄存器。这个时候如果需要执行 unwind 应该如何处理呢? 这个文章通过一步步的手动解码告诉我们 C/C++ 的调用栈回溯是怎么处理的。 https://lesenechal.fr/en/linux/unwinding-the-...

Unwinding the stack the hard way

为了防止原文丢失,把该文章翻译成中文备份。原文地址:https://lesenechal.fr/en/linux/unwinding-the-stack-the-hard-way Kévin Lesénéchal 15 April 2023 假设你有一个 C 语言或 Rust 语言的程序,这个程序有一个错误。你在终端看到的只是可怕的分段错误(核心转储)。那么……假设这是一个...

Limit the Resource with ulimit


Get Memory from OS and Put Memory back to OS

概述 一般情况下,C 语言申请和释放内存是使用 malloc, calloc, free 这些接口。 而这些接口是 libc/tcmalloc/jemalloc 等内存分配器提供的接口,而不是操作系统提供的接口。 那么像 libc/tcmalloc/jemalloc 等这些内存分配器的实现是如何向操作系统申请内存的呢? libc 主要使用的是 brk/sbrk 这个接口,而对于 tcam...

curl send client hello after 200ms

反馈问题 同事发现业务的请求有点慢,使用 curl 测试一下指定的网站看看响应时间。结果发现需要 229 ms 才响应。 1 2 3 4 5 6 7 8 9 10 time curl -k https://a.b.c.d:443 <!doctype html> <html lang=en> <title>404 Not Found</title&...

使用 jq 分析 json 文件

经常要分析 json 文件,如果用肉眼查看,实在是太累了。 使用 jq 来过滤需要的值将大大增加工作效率。 安装 jq 1 yum install -y jq 1 apt-get install -y jq jq 的命令介绍 基本概念 jq 的语法是清晰的: 语法 描述 , 由...

Makefile 问题记录

设置并发上限 make 一般加上 -j 参数可以并发编译,提升编译的速度。但是我遇到一个并发数量太大导致 内存不足,最终进程别 OOM Killer 杀死的情况。因此就想现在并发数量。 下面是设置并发上限的示例 job=$(shell n=$$(nproc) && [ $$n -lt 16 ] && echo $$n || echo 16) all: ...

使用 Jemalloc 作为 nginx 的默认内存分配器

我们希望能够使用 Jemalloc 作为 nginx 默认的内存分配器, 但是我我们不想要重新编译 Nginx。这个时候可以在启动 Nginx 的时候加上 LD_PRELOAD 来实现目标。 我们先通过如下命令查找开启启动的配置文件。 1 2 $ rpm -ql openresty | grep system /usr/lib/systemd/system/o...