- 博客(144)
- 收藏
- 关注
原创 在 Linux 系统中通过软链接管理存储空间
通过将文件或目录移动到其他存储设备并创建软链接,你可以有效管理存储空间,避免因为空间不足导致系统问题。这种方法简单易行,是处理大文件或日志管理的一种常用技巧。
2024-08-20 16:25:23
570
原创 与epoll媲美的io_uring
io_uring 是 Linux 内核提供的一种高性能的异步 I/O 框架。它旨在提供一种效率更高、更灵活的 I/O 模型,以满足现代应用程序对高吞吐量和低延迟 I/O 操作的需求。传统的 I/O 模型(如阻塞 I/O 和非阻塞 I/O)在处理大量并发 I/O 操作时可能存在性能瓶颈。io_uring 通过提供一个高效的 I/O 操作队列和事件通知机制,允许应用程序以异步的方式提交 I/O 操作,同时避免了传统 I/O 模型中的一些开销,如系统调用的切换和数据拷贝。
2024-03-20 19:46:43
1292
原创 【DPDK】基于dpdk实现用户态UDP网络协议栈
通过本文,我们深入研究了基于DPDK的用户态UDP网络协议栈的设计、实现。在整体设计思路上,我们采用了用户态网络协议栈的理念,通过将核心功能移至用户空间,结合DPDK的强大支持,实现了一个高性能、低延迟的数据包处理方案。关键组成部分中,我们详细介绍了数据包接收和发送引擎、协议解析、数据包处理逻辑等模块。这些组成部分共同协作,使得用户态UDP网络协议栈能够在不同应用场景下发挥其优势。整体架构图清晰展示了各个模块之间的关系,以及数据在协议栈中的流动路径。
2024-03-06 20:20:38
2662
1
原创 【DPDK】初识内核旁路DPDK的技术背景及核心思想
随着网络I/O速率的不断提升,网卡面对大量的高速数据分组将会引发频繁的中断,每一次的中断都会引起一次上下文切换,操作系统都需要保存和恢复相应的上下文,造成较高的时延,并引起吞吐量下降。利用线程的CPU亲和绑定方式,将特定的线程指定在固定的核上工作,可以避免线程在不同核间频繁切换带来的开销,提高可扩展性,更好地达到并行处理提高吞吐量的目的。DPDK轮询网卡是否有网络报文的接受和发送,这样避免了传统网卡驱动的中断上下文的开销,当报文的吞吐量大的时候,性能及延时的改善十分明显。内核旁路顾名思义,即。
2024-03-06 14:45:09
1489
原创 Linux操作系统项目上传Github代码仓库指南
注意:git push 时需要输入密码,由于早在2021年GitHub就不再支持密码push,所以需要到官网主页生成Tokens个人访问令牌,通过该Tokens操作。
2024-03-05 20:51:51
1357
原创 【DPDK】Ubuntu系统下DPDK环境搭建指南
dpdk的源代码中有很多例子程序,都放在example目录中,其中有个最简单的程序helloworld,进入example/helloworld中,直接make,可以编译出helloworld程序。igb_uio模块加载成功后,我们选择49绑定igb_uio模块到eth0,输入PCI地址:0000:03:00:0,将网卡绑定到igb_uio模块.由于DPDK各版本之间差异较大,编译过程以实际情况为准,此处演示版本为。通过上述操作可以知道多队列网卡为:eth0。(此处虚拟机核心数为8)(修改为自己的路径)
2024-02-29 21:07:36
3863
1
原创 TiDB存储引擎的初步认识
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和MySQL 生态等重要特性。
2023-12-13 09:03:45
1078
原创 RocksDB实现原理
RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高速存储硬件性能的高效数据库系统。这是一个 C++ 库,允许存储任意长度二进制 KV 数据。支持原子读写操作。RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存,使用 Flash,使用硬盘或者HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生产和调试使用。RocksDB 大量复用了 levedb 的代码,并且还借鉴了许多HBase 的设计理念。
2023-12-09 11:54:29
1474
原创 【Linux内核源码】进程管理模块
asmvolatile关键字为__volatile__告诉编译器:禁止优化代码,不需要改变barrier()前面的代码块、barrier和后面代码块这3个代码块的顺序。
2023-12-07 10:37:13
1032
原创 火焰图的基本认识与绘制方法
每隔一个固定的时间,就在CPU上(每个核上都有)产生一个中断,在中断上看看,当前是哪个pid,哪个函数,然后给对应的pid和函数加一个统计值,这样,我们就知道CPU有百分几的时间在某个pid,或者某个函数上了。2.x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长. 注意,x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的.常见的火焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 等等。
2023-12-05 17:16:17
2443
原创 常用性能工具与性能分析
iperf3是一个用于测量网络带宽和性能的强大工具,通过在服务器和客户端之间进行数据传输,可以评估网络的吞吐量、延迟和丢包率等指标。通过定制测试参数和选项,你可以根据需要进行各种类型的网络测试。对于网络性能评估和故障排除,iperf3是一个非常有用的工具。fio是一个功能强大的存储系统性能测试工具,通过编写配置文件并运行fio命令,你可以模拟不同类型的I/O负载,并获取详细的性能指标和统计信息。通过调优参数和选项,你可以进一步定制测试场景,以满足不同的测试需求。
2023-12-04 08:42:26
1145
原创 Google测试框架googletest简介与使用方法
断言成对出现,它们测试相同的东西,但对当前函数有不同的影响。通常首选 EXPECT_* ,因为它们允许在测试中报告一个以上的失败。但是,如果在有问题的断言失败时继 续没有意义,则应该使用 ASSERT_*。所有断言宏都支持输出流,也就是当出现错误的时候,我们可以通过流输出更详细的信息;有时候我们测试案例当中的条件太复杂,不能使用断言,那么自己写判断语句;有时候你写了某个接口,期望其他人实现它,你可能想写一系列测试,确保其他人的实现满足你的 测试;有时候相同的接口,有多个实现,下面是复用测试代码流程;
2023-12-01 22:05:03
1718
原创 docker网络
1. bridge是docker默认的网络驱动程序。如果没有指定驱动程序,这就是正在创建的网络类型。当应用程序在需要与同一主机上的其他容器通信的容器中运行时,通常会使用桥接网络。2. 就联网而言,桥接网络是在网段之间转发流量的链路层设备,链路层设备Mac地址进行通信。桥接器可以是在主机内核运行的硬件设备或者软件设备。3. 就docker而言,网桥网络为软件网桥。允许连接到同一网桥的容器进行通讯,同时提供与未连接到该网桥的容器的隔离。不同网桥上的容器无法直接通讯。
2023-11-30 10:46:54
992
原创 dockerfile介绍与使用
Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过 docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了 Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成 docker 镜像.
2023-11-29 11:42:04
1637
原创 docker镜像原理
容器解决应用开发、测试和部署的问题,而镜像解决应用部署环境问题。镜像是一个只读的容器模板, 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件,是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环境——rootfs(根文件系统或根目录)。容器与镜像类似对象与类的关系。
2023-11-28 19:57:39
965
原创 docker镜像管理命令
OFFICIAL: 是否 docker 官方发布。DESCRIPTION: 镜像的描述。AUTOMATED: 自动构建。NAME: 镜像仓库源的名称。
2023-11-28 16:39:24
621
原创 docker容器运维操作命令
3. 不指定-t参数,在attach的时候指定 --sig-proxy=false ,可以通过 Ctrl + C 退出attach状态。于--sig-proxy 默认值为true,默认将所有接收信号代理 给了容器中的进程,所以Ctrl + C 的时候会将sigint (signal interrupt)终止信号发送到attach进程, 从而转发到被attach的进程,导致容器中进程中断,从而退出容器。1. exec 在容器中执行命令,并且可以通过-i -t 创建虚拟终端的方式与容器交互。
2023-11-28 12:01:00
1163
原创 docker容器的生命周期管理常用命令
对正在运行的程序使用的是KILL信号,这使得该进程没办法处理终止过程。这就意味着一 些诸如包含运行进程ID之类的文件可能会残留在文件系统中。根据应该用程序管理状态的能力,如果再次启动容器,这可能会也可能不会造成问题。程序的默认工作方式是向指定的进程发送 TERM信号(即信号值为15)。2.docker stop 命令则像kill 命令那样工作,发送的是一个TERM型号。1.docker kill 的行为和标准的kill 命令行程序并不相同。当这个信号被处理时,大多数程序将执行某种清理工作,但是。
2023-11-27 15:52:04
571
原创 docker介绍
根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为 开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。1.Docker可以安装多个应用程序,但是Docker只有一个程序入口,也就是docker的启动命令只有一条。2.Docker和虚拟机不一样,Docker本身是一个软件,管理自己的进程,没有虚拟硬件设备。
2023-11-27 09:38:36
1712
原创 docker环境安装
5. 启动docker 重启docker。第二种:已经安装好系统的情况下,修改。将对应的地址替换,替换完成后执行。基于官方给出的快捷脚本安装。包索引,并且安装一些软件使得。用户组后,不需要每次都输入。退出终端,重新连接即可。包管理器,镜像源修改。基于官方存储库安装;
2023-11-25 18:02:07
855
原创 如何在 Unbuntu 下安装配置 Apache Zookeeper
Zookeeper 是 apache 基金组织下的项目,项目用于简单的监控和管理一组服务,通过简单的接口就可以集中协调一组服务,如配置管理,信息同步,命名,分布式协调。
2023-11-04 09:05:06
975
原创 setsockopt()函数的用法
setsockopt() 函数是一个用于设置套接字选项的函数,通常在网络编程中使用。它用于配置套接字的各种参数和选项,以满足特定的需求。setsockopt() 函数的作用是设置指定套接字选项的值。
2023-10-19 20:43:16
584
原创 fcntl()函数的作用及用法
需要注意的是,fcntl() 函数的使用和参数会因操作系统和应用程序的不同而有所变化,因此在具体使用时需要参考相关文档和操作系统的特定要求。常见的 fcntl() 操作包括 F_DUPFD(文件描述符复制)、F_GETFL(获取文件状态标志)、F_SETFL(设置文件状态标志)、F_SETLK(设置文件锁定)等。它通常用于在Unix/Linux系统上进行底层文件和套接字操作,以满足不同的需求。
2023-10-19 16:01:51
363
原创 柔性数组的使用及注意事项
例:struct sdshdr16 *p = malloc(sizeof (struct sdshdr16) + 32);// 32 为柔性数组的大小。例: free( p );//不需要额外释放,一同释放即可.3.sizeof()返回结构体的大小不包含柔性数组的大小.2.结构体中除了柔型数组外至少还要有一个其他成员.1.柔性数组在结构体当中,并且在结构体的最后面.
2023-10-17 19:32:15
325
原创 内存泄漏检测组件的实现
函数, 与此同时通过__builtin_return_address()函数的返回值结合(*caller) 命令: addr2line -f -e ./程序名 -a 返回值(caller) 查看内存泄露的程序及具体行数。函数,以便在每次内存分配和释放时记录相关信息,如文件名和行号。这使得你能够跟踪哪个函数在哪里分配和释放内存。具体使用时只需将该文件的main函数注释掉,与需要检测的程序源文件一起编译执行即可。表示在memleak.c 文件的 main 函数中, 第149行出现内存泄漏问题。
2023-10-14 20:26:29
191
原创 __builtin_return_address()函数的使用方法
在上面的示例中,__builtin_return_address(0) 用于获取各个函数的调用者的地址,以展示函数之间的调用关系。请注意,该函数主要用于调试和性能分析,并且在不同平台上的行为可能会有所不同。__builtin_return_address(0) 是GCC编译器提供的内置函数,用于获取当前函数调用栈中的指定帧(frame)的返回地址。4. 平台依赖性:使用 __builtin_return_address(0) 是平台依赖的,因为它依赖于编译器的支持,不一定在所有编译器和体系结构上都可用。
2023-10-14 19:48:08
752
原创 死锁原因及死锁检测组件的实现
需要注意的是,死锁检测虽然可以检测和解决死锁问题,但它不是最高效的方法,因为它需要定期运行,并且可能会引入一些系统开销。死锁,是指多个线程或者进程在运行过程中因争夺有限的系统资源而造成的一种僵局,当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。4. 死锁恢复:如果检测到死锁,死锁检测组件可以采取不同的措施来解决死锁。死锁检测是计算机系统中的关键组件,用于检测和解决死锁问题,确保系统的正常运行。死锁的存在是因为有资源获取环的存在,所以只要能检测出资源获取环,就等同于检测出。
2023-10-14 10:08:01
421
原创 Ubuntu系统配置Samba实现与Windows系统的文件共享
右键Share --> [映射网络驱动器(M)] -->完成。(path = share路径,需要修改)在我的电脑中搜索虚拟机IP。
2023-10-10 17:43:54
422
原创 Ubuntu系统安装gtest
2.进入googletest目录,并创建build目录并进入。注意:如果没有提前安装cmake,g++工具需提前安装。1.下载Google test 源码。4.make编译安装。5.查看是否安装成功。
2023-10-08 22:00:56
1102
2
原创 io_uring之liburing库安装
1. 确认库文件的存在:检查 liburing 库文件是否存在于系统中的库路径中。- 如果编译成功,并且没有找到任何与 liburing 相关的链接错误,那么 liburing 库已经成功安装并可以被正确链接。3. 运行示例程序:如果示例程序已经成功编译,您可以尝试运行它,以确保 liburing 在运行时能够正常工作。2. 编译示例程序:尝试编译一个使用 liburing 的示例程序,以验证库是否能够正确链接到应用程序。- 如果找到了 liburing 的库文件路径,说明库已经安装成功。
2023-10-08 08:20:58
2557
1
原创 与epoll媲美的异步io机制io_uring
io_uring 是 Linux 内核提供的一种高性能的异步 I/O 框架。它旨在提供一种效率更高、更灵活的 I/O 模型,以满足现代应用程序对高吞吐量和低延迟 I/O 操作的需求。传统的 I/O 模型(如阻塞 I/O 和非阻塞 I/O)在处理大量并发 I/O 操作时可能存在性能瓶颈。io_uring 通过提供一个高效的 I/O 操作队列和事件通知机制,允许应用程序以异步的方式提交 I/O 操作,同时避免了传统 I/O 模型中的一些开销,如系统调用的切换和数据拷贝。
2023-10-08 08:11:23
316
原创 回环lo:127.0.0.1 的简单理解
1.127.0.0.1 不对应具体的物理网卡,即与网卡无关.2.不涉及外部网络通信,只可用于本机进程间通信.3.数据流程:数据不会到达物理网卡
2023-10-07 10:58:27
156
原创 主机ping不通虚拟机,虚拟机可以ping同主机
虚拟机可以ping通主机(192.168.43.140)和外网(www.baidu.com)1.打开【控制面板】-->【网络和Internet】-->【网络连接】IP地址前三个网段一致,最后一段填1,子网掩码默认。3.修改 IP地址(I)和 子网掩码(U)2.选择VMnet8 右键【属性】问题:主机ping不通虚拟机。4.重新ping虚拟机。
2023-10-06 15:11:18
4545
7
原创 协程切换的三种底层实现方式
这就实现了一个简单的协程。它们允许在一个函数的执行过程中保存当前的执行状态(包括寄存器和栈信息),然后在之后的某个时间点恢复到这个状态,从而实现函数的非局部跳转。X86-64有16个64位寄存器,分别是:%rax,%rbx,%rcx,%rdx,%esi,%edi,%rbp,%rsp,%rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便。%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数...
2023-09-26 18:24:42
338
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人