linux 页大小,linux基础知识点
大家好,今天小编来为大家解答linux 页大小这个问题,linux基础知识点很多人还不知道,现在让我们一起来看看吧!
为什么linux kernel默认的页面大小是4K,而不是4M或8M
太多了,我就做一次搬运工了。
相信很多人在看内核内存管理部分的时候,都有这样一个疑问,为什么物理页面的大小选择4K,而不是大一些或者小一些呢?
这个问题没有固定的答案,仁者见仁智者见智,每个人的关注点不一样。所以这篇文章不是说给出一个固定的答案,更多的只是一篇讨论性的文章。
内核的页面大小首先跟CPU有关,不同的架构支持的页面大小也不相同,但有一个共同点,那就是肯定支持4K的页面大小。为什么处理器在设计
的时候会选择4K,而不是其他,这个只有熟悉CPU历史的人才能给出答案,本人才疏学浅,回答不上来,有兴趣的自己找一找。当然处理器的设计者在考虑页面
大小的时候,也不是凭空就选择了这个大小,除了历史因素,肯定综合了考虑了大页面、小页面的优缺点,所以这里主要列出这些优缺点,通过这些比较来发现内核
为什么将默认的页面大小选择为4K。
现在更多争论的是大页面还是维持现在的页面4K大小,所以小页面的情况我们就不考虑了,通过比较前两者也可以得出小页面的情况。支持大页面的人通常认为大页面有以下好处:
1、减小page table占用的内存。
假设内存一定的话,页面大小越大,管理页面占用的内存也越小。现在内核中每个页面假设是4K的话,这4K不是全都可用,还有一部分用作
struct
page(大约是64bytes),如果是2.6.32的话,每个页还有一个page_cgroup(32bytes),也就是说内存大小的2.3%
(96/4096)会被内核固定使用。如果页面大小是4M的话,这个比率大约是0.0006%。假设内存时64G的话,页面大小是4K,管理页占用的内存
为1.472G,而页面大小是4M,管理页面占用的内存为0.393M。所以页面比较大时,节省的内存比较多。
2、提高TLB的命中率
每次访问内存的时候,都要将虚拟地址转换为物理地址,如果每次都访问页表的话,消耗比较大。因此,通常使用TLB来加速这个过程。但是
TLB的可以直接转换的地址范围是有限的(具体就是项数乘以页面大小),一旦出现TLB
miss,这时就必须去页表中查找。所以,如果是大页面的话,同样TLB项数的情况下,可以跟踪更大的内存。
3、提高磁盘I/O
我们知道在访问磁盘时,最耗时的操作就是查找写入盘区的起始位置,也就是在磁盘盘片上将读写头置于正确的位置上。所以如果是大页面的话,可以减少写入磁盘的次数。比如要写入4M的缓存,页面大小是4M的话,只需写入1次,而页面大小是4K的话,则需要写入4次。
4、提供缓存利用率
如果是大页面的话,可以减少访问伙伴系统的次数。调用伙伴系统的操作队系统的数据和指令高速缓存有相当的影响。内核越浪费这些资源,这些资源对用户空间进程就越不可用。
除了上面提高的好处,肯定还有的好处,就不一一列举了。那既然有这么好处,而且现在内存越来越大,为什么不更多地采用大页面呢?比如4M?
软件开发中,从来不会有非常完美的方案,都是在优缺点之间找到平衡点。同样,大页面有这样那样的好处,缺点也很明显。
1、最大的问题就是内存浪费,而且这个问题非常严重。比如这时要分配的内存是4M+1byte,这时需要两个页面才能满足分配的需要,这个
时候浪费的内存为4M-1byte。如果页面是4K的话,浪费的内存数量为4k-1byte。页面太大,可能导致每个页面都只使用了部分空间,剩余的空间
就被浪费了。当然对于数据库这样的系统来说,页面越大会越好,但是内核要考虑到通用的情况,而不是专注于特殊的应用场景。再比如,现在系统都是只分配虚拟
地址空间,虚拟地址空间只有在真正被访问的时候,才映射物理页面,而且为了减少物理页面的浪费,对不访问的部分,则不作映射。如果页面太大,在映射很小的
部分时,分配的内存会越大,浪费也就越大。系统在运行时,会频繁地请求内存页的操作,这样导致潜在的浪费会非常严重。这样的浪费会完全抵消减小page
table的优势。
2、页面太大,会导致大量的内存碎片。因为底层的内存管理是以页面为单位。如果系统运行了很长时间,空闲的内存很多,但是连续的内存块都小
于要分配的页面数。这时可以通过移动内存块或者利用swap来获取可用内存,但是会导致分配内存的操作很慢,这种慢会形成恶性循环,严重影响系统的性能。
如果是小页面的话,内存的利用会比较紧凑,分配页面时需要的连续内存块的大小不像大页面那样需要的那么大。
3、如果CPU崩溃,TLB可以访问的内存越大,对系统的影响也越大。这时一把双刃剑,大页面可以提供TLB访问的内存数量,但是CPU崩溃时,会导致很多内存访问要去页表中请求物理地址。
4、兼容性问题。X86处理器支持的页面大小只有4K,所以如果页面过大的话,会导致兼容性问题。
5、如果页面太大,在将内存页换出到swap分区时,需要换出的内存也就越大,会影响性能。
总之,这个页面大小4K是在计算机发展过程中选择的,也是在实践中经过检验的,现在看来这个页面是合适的。
linux页框大小和页大小不一样大吗
讨论Linux中的页框大小与页大小是否不一致的问题,需要理解Linux内核是如何管理内存的。
Linux的页框大小通常为4k,这是物理内存页的大小。而页则是程序中数据的实际使用单位,在程序运行时,数据存储在物理内存中所对应的页框上。当程序不在运行时,其内存页可能被换出,释放实际物理内存。若此时有其他程序请求内存,页框会被装入其他程序的数据,因此页框通常不会被某个程序单独占用。但重要的是,页面数据是由程序独占的。
页描述符是描述页面属性的数据结构,它与页框和页共同构成了Linux内存管理的基石。
在页装入页框之后,虚拟地址与物理地址之间建立映射,称之为Page table entry,存在于应用程序的页表中。这种映射机制确保了程序能够有效地访问其数据,同时内核能够高效地管理内存使用。
综上所述,Linux页框大小与页大小在概念上一致,均为4k,它们共同构成了程序数据在物理内存中的存储结构。页框负责存储程序数据,页描述符描述页面属性,而页与Page table entry则在运行时实现地址映射。这些元素共同确保了Linux系统中内存的高效管理和使用。
Linux 标准大页和透明大页
Huge pages(标准大页)和Transparent Huge pages(透明大页)
Linux中内存管理的基本单位是页,当前默认页大小为4096字节,即4K。1MB内存等于256页,1GB内存则为256000页。随着系统内存的增大,CPU需要管理内存页的成本也会上升,影响系统性能。
Huge Pages
Huge Pages在Linux 2.6版本后引入,旨在通过使用大页内存取代传统4kb内存页面,以适应现代硬件的大页面容量功能。Huge Pages有两种大小格式:2MB和1GB。2MB页适用于GB级别的内存,1GB页适用于TB级别的内存,其中2MB为默认页大小。
Transparent Huge Pages(THP)
Transparent Huge Pages是RHEL 6开始引入的功能,作为自动创建、管理和使用的抽象层,简化了传统大页的复杂性。由于手动管理Huge Pages需要对代码进行重大修改,且不适用于所有环境,THP通过自动创建和管理传统大页,降低了使用大页的复杂度,提高了性能。
关键区别
标准大页管理采用预分配方式,而透明大页管理则采用动态分配方式。
Huge Pages优点
Oracle推荐使用Huge Pages,主要优点包括:大页面大小和更少的页面数量、减少页表遍历、降低内存操作的开销、减少内存使用、避免换页机制的开销、以及更适合数据库工作负载。
Huge Pages缺点
开启Huge Pages需要额外设置,并且与Oracle 11g的新特性AMM(自动内存管理)冲突,但ASMM(自动共享内存管理)仍然可以使用。
Transparent Huge pages问题
尽管Oracle推荐使用Huge Pages,但建议关闭Transparent Huge Pages,因为存在一些问题,如不支持32位RHEL 6、存在内存使用和性能问题。
如何关闭Transparent Huge Pages
方法一:通过命令关闭或修改grub开机引导文件。方法二:备份配置文件、编辑相关配置文件并重新生成grub配置。
使用情况监控
可以监控/sys/kernel/mm/transparent_hugepage/khugepaged下的信息,包括每个扫描周期被扫描的内存页数、扫描频率和碎片整理时间。
总结,Huge Pages和Transparent Huge Pages提供了内存管理的优化方式,适用于不同场景和需求。了解它们的特点和优缺点,有助于在实际应用中作出更合理的内存配置决策。