hugetlbfs的使用测试

本文详细介绍了Linux内核如何通过hugetlbfs支持2MB的大页面,以减少TLB Miss和缺页中断,提高性能。内容包括hugetlbfs的使用、配置、测试代码和初始化过程,强调了hugetlbfs对于内存管理的补充作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hugetlbfs

CPU缓存中有一组缓存专门用于缓存TLB,但其大小是有限的。当采用的默认页面大小为 4KB,其产生的TLB较大,因而将会产生较多 TLB Miss 和缺页中断,从而大大影响应用程序的性能。操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。这也正是 Linux 内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和 Swap)。

为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。

使用

使用巨页需要在内核编译的时候打开相关的配置选项:CONFIG_HUGETLBFS, CONFIG_HUGETLB_PAGE

image-20210606192929457

命令 cat /proc/filesystems 还应该显示配置的“hugetlbfs”类型的文件系统在内核中。

image-20210606202559014

命令 cat /proc/sys/vm/表示当前配置的hugetlb数量内核中的页面。超级用户可以动态请求更多(或释放一些预配置)大页面。

image-20210606202649103

也可通过命令 grep Huge /proc/meminfo查看

image-20210606202744025

可以通过命令sudo sysctl vm.nr_hugepages=192修改巨页的数量为192页。

image-20210606203059864

内核编译完成并成功启动内核之后,将 hugetlbfs 特殊文件系统挂载到根文件系统的某个目录上去,以使得 hugetlbfs 可以访问。命令如下:

mount none /mnt/huge -t hugetlbfs

此后,只要是在 /mnt/huge/ 目录下创建的文件,将其映射到内存中时都会使用 2MB 作为分页的基本单位。值得一提的是,hugetlbfs 中的文件是不支持读 / 写系统调用 ( 如read()或write()等 ) 的,一般对它的访问都是以内存映射的形式进行的。

测试代码

 #include <fcntl.h>
 #include <sys/mman.h>
 #include <errno.h>
 #include<string.h>

 #define MAP_LENGTH      (10*1024*1024)

 int main()
 {
    int fd;
    void * addr;

/* create a file in hugetlb fs */
fd = open("/mnt/huge/test", O_CREAT | O_RDWR);
if(fd < 0){
    perror("Err: ");
    return -1;
}

/* map the file into address space of current application process */
addr = mmap(0, MAP_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(addr == MAP_FAILED){
    perror("Err: ");
    close(fd);
    unlink("/mnt/huge/test");
    return -1;
}

/* from now on, you can store application data on huage pages via addr */
memset(addr,0,MAP_LENGTH);
getchar();

munmap(addr, MAP_LENGTH);
close(fd);
unlink("/mnt/huge/test");
return 0;

 }

2.在权限上做了处理,其实都是通过mmap系统调用

#include <sys/mman.h>
### 如何使用 DPDK-Pktgen 进行性能测试 #### 1. 环境准备 为了能够顺利运行 DPDK 和 Pktgen,需要完成一系列初始化工作。这包括设置环境变量、加载大页内存、绑定网卡到用户空间驱动以及安装必要的依赖项。 以下是具体的准备工作: - 设置环境变量并启用大页支持[^2]。 - 将目标网卡绑定至 `uio_pci_generic` 或其他适合的用户空间驱动程序[^3]。 ```bash modprobe uio insmod $RTE_SDK/build/kmod/igb_uio.ko echo "options hugepages nr_hugepages=1024" | sudo tee /etc/modprobe.d/hugepages.conf mount -t hugetlbfs nodev /mnt/huge ``` #### 2. 编译与安装 Pktgen 的构建依赖于已成功编译的 DPDK 库。因此,在编译 Pktgen 前需先确认 DPDK 已经正确安装。 具体命令如下所示[^5]: ```bash export RTE_SDK=/path/to/dpdk export RTE_TARGET=x86_64-native-linuxapp-gcc cd /path/to/pktgen-dpdk make ``` #### 3. 启动 Pktgen 并配置参数 启动 Pktgen 需要指定 EAL 参数(Environment Abstraction Layer),这些参数定义了应用程序使用的硬件资源和行为模式。常见的启动脚本可能类似于以下形式: ```bash ./build/app/pktgen -c 0xf -n 4 --proc-type auto \ --file-prefix pg --socket-mem 1024,1024 \ -- -T -m "[1:2].0,[3:4].1" ``` 上述命令解释: - `-c 0xf`: CPU 核心掩码,表示哪些核心被分配给应用。 - `-n 4`: 指定 NUMA 节点数。 - `--socket-mem`: 分配每颗 NUMA 上的大页数量。 - `-T`: 表示开启统计功能。 - `-m "[1:2].0,[3:4].1"`: 映射逻辑核到物理端口。 #### 4. 发送数据包 通过 Web UI 或 CLI 控制台发送流量。例如,可以通过以下方式设定速率和持续时间: ```text set all rate 10 # 设定所有端口以 10% 的线速发送 start all # 开始传输 stop all # 停止传输 show all stats # 查看实时统计数据 ``` #### 5. 数据分析 收集来自控制台输出的结果或者保存日志文件以便进一步处理。通常关注的关键指标有吞吐量 (Throughput),延迟 (Latency) 和丢包率 (Packet Loss Rate)[^4]。 --- ### 示例代码片段展示如何自动化部署流程 下面提供一段简单的 Bash 脚本来实现部分自动化的部署过程: ```bash #!/bin/bash # Define paths and variables DPDK_DIR="/devel/dpdk" PKTGEN_DIR="/devel/pktgen-dpdk" # Install dependencies yum install -y gcc libpcap-devel kernel-devel kernel-headers # Clone repositories if not existent yet if [ ! -d "$DPDK_DIR" ]; then git clone http://dpdk.org/git/dpdk $DPDK_DIR fi if [ ! -d "$PKTGEN_DIR" ]; then git clone http://dpdk.org/git/apps/pktgen-dpdk $PKTGEN_DIR fi # Build DPDK SDK cd $DPDK_DIR && make config T=x86_64-native-linuxapp-gcc && make # Export environment variable & build pktgen application export RTE_SDK=$DPDK_DIR export RTE_TARGET=x86_64-native-linuxapp-gcc cd $PKTGEN_DIR && make ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值