自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 使用eBPF转发数据时遇到从机数据缺失的问题

摘要 本文记录了使用eBPF转发数据时遇到的从机数据缺失问题排查过程。通过分析发现:1)eBPF内核态hook函数触发次数正常,确认数据获取完整;2)用户态发送前检查数据无误;3)最终定位问题在于从机未正确处理TCP粘包,导致合并发送的多个命令被当作单个命令处理。通过增加从机粘包处理逻辑后,数据接收恢复正常。问题根源在于TCP协议栈缓冲机制导致的多条命令合并发送与从机简单接收逻辑不匹配。

2026-08-10 21:23:11 185

原创 kvstore中的AOF技术

【摘要】AOF技术通过记录Redis服务器的写命令实现数据持久化,解决宕机导致的数据丢失问题。其核心流程包括:命令写入内存缓冲区、系统调用写入内核缓冲区、由fsync函数控制磁盘写入时机。Redis提供三种写回策略(Always/No/Everysec)平衡性能与可靠性。针对AOF文件膨胀问题,采用fork子进程进行重写,通过写时复制机制保证数据一致性,同时使用缓冲区同步新命令。该机制既确保数据安全,又维持了服务可用性。

2026-05-20 22:07:47 423

原创 内存池的实现

如果下次再次分配内存时,假如大块内存分配区中的一小块内存为4096B,如果需要8KB,此时虽然总剩余内存大小大于8KB,但是实际可分配的连续内存却小于8KB,这就是内存碎片。代码的逻辑是,采用pool进行逻辑层的管理,管理两个内存链表,一个是小块内存链表,一个是大块内存链表。/*将内存池起始地址强转为node_s*/内存碎片:内存实际没有占满,但由于大量碎片化的内存导致无法分配内存,导致的内存耗尽的问题。

2026-05-18 22:58:24 321

原创 KVSTORE引入eBPF

本文介绍了在kvstore项目中引入eBPF技术实现增量同步的方案。通过eBPF探测器捕获客户端发送给服务端的命令参数(CMDKEYVALUE),采用前后端分离架构开发:.bpf.c文件使用uprobe挂载到kvs_for_eBPF函数,获取参数并存入环形队列;.c文件持续轮询队列读取数据。具体实现包括:1)定义环形缓冲区映射;2)使用uprobe捕获函数参数;3)通过bpf_probe_read_user_str读取参数;4)用户态程序通过ring_buffer__poll获取数据。该方案实现了命令参数的

2026-05-09 19:04:27 200

原创 bpftrace工具的使用

bpftrace语法结构 bpftrace的语法结构是参考的awk语言 probes /filter/ { action } probes :事件,tracepoint, kprobe, kretprobe, uprobe,这几个事件的共同点是在某一个执行点放一个监视器,不同点是使用场景不同。filter :过滤条件,事件触发时,判断条件,例如:/pid == 3245/,表示pid 为3245的进程执行。挂载点:当内核执行某个函数或者某一个功能时,使用eBPF可以当执行该功能或函数时,实现自己的功能。

2026-04-21 00:06:49 371

原创 RDMA操作类型

RDMA技术通过send-recv操作获取远程内存地址、访问密钥和长度信息后,即可实现真正的远程直接内存访问。其中WRITE和READ操作能绕过对端CPU直接读写远程内存,而send-recv虽需初始CPU参与,但实现了零拷贝的高效数据传输。二者的本质区别在于:send-recv是优化的传统收发模型,而WRITE/READ实现了完全无需CPU介入的真正远程访问。这种机制大幅降低了网络通信延迟,提升了数据传输效率。

2026-04-18 15:59:17 186

原创 RDMA基本元素

本文介绍了RDMA技术中的关键概念和流程,包括WQE(工作队列元素)、QP(队列对)、SQ/RQ(发送/接收队列)、SRQ(共享接收队列)、CQ(完成队列)等核心组件。文章阐述了RDMA数据传输的基本流程:应用层下发任务到WQ,硬件执行后生成CQE完成报告,并通过CQ通知应用层。最后总结了从应用层到硬件层的完整处理流程,为理解RDMA技术提供了清晰的框架。

2026-04-16 22:49:00 167

原创 RDMA概述

本文介绍了DMA和RDMA技术。DMA(Direct Memory Access)允许I/O设备直接访问内存,减少CPU在数据拷贝上的负担。而RDMA(Remote Direct Memory Access)进一步优化了这一过程,使网卡能直接访问用户缓冲区数据,实现零拷贝和内核旁路,彻底消除CPU参与的数据搬运。RDMA的优势包括:零拷贝(避免用户态/内核态数据迁移)、内核旁路(减少系统调用开销)和CPU卸载(由网卡完成协议处理)。这些特性显著提升了数据传输效率,解放了CPU资源。

2026-04-15 21:49:55 253

原创 UDP如何做到可靠性传输

