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

yizhihongxing

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

相关文章

  • sqlmap用户手册[续篇]

    SQLMap用户手册[续篇]完整攻略 总览 SQLMap是一个方便用户对SQL注入漏洞进行自动化检测和利用的工具。本文旨在详细介绍SQLMap的使用方法,包括各种参数选项和攻击模式。该文是SQLMap用户手册(续篇)的完整攻略。 安装和配置 安装Python环境 安装SQLMap 获取SQLMap源代码: git clone –depth 1 https:…

    database 2023年5月22日
    00
  • MySql的事务使用与示例详解

    MySql的事务使用与示例详解 什么是事务? 事务是指由一系列数据库操作所组成的一个不可分割的工作单元。 事务是数据库操作的基本单位,是有关联的多个操作组成的一个整体。 事务中的操作要么全部成功,要么全部失败,不存在部分执行的情况。 事务必须有四个特征,通常用ACID缩写来描述,即原子性、一致性、隔离性和持久性。 事务操作示例 示例1:向两个表中插入数据 S…

    database 2023年5月22日
    00
  • Redis中 HyperLogLog数据类型使用总结

    转载请注明出处: 目录   1. HyperLogLog 的原理   2.使用步骤   3.实现请求ip去重的浏览量使用示例   4.Jedis客户端使用   5.Redission使用依赖   6.HyperLogLog 提供了哪些特性和方法   7.使用场景总结 1. HyperLogLog 的原理   Redis HyperLogLog基于一种称为Hy…

    Redis 2023年4月10日
    00
  • 常用SQL语句(嵌套子查询/随机等等)详细整理

    常用SQL语句详细整理 嵌套子查询 嵌套子查询是指在一个SQL查询中嵌套另一个SQL查询,通常用于获取更为准确的结果或进行复杂的数据统计分析。嵌套子查询可以嵌套多层。 示例1:查询存在于子查询中的数据 SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE field2=’value’); …

    database 2023年5月21日
    00
  • ORACLE LATERAL-SQL-INJECTION 个人见解

    ORACLE LATERAL-SQL-INJECTION 个人见解 什么是Oracle Lateral SQL Injection? Oracle Lateral SQL Injection是指通过向查询中添加lateral语句来实现一个注入攻击。Lateral语句是在Sql From语句的子查询中引入的表达式。它通常与查询嵌套一起使用,以产生更集中的结果集…

    database 2023年5月21日
    00
  • MySQL DATE_ADD和ADDDATE函数实现向日期添加指定时间间隔

    MySQL DATE_ADD和ADDDATE函数可以帮助我们在指定日期上添加时间间隔,这样我们可以很方便地进行日期计算。下面我会详细介绍这两个函数的使用方法及示例。 DATE_ADD函数 DATE_ADD函数可以用于在指定日期上添加时间间隔。它的基本语法如下: DATE_ADD(date, INTERVAL expr unit) 其中,date是一个日期或日…

    database 2023年5月22日
    00
  • MySQL如何导入SQL数据库的实战举例

    下面是MySQL如何导入SQL数据库的完整攻略,包含以下步骤: 步骤一:准备SQL文件 将需要导入的SQL数据库文件准备好,比如名为“example.sql”的文件。 步骤二:登录MySQL 在命令行窗口中输入以下命令登录MySQL服务器: mysql -u用户名 -p密码 其中,“用户名”和“密码”分别为你的MySQL登录名和密码。 步骤三:创建数据库 在…

    database 2023年5月22日
    00
  • sql 批量修改数据库表

    下面是关于 SQL 批量修改数据库表的完整攻略: 1. 修改单列 如果只需要修改表中的某个列,可以使用 UPDATE 命令。例如,我们要将表中 name 字段为“张三”的每个记录的 age 字段更新为 30,则可以执行以下命令: UPDATE yourtable SET age = 30 WHERE name = ‘张三’; 这条命令会将你的表中所有 nam…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部