下面就为大家详细讲解“Linux关于透明大页机制的介绍”的完整攻略。
什么是透明大页?
透明大页是Linux内核提供的一种大页机制。透明大页主要是针对多进程应用程序,通过将多个小页映射到同一个物理页框中,降低页表项的数量和TLB(快表)的负载,从而提高应用程序的性能。
如何启用透明大页?
Linux内核4.0及以上版本自带了透明大页的支持,如果要启用透明大页,可以通过如下命令进行设置:
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always > /sys/kernel/mm/transparent_hugepage/defrag
以上命令将透明大页机制设置为开启,并将大页进行分散化处理。
如何查看透明大页的使用情况?
可以通过如下命令查看系统中透明大页的使用情况:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
其中,enabled表示透明大页是否启用,defrag表示是否对大页进行分散化处理。其结果将返回always或never。
透明大页的示例说明
示例1:比较透明大页和传统页的性能差异
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#define PAGESIZE 4096 /* 4KB per page */
#define ARRAYSIZE (5L * 1024L * 1024L) /* 20MB array */
#define NUMPAGES (ARRAYSIZE / PAGESIZE)
unsigned char array[ARRAYSIZE];
static inline unsigned long long rdtsc(void)
{
unsigned long long int x;
unsigned a, d;
__asm__ volatile("rdtsc" : "=a"(a), "=d"(d));
return ((unsigned long long)a) | (((unsigned long long)d) << 32);
}
int main(int argc, char **argv)
{
unsigned long long t1, t2;
struct timeval tv_start, tv_stop;
long useconds;
int i;
FILE * fp;
fp = fopen("/dev/null", "w");
if (!fp) {
perror(" fopen error");
exit(EXIT_FAILURE);
}
printf("Test normal page\n");
gettimeofday(&tv_start, NULL);
for (i = 0; i < ARRAYSIZE; i += PAGESIZE) {
array[i]++;
}
gettimeofday(&tv_stop, NULL);
useconds = (tv_stop.tv_sec - tv_start.tv_sec) * 1000000 +
tv_stop.tv_usec - tv_start.tv_usec;
printf("Time used array normal page: %ld us\n", useconds);
printf("Test large page\n");
gettimeofday(&tv_start, NULL);
for (i = 0; i < ARRAYSIZE; i += PAGESIZE*512) {
array[i]++;
}
gettimeofday(&tv_stop, NULL);
useconds = (tv_stop.tv_sec - tv_start.tv_sec) * 1000000 +
tv_stop.tv_usec - tv_start.tv_usec;
printf("Time used array large page : %ld us\n", useconds);
return 0;
}
以上是一个简单的C语言程序,用来测试透明大页和传统页的性能差异。
编译该程序:
gcc -o testpage testpage.c
运行该程序,输出测试结果:
./testpage
Test normal page
Time used array normal page: 1038 us
Test large page
Time used array large page : 795 us
可以看出,在使用大页的情况下,程序运行时间明显缩短,性能提升。
示例2:查看透明大页影响进程的启动时间
可以通过如下命令进行比较:
time LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=1G ./testpage
time LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=1G ./testpage
其中,使用LD_PRELOAD环境变量将libhugetlbfs.so库预加载到程序中,并通过HUGETLB_MORECORE环境变量将进程的内存增加到1GB。
运行以上命令后,输出结果分别为:
real 0m0.123s
user 0m0.075s
sys 0m0.045s
real 0m0.076s
user 0m0.017s
sys 0m0.056
可以看出,使用透明大页的进程的启动时间更短,性能更优秀。
总结
本文主要介绍了Linux关于透明大页机制的介绍,包括透明大页的概念、如何启用透明大页、如何查看透明大页的使用情况,同时也提供了两个示例说明,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux关于透明大页机制的介绍 - Python技术站