zoukankan      html  css  js  c++  java
  • 大页和透明大页

    关于大页和透明大页的介绍可以看看redhat的doc:
    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-transhuge.html
    翻译一下:

    内存是一块一块进行管理的,这一块又被成为是“页”。一页一般是4096字节(4kb)。1mb内存等于256页。1gb内存等于256000页。CPU有一个内置的内存管理单元,它有一个pagetable,会记录这些页,每个页都是这个pagetable的entry。

    如果内存较多,有两种方式管理:
    在硬件层面,增多内存管理单元中pagetable的entry数量
    增大页大小
    第一种方法过于昂贵,因为现代处理器的内存管理单元只支持数百个或者数千个page table entry。除此之外硬件和内存单元算法在当前数量的page table entry下工作良好,如果增多entry,可能有所不同。这就造成一个性能问题:如果页数超过了硬件内存单元支持的数量,系统会回退到基于软件的内存管理方式,这会让系统运行的更慢。

    而大页是什么呢?简单的说,大页是就是大小为2mb或者1gb的页。如果内存是gb这个量级,那么pagetable使用2mb的页。如果内存是tb这个量级,那么pagetable使用1gb页。

    大页手动管理起来比较麻烦,为了高效使用,需要代码上做一些改动。基于这个原因,redhat实现了透明大页(transparent huge pages,THP)。THP是一个抽象层,它自动创建/管理/使用大页。THP隐藏了使用大页的复杂性,这不管是对于开发者还是管理员来说都是好事情。THP的目标是提升性能,他的开发者在很多系统上都测试过,并感知到了性能的提升。大多数系统都可以通过配置THP来提升性能,然而,在数据库环境下THP不推荐使用。

    目前THP只支持映射匿名内存区域如heap和stack空间。

    回到JVM,必须同时开启:
    -XX:+UseLargePages
    -XX:+UseTransparentHugePages
    -XX:+UseHugeTLBFS
    -XX:+UseSHM
    JVM才会设置大页。这块代码在os::large_page_init()里,linux上是读取/proc/meminfo里面的Hugepagesize项,拿到系统大页大小。windows是调GetLargePageMinimum()这个win32api

    $cat /proc/meminfo | grep Hugepagesize
    Hugepagesize:       2048 kB
    
  • 相关阅读:
    编程算法
    2048小游戏主要算法实现
    Spring 计时器 @Scheduled cron 含义
    jQuery Validate Ajax 验证
    jQuery Validate 使用
    Java 两个整数相除保留两位小数,将小数转化为百分数
    mybatis+mysql返回插入的主键,参数只是提供部分参数
    微信 创建自定义菜单 向微信发起的post请求
    JSON.parse()和JSON.stringify()
    前台JSON字符串,spring mvc controller也接收字符串
  • 原文地址:https://www.cnblogs.com/kelthuzadx/p/15726497.html
Copyright © 2011-2022 走看看