问题:如果接收缓冲区只有10M,发送方发送超过10M的数据,那么会导致接收方为了接收数据,而不得已丢弃已经接收到的数据,这是发送和接受双方速率不匹配的问题。RTO:考虑到数据发送中难免会有延迟,一般RTO=平均RTT + 4 * RTTVAR,RTTVAR是RTT波动的绝对平均偏差。TCP相比于UDP多了两个重要的概念:1、32位序列号。RTT:即上面提到的发送过去再到接收到ack这个流程的时间。每次接收方回复ACK时都会告诉自己接收窗口的大小。问题:接收方满了之后,发送方何时再发送数据。

2026-04-14 22:50:42 435 1

原创 windows异步机制iocp

本文介绍了网络编程中的关键概念和技术,重点讨论了IOCP(完成端口)模型及其应用。文章首先阐述了网络编程需要解决的四大核心问题:连接建立/断开、数据接收/发送的时机处理。然后对比了阻塞IO、Reactor模式与IOCP模型的差异,指出IOCP通过重叠IO实现异步操作的优势,允许同时处理多个客户端连接而无需等待。特别强调了重叠IO的特性:支持IO操作堆叠和非阻塞执行,显著提升连接效率。最后说明了关联机制在处理就绪通知时的作用,并提供了相关技术实现的注意事项和参考资料。这些内容为理解高性能网络编程提供了重要指导

2026-04-10 19:59:42 192

原创 io_uring原理与简单实现

在现代高性能 Linux 系统中,传统的 I/O 模型,如阻塞 I/O、非阻塞 I/O、select/poll 和 epoll,虽然各有优势,但在处理海量并发请求时,仍面临系统调用开销大、上下文切换频繁以及 CPU 利用率不足等瓶颈。第二步:内核执行好后再将其放入完成队列,用户态从完成队列取结果,完成read操作。就是说发起读请求,内核执行请求,读成功后返回数据给用户态,再进行下一步操作。那么,异步就体现在用户提交请求后就可以执行其他操作,而不用等内核完成后再执行下一步操作。那么如何实现异步io呢?

2025-12-08 16:11:22 494

原创 DNS协议与请求

但是实际上在互联网中是没有网址这一说法的,互联网中所有的设备进行通信时,都是通过IP来进行通信。DNS的功能就是我们将我们输入的域名转化为IP地址,这样我们就可以直接输入域名就能访问对应的IP啦。DNS收到数据包后进行解析,然后查找到域名对应的ip,最后以DNS协议数据包的形式返回给Client。1、id:id是每个协议报文都有的,这是用于区别DNS应答报文是哪个的请求。4、DNS服务器返回一个具有DNS协议的数据包,其中包含查询到的IP地址。4、Answer:表示回复的数量,通常由DNS服务器设置。

2025-12-07 21:06:49 457

原创 协程设计原理与实现

协程是一种轻量级的并发编程方式,相比进程和线程具有更低的开销。它通过利用CPU空闲时间发起多个请求,在等待响应时切换任务,实现同步编程风格下的异步性能。例如刷抖音时,协程能同时处理视频播放、评论和点赞等请求。协程由程序自身调度而非操作系统,通过上下文切换(如setjmp/longjmp或ucontext)实现函数跳转。其优势在于同步的易理解性和异步的高效性,但逻辑复杂度较高。代码示例展示了使用ucontext实现协程调度的基本方法,通过swapcontext在多个任务间切换执行。

2025-12-02 20:33:27 304

原创 多线程并发锁

本文介绍了多线程编程中的并发控制机制。首先解释了多线程和并发执行的概念,指出临界资源在多线程环境下可能引发的问题。通过一个计数器的示例,展示了不加锁时由于线程切换导致的计数错误,并引入互斥锁解决方案。接着对比了互斥锁和自旋锁的实现原理及适用场景:互斥锁在长时间等待时更优,而自旋锁适合短时操作。文章还介绍了原子操作作为替代方案,通过汇编指令保证操作的不可分割性。最后讨论了线程池的必要性,它能有效管理大量线程请求,降低系统开销,实现任务与执行的分离。文中包含多个C语言代码示例,演示了不同同步机制的具体实现。

2025-12-01 20:42:01 558

原创 reactor的实现

我理解的reactor就是使用单线程或者少量线程,就能达到监听所有socket,一旦某个socket有事件发生,就分发给对应事件的处理函数。reactor的核心就是面对不同的io事件,调用不同的函数,达到根据事件分配任务的目的。这样使用少量线程或者单线程就能处理大量socket的方式,极大的节约了服务器资源。accept_cb将fd连接后,将事件设置为EPOLLIN,并把fd加入监听列表。这里先提出一个问题,什么是reactor?当受监听的fd中一旦发起请求,循环内就会根据事件调用具体的函数。

2025-11-28 17:15:45 187

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除