Linux关于透明大页机制的介绍

下面就为大家详细讲解“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技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务

    问题描述 在 Spring Boot 项目中,使用 Redisson 连接 Azure Redis 服务,如下是详细的操作步骤(项目源代码文末可下载)   示例步骤 第一步: 在 Spring Boot 的项目中,添加 redisson-spring-boot-starter 依赖  在项目的pom.xml文件中添加 redisson-spring-boot…

    Redis 2023年4月13日
    00
  • 详解SQL四种语言:DDL DML DCL TCL

    详解SQL四种语言:DDL、DML、DCL、TCL SQL(Structured Query Language)是关系型数据库管理系统的标准语言。SQL语言包括DDL、DML、DCL、TCL四种语言。下面将详细介绍这四种语言的含义、语法和示例。 DDL DDL(Data Definition Language,数据定义语言)是用于定义数据库对象的语言,主要包…

    database 2023年5月22日
    00
  • Neo4j和SQLite的区别

    Neo4j和SQLite都是常见的数据库管理系统,它们在以下几个方面有很大的区别: 数据表结构 SQLite是关系型数据库,其数据表结构由列和行组成,每个行代表一个实例化的实体,每个列则代表一种属性。而Neo4j则是图形数据库,它包含节点和关系,节点代表实体,关系表示实体之间的关联关系。节点之间还可以添加属性用于描述这些实体。 举个例子,假设我们有一个学生数…

    database 2023年3月27日
    00
  • SQL 中 DROP 和 TRUNCATE 的区别

    下面是SQL中DROP和TRUNCATE的区别的完整攻略: DROP和TRUNCATE的定义 DROP和TRUNCATE都是SQL中常用的删除表数据的操作语句。但是二者的作用和使用方法略有不同。 DROP是一种完全删除表的结构,包括所有关联的约束和索引,数据会被永久删除,不能恢复。 TRUNCATE删除表的数据,但是不删除表的结构、约束和索引等其他属性,数据…

    database 2023年3月27日
    00
  • 面试题锦集:1、数据库三大范式,2、mysql索引类型及作用,3、事务的特性和隔离级别

    目录 面试题集锦 一、数据库三大范式 二、mysql有哪些索引类型及作用 三、事务的特性和隔离级别 1、事务的四大特性 2、事务的隔离级别 3、什么是脏读、不可重复度、幻读 4、解决办法 面试题集锦 一、数据库三大范式 第一范式(1NF): 指数据库中表的每一列都是不可分割的最小单位 # 分割前: 地址 安徽省合肥市蜀山区 # 分割后: 省 | 市 | 区 …

    MySQL 2023年4月8日
    00
  • mybatis 传入null值的解决方案

    针对Mybatis传入null值的问题,可以采取以下解决方案: 解决方案一:使用mybatis-default-value属性 在Mybatis的配置文件中,可以使用mybatis-default-value属性来指定映射对象中的属性的默认值。 示例一 假设我们有一个User实体类,其中有一个String类型的属性name。如果此时没有传入name参数,而我…

    database 2023年5月21日
    00
  • Consider defining a bean of type ‘redis.clients.jedis.JedisPool’ in your configuration.

    报错信息   原因是没有Jedispool没有注入 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…

    Redis 2023年4月12日
    00
  • swagger+jwt+shiro+redis

    swagger+jwt+shiro+redis 一、前言 最近在项目中想整合swagger+jwt+shiro+redis过程中遇到诸多问题和困难,现重新写一个demo并记录解决步骤。存在的问题: shiro默认的拦截跳转都是跳转url页面,而前后端分离后,后端并无权干涉页面跳转。 shiro默认的登录拦截校验机制是使用的session。 参考资料:Spri…

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部