启用透明大页THP

您所在的位置:网站首页 手机qq占用内存过大的原因 启用透明大页THP

启用透明大页THP

2023-07-10 03:11| 来源: 网络整理| 查看: 265

虽然透明大页一直被人嫌弃,因为给内存带来的碎片化加剧、页面凝聚使性能降低等。但是“存在即合理”。好吧THP还是有些优势的比如在大内存中增加TLB的覆盖等。许多针对TLB和页面粒度大小的研究也一直没停过。

文章目录 1. 检查透明大页的状态2.开启透明大页3.调整透明大页配置使用madvise()系统调用1.头文件2.分配内存3.使用madvise()设置建议4.使用分配的内存

1. 检查透明大页的状态

运行以下命令检查透明大页的状态:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出为 [always] madvise never,则透明大页功能已经开启。 如果输出为 always madvise [never],则透明大页功能已经关闭。

2.开启透明大页

如果透明大页功能未开启,可以通过以下命令启用它(需要管理员权限)

echo always > /sys/kernel/mm/transparent_hugepage/enabled 3.调整透明大页配置

有两个可用的配置选项,分别是 transparent_hugepage/defrag 和 transparent_hugepage/enabled。 transparent_hugepage/defrag:用于设置大页碎片整理的方式。 transparent_hugepage/enabled:用于设置大页的启用方式。

echo always > /sys/kernel/mm/transparent_hugepage/defrag echo always > /sys/kernel/mm/transparent_hugepage/enabled 使用madvise()系统调用

要使用madvise()系统调用并使用MADV_HUGEPAGE标志来建议内核使用大页分配内存,需要在程序中进行以下步骤:

1.头文件 #include 2.分配内存

使用适当的方法(例如malloc()或mmap())来分配需要的内存。确保分配的内存大小是大页大小的倍数,以便利用大页分配

size_t size = 4096 * 10; // 分配 10 个大页大小的内存 void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memory == MAP_FAILED) { perror("mmap"); // 错误处理 } 3.使用madvise()设置建议

在分配的内存区域上使用madvise()函数,并传递MADV_HUGEPAGE标志,以向内核建议使用大页分配内存。

int advice = madvise(memory, size, MADV_HUGEPAGE); if (advice == -1) { perror("madvise"); // 错误处理 }

madvise()函数的第一个参数是指向内存区域的指针,第二个参数是区域的大小,第三个参数是建议标志。

请注意,内核可以选择忽略这个建议,特别是如果没有足够的大页可用或其他限制存在。因此,无法保证内核会始终使用大页来分配你的内存

4.使用分配的内存

在使用完内存后,应该使用munmap()函数释放内存,以防止内存泄漏。

// 使用分配的内存 // ... // 最后记得释放内存 munmap(memory, size);


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3