在 Linux 系统中,分配大页内存(Huge Pages)可以显著提高某些应用程序的性能,特别是那些对内存访问延迟敏感的应用,如数据库、高性能计算(HPC)应用等。以下是关于如何在 Linux 中分配和管理大页内存的详细指南。
cat /sys/kernel/mm/hugepages/
输出示例:
hugepages-2048kB/nr_overcommit_hugepages
hugepages-2048kB/nr_hugepages
hugepages-2048kB/memsize
hugepages-1048576kB/nr_overcommit_hugepages
hugepages-1048576kB/nr_hugepages
hugepages-1048576kB/memsize
cat /sys/kernel/mm/hugepages-<size>/nr_hugepages
例如,查看 2MB 大页的数量:
cat /sys/kernel/mm/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/kernel/mm/hugepages-2048kB/nr_hugepages
echo 1 > /sys/kernel/mm/hugepages-1048576kB/nr_hugepages
/etc/default/grub
文件
找到 GRUB_CMDLINE_LINUX
行,添加大页配置参数。例如,设置 2MB 大页数量为 1024:
GRUB_CMDLINE_LINUX="... hugepages=1024"
如果需要同时配置不同大小的大页,可以使用逗号分隔:
GRUB_CMDLINE_LINUX="... hugepages=1024 hugepagesz=1G hugepages_1G=1"grub
的系统:
sudo update-grubmmap
分配大页内存#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define HUGETLB_FLAG_LARGE | MAP_HUGETLB
#define PAGE_SIZE 2147483648UL // 2GB
int main() {
int fd = open("/dev/hugepages/my_hugepage_file", O_RDWR | O_CREAT, 0755);
if (fd < 0) {
perror("open");
return 1;
}
// 预留 2GB 大页内存
ftruncate(fd, PAGE_SIZE);
void *addr = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_HUGETLB, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
// 使用大页内存...
munmap(addr, PAGE_SIZE);
close(fd);
return 0;
}
export HUGETLB_PATH=/mnt/hugepages
然后在应用程序中使用 mmap
时,大页内存将自动从指定路径分配。
cat /proc/meminfo | grep Huge
cat /sys/kernel/mm/hugepages-<size>/nr_overcommit_hugepages
确保 /dev/hugepages
目录存在且具有适当的权限:
sudo mkdir -p /mnt/hugepages
sudo mount -t hugetlbfs nodev /mnt/hugepages
sudo chown root:root /mnt/hugepages
领取专属 10元无门槛券
手把手带您无忧上云