理想的 huge page

随着现代计算机内存容量的增加,虚拟内存的传统需求逐渐减弱。本文探讨了Hugepage技术如何减少地址转换开销并提高特定应用性能,特别是在数据库场景中实现了高达40%的性能提升。文中还讨论了理想中的Hugepage特性和当前各平台上的限制。

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

背景

  现代计算机的内存越来越大,服务器动辄就有上百GB,甚至 TB 级别的内存,很多应用已经可以把全部数据都放入内存,这样,磁盘空间换取内存空间这个传统中虚拟内存最重要的需求已经相当弱化甚至不复存在。当然我们仍然需要虚拟内存的其它好处(进程隔离、内存保护等),但是,虚拟内存最大的缺点:地址转换开销,在很多应用中越来越突出。

  于是,大家想起了 huge page ,huge page 大幅减小了对 CPU 中 TLB 的需求,在某些特殊应用中可以大幅提高性能,在我们的数据库测试中,huge page (还只是 2MB 的hugepage)提高了 40% 的性能。

  目前 huge page 在各平台上的使用很麻烦,并且有很多限制,比如 Linux 上只有私有匿名 page 可以使用 huge page,windows 上使用 huge page (large page) 除了需要私有匿名,还需要特殊权限。


理想中的 huge page 应该是这样的:

  1. 超大 huge page (比如 1GB 的 huge page) 最好通过系统启动参数保留
    • 跟现在一致,不过可以 relax 一下,如果启动参数中未保留,如果系统通过 defrag 可以回收到连续的超 1G 的物理内存,仍可使用
    • 现有 page 实现都需要 page 物理地址按 pagesize 对齐(硬件需求),但是对超大 huge page,我觉得这个需求可以放宽一点,虚拟地址按 pagesize 对齐,物理地址可以只按某个较小的值对齐
  2. Linux transparent huge page 已经做得相当不错了,但是好像不支持 1GB 的 huge page,如果能 transparent 1GB 的 huge page,就更好了
  3. Readonly, 并且 Lock 的非匿名非私有 mmap,应该也可以“尽最大努力”使用尽可能大的 huge page
    • 要更严格一点,如果某个文件某区域已经这样使用了 huge page,后续在同一文件同一(可能交叉)区域的 mmap 与 Readonly & Lock 不兼容,后续的这个 mmap 调用可以失败,这种 case 应该不多,并且大概率是错误的用法,失败完全可以接受。
    • 尽量用更大的(比如 1GB)的 huge page
  4. 硬件厂商应该也与时俱进,huge page 的 TLB 可以适当增加一些

### 配置DPDK Hugepages 在Linux环境中配置Hugepages对于优化内存管理和提高性能至关重要。为了使DPDK能够高效运行,必须正确设置大页内存。 #### 设置内核参数 要启用并分配大页,需调整几个重要的内核参数: - `/proc/sys/vm/nr_hugepages` 控制可使用的巨大页面数量。 - `/sys/kernel/mm/hugepages/hugepages-<size>/nr_hugepages` 可用于特定大小的大页数目的设定[^1]。 #### 创建挂载点 创建一个专门的文件系统来管理这些大页是非常必要的。通常做法是在`/mnt/huge`下建立一个新的tmpfs实例: ```bash sudo mkdir -p /mnt/huge echo "nodev /mnt/huge hugetlbfs defaults 0 0" | sudo tee -a /etc/fstab ``` #### 修改权限 为了让应用程序可以访问到已分配好的大页空间,还需要适当放宽该路径下的读写权限: ```bash sudo mount -t hugetlbfs nodev /mnt/huge sudo chmod a+rwx /mnt/huge ``` #### 自动化脚本 考虑到每次重启都需要重新执行上述命令较为繁琐,因此建议编写一段简单的初始化脚本来完成这项工作。下面是一个例子: ```bash #!/bin/bash # Set number of huge pages (e.g., 1024 * 2MB = 2GB) NUM_PAGES=1024 PAGE_SIZE="2M" if [ ! -d "/mnt/huge" ]; then echo "Creating /mnt/huge" sudo mkdir -p /mnt/huge fi echo "Mounting hugetlbfs..." grep -s '/mnt/huge' /proc/mounts || \ (sudo mount -t hugetlbfs none /mnt/huge) echo "$NUM_PAGES" | sudo tee /proc/sys/vm/nr_hugepages echo "Setting permissions on /mnt/huge" sudo chmod 777 /mnt/huge ``` 保存此脚本至合适位置,并赋予其可执行权限以便日后调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值