- 博客(27)
- 收藏
- 关注
原创 使用内存探测bpf
次数均衡、差值稳定:内存正常,无泄漏malloc持续涨、free停滞:存在业务内存泄漏,结合堆栈日志修代码单次大内存分配:批量数据加载逻辑,可优化内存复用、分批释放大量小内存频繁分配:可优化内存池,减少频繁alloc/free开销。
2026-09-05 21:03:49
287
原创 对io_uring的理解
普通模式每次提交SQE要传入用户缓冲区地址。内核执行IO时需要做页表映射校验。固定缓冲区:提前注册一批内存缓冲区给io_uring,内核预先完成映射。接收数据时内核直接从注册好的缓冲池里挑选一块存放数据。好处:减少IO过程中地址校验开销,提升接收性能,适合大量网络接收场景。
2026-09-05 20:51:35
331
原创 对rdma的理解(3)
RoCE跑在以太网,以太网本身是有损网络,交换机队列满直接丢包。RDMA RC虽然有重传,但硬件重传代价很高,频繁丢包延迟暴涨。PFC(Priority‑based Flow Control) 基于优先级流控: 交换机端口队列快要满的时候,发送暂停帧告诉上游“不要再发数据”,上游网卡暂停发送,避免数据包丢弃,实现无损网络。工程痛点:PFC死头(Head‑of‑Line HOL阻塞)一条流拥塞触发暂停,同一优先级所有流量全部停住,引发大面积性能抖动。这是RoCE线上最常见故障点。
2026-09-05 20:50:53
331
原创 对ebpf的理解(3)
Map 是 eBPF 提供的数据存储,是用户态 ↔ eBPF内核程序交换数据的唯一媒介。内核eBPF程序不能直接操作用户态内存,全部通过Map读写。hash哈希表:key‑value统计,统计PID、系统调用次数,最常用;array数组:固定大小数组;:事件推送,把事件实时发给用户态(比如捕获每次系统调用事件);lpm_trie:最长前缀匹配,多用于网络;stack_trace:栈回溯,采集调用栈,做性能分析。注意:Map有最大大小限制,内核态不能随便无限分配内存。
2026-09-05 20:49:54
409
原创 对jemalloc的理解
jemalloc是高性能内存分配器。靠线程本地缓存tcache + 多独立arena,大幅降低多线程malloc的锁竞争,同时更好控制内存碎片;很多存储、网络服务通过LD_PRELOAD直接替换系统malloc,业务代码一行不改就能提升性能。
2026-09-04 17:16:42
334
原创 对fork的理解
👉子进程变成僵尸进程(zombie):代码已经跑完,但进程残留条目还留在系统表里,占PID资源。fork() 是 Linux/Unix 的系统调用,复制一份当前程序,变出一个一模一样的新进程。fork → 创建新进程 进程之间内存默认隔离(COW),互相看不见对方变量,进程之间通信要管道、socket、共享内存。操作系统调度说了算 有可能父进程先执行,也有可能子进程先执行,顺序不确定,不要写依赖执行顺序的代码。父返回子PID,子返回0。fork创建进程,和线程完全不一样,进程内存隔离,线程共享内存。
2026-09-04 17:11:09
356
原创 对io_uring的理解
先建共享环形队列,批量写一堆IO任务,一次交给内核后台并发执行,执行完一次性取回所有读写结果,全程极少系统调用,实现高性能异步IO。
2026-07-12 13:10:16
355
原创 对mmap和 munmap的理解
mmap:分配一段虚拟内存,绑定文件/共享内存,拿到可读写指针;业务逻辑:通过指针读写数据;munmap:归还虚拟内存,解除映射,是 mmap 必不可少的收尾操作。
2026-07-12 13:08:47
374
原创 对io_uring的理解(1)
io_uring = Linux 官方新一代、全能、高性能异步IO接口,通过共享环形队列大幅减少内核切换开销,解决了老式同步IO慢、旧异步aio功能残缺的问题,是现在高并发IO程序的底层标配。
2026-07-10 20:22:02
353
原创 对unlink函数的理解
/ 要删除的文件 const char *file_name = "test.txt";if (ret == 0) { printf("文件 %s 删除成功!// 等价 unlink("test.txt") remove("empty_dir");举例子: 你 vim test.txt 打开文件,另一个程序调用 unlink("test.txt")如果 path 是普通文件:remove 内部调用 unlink()// 返回值:成功返回 0;// path:要删除的文件路径(相对/绝对路径都行)
2026-07-10 18:30:16
190
原创 对ebpf的理解(2)
printf("【出站连接】程序:%s 目标IP:%d.%d.%d.%d 端口:%d\n", comm, args- >daddr[0], args->daddr[1], args->daddr[2], args->daddr[3], args->dport);printf("【告警】进程 %d (%s) 读取敏感文件 /etc/passwd\n", pid, comm);print("\n===== 进程read调用统计 =====")# 内核运行的eBPF C代码。
2026-07-09 19:10:40
223
原创 对ebpf的理解
eBPF 是 Linux 内置安全虚拟机,允许我们编写轻量小程序挂载在内核各类事件上,零修改内核、零宕机风险、高性能地实现网络管控、系统监控、安全防护,现在是云服务器、K8s、运维排查的核心底层技术。
2026-07-09 17:56:24
356
原创 Linux 下 C 语言 sendfile 实现文件传输
/ 1. 创建socket int sockfd = socket(AF_INET, SOCK_STREAM, 0);零拷贝原理 传统 read + write:磁盘 → 内核缓冲区 → 用户缓冲区 → 内核socket缓冲区 → 网卡 sendfile:磁盘 → 内核缓冲区 → 内核socket缓冲区 → 网卡,跳过用户态拷贝,性能更高。// 1. 创建监听socket lfd = socket(AF_INET, SOCK_STREAM, 0);// 3. 打开待发送文件。
2026-06-13 12:14:41
216
原创 安装RDMA
正常输出:state ACTIVE, physical_state LINK_UP。verbs rdma_ucm # 用户态 connection management。RoCE 丢包/性能差:交换机未开 PFC/ECN、MTU 不一致、流控未配置。ibv_devinfo 无设备:驱动未加载、固件不兼容、网卡不支持 RDMA。rxe0 无法 UP:内核未加载 rdma_rxe、物理网卡未启用。Intel:E810、X722 等(iWARP/RoCE)# 查看端口状态(应显示 PORT_ACTIVE)
2026-06-13 11:59:28
205
原创 对sendfile的理解
sendfile = 内核态零拷贝 + 文件直接发socket + 不经过用户态 + 高性能 + 只能转发磁盘文件总结原理:内核直接转发文件到 socket,零拷贝、无用户态切换函数:sendfile(out_socket, in_file, offset, size)限制:输出必须是 socket,输入必须是普通文件用途:Web服务器、文件下载、高性能网络转发优势:比 read/write 快得多,CPU 占用低。
2026-06-09 20:49:34
356
原创 对RDMA理解(2)
struct ibv_qp_init_attr → 创建 QP 通道时用的“配置单” 告诉网卡:我要建一个什么样的收发通道。struct ibv_recv_wr → 接收数据的“任务单” 告诉网卡:我准备好一块内存,你来把数据放进来。struct ibv_send_wr → 发送数据的“任务单” 告诉网卡:我要发什么数据、发到哪里、怎么发。// 5. QP 类型(99% 用 IBV_QPT_RC 可靠连接)// 3. 发送方式(最常用:IBV_WR_SEND 普通发送)// 内存 MR 的钥匙(必须!
2026-06-09 18:58:14
212
原创 对RDMA 理解
直接内存访问,不经过 CPU、不经过内核协议栈,两台机器内存直接互传。就像 TCP 的 send/recv,但零拷贝、极快。RDMA 通信的“端点”,相当于 TCP 的 socket。你传 1GB 文件,必须先把文件所在内存注册成 MR。要做的事 = 用 RDMA 原生接口(Verbs)写 C 代码。注册 = 告诉网卡:这段内存我要用来收发数据。两台带 RDMA 网卡的服务器(ConnectX-4/5/6)Send/Recv:简单、稳定、适合传文件。内存权限钥匙,网卡收发数据需要这个钥匙。
2026-06-05 20:38:14
357
原创 理解 setsockopt 函数
/ 固定格式 int 开关 = 1;setsockopt(套接字, 级别, 选项名, &开关, sizeof(开关));想开启某个功能 → 传 1想关闭 → 传 0setsockopt = 设置 socket 行为最常用级别:SOL_SOCKET最常用选项:SO_REUSEADDR(端口复用)格式固定,只需要改选项名和值如果你需要,我还可以给你:Python / Java 版本的 setsockopt 例子所有常用选项清单(带中文解释)
2026-06-05 17:53:44
233
原创 Ubuntu安装ebpf
1. 生成头文件 bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h# 2. 编译 eBPF clang -g -O2 -target bpf -D__TARGET_ARCH_x86_64 -I. -c forward.bpf.c -o forward.bpf.o# 3. 生成 skeleton bpftool gen skeleton forward.bpf.o > forward.skel.h。
2026-05-27 10:56:10
308
原创 用iperf3测试两台机器tcp网络吞吐量
防火墙放行 5201 端口: sudo ufw allow 5201/tcp。799 Mbits/sec:TCP 吞吐量(约 1G 网卡跑满)A 机器:192.168.1.100(做 server)B 机器:192.168.1.101(做 client)⑤ 加大 TCP 窗口(长链路/高延迟场景)Retr:重传次数(接近 0 说明网络稳定)③ 反向测试(服务器发、客户端收,测下载。② 4 条并行流(跑满千兆/万兆)Bitrate:实际吞吐量(重点)(默认端口 5201,TCP)④ 指定端口(如 5202)
2026-05-21 16:13:35
273
原创 IO多路复用-select/poll/epoll
IO多路复用I/O 多路复用就是一种让单个线程能够同时监视多个网络连接(如 Socket)读写状态的机制。
2026-01-11 21:54:32
730
原创 自旋锁、互斥锁、原子操作
CAS 是一种**硬件级别的原子操作**,其逻辑可以概括为: 「我认为内存地址 `ptr` 现在的值是 `old_val`,如果是,就把它改成 `new_val`;如果不是(说明被其他线程/CPU核修改过),就什么都不做」。整个“比较 + 交换”的过程**不可被中断**,硬件(CPU)会保证操作的原子性,不会出现“比较成功但交换前被打断”的情况。CAS 是 “无锁同步” 的基石,核心是硬件保证的原子比较 - 交换,通过 “重试机制” 解决竞争问题;其最大坑点是 ABA 问题,需通过版本号规避;
2025-12-16 20:53:17
543
原创 pthread_mutex_init、pthread_mutex_lock、pthread_mutex_unlock函数理解
释放当前线程持有的互斥锁,将锁状态从 “锁定” 改为 “未锁定”。此时,所有等待该锁的线程中会有一个被唤醒并获取锁(具体哪个线程由系统调度决定)。如果锁当前是 “未锁定” 状态,当前线程会立即获得锁(锁变为 “锁定” 状态);如果锁已被其他线程锁定,当前线程会。// 定义一个互斥锁变量 // 初始化互斥锁(默认属性)创建并初始化一个互斥锁(mutex),为后续的加锁 / 解锁操作做准备。这样就能保证同一时间只有一个人(线程)能使用隔间(共享资源)。// 临界区:操作共享资源(如全局变量、链表等)
2025-10-17 21:06:18
1502
原创 对 select/poll/epll和io_uring的理解
1你没法一直站在楼下等,于是你每隔5分钟就跑到门卫室,问大爷:“大爷,有我的快递吗?:助理(内核)可以直接把数据放到你指定的最终位置,省去了中间倒手的步骤,效率更高。:这个“搬快递”的过程(系统调用)本身是有开销的。:从“下指令”到“拿到结果”,你完全不需要插手中间过程。你只关心开始和结束。:当大爷告诉你“快递到了”(一个socket可读了),你。这个系统调用,把数据从内核缓冲区读到你的程序内存)。了,让应用程序和内核的协作达到了前所未有的高效程度。:你是一个住户,在等一个重要的快递。:你是一个公司老板。
2025-10-02 11:58:56
683
原创 ucontext的理解
ucontext是Unix/Linux提供的用户级上下文切换机制,允许在进程内保存和恢复执行现场(寄存器、栈指针等)。核心结构体ucontext_t包含上下文链接、信号屏蔽、栈信息和寄存器状态。主要函数包括:getcontext保存当前状态,setcontext恢复状态,makecontext修改上下文执行新函数,swapcontext保存当前并切换到另一上下文。通过分配栈空间和设置返回链接,可实现轻量级协程切换。示例展示了如何通过swapcontext在main和func之间跳转执行。ucontext适合
2025-09-28 15:31:04
1464
原创 为什么出现大量的time_wait、close_wait,什么原因
状态是 TCP 连接关闭过程中的一个正常状态,表示被动关闭连接的一方已经收到对方的关闭请求,但本端尚未关闭连接。例如,HTTP 服务器在处理完请求后关闭连接,或者客户端频繁地发起和关闭连接。:如果服务器或客户端频繁地主动关闭 TCP 连接,就会产生大量的。状态的连接,通常是因为应用程序未正确关闭连接或存在逻辑问题。
2025-09-13 17:53:53
235
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