zhuizhuhaomeng Blog

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

如何运行 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...

Why got the TCP reset pakcet

我们在排查网络问题的时候有时候会发现由于收到 TCP reset 报文导致连接中断或者连接不上的问题。 那么到底有哪些情况会导致收到 TCP reset 报文呢?下面列举一些常见的例子,如果有更多的情况,欢迎补充。 [TOC] 目的端口没有打开 目的端口没有打开这种情况是比较常见的。 比如: 机器重启了,但是服务没有设置开启启动。 程序重启了,端口被关闭又打开的瞬间接收到的 ...