启用透明大页THP |
您所在的位置:网站首页 › 手机qq占用内存过大的原因 › 启用透明大页THP |
虽然透明大页一直被人嫌弃,因为给内存带来的碎片化加剧、页面凝聚使性能降低等。但是“存在即合理”。好吧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 |