从InnoDB的默认数据页大小到Linux 系统默认页大小

571 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

从InnoDB的默认数据页大小到Linux 系统默认页大小

提出问题

首先我们知道,InnoDB每个页的大小可能是2KB、4KB、8KB、16KB,在MySQL5.7版本的默认情况下,InnoDB每页的大小为16KB,那么我提出一个问题,为什么InnoDB每页的默认大小为16KB呢?

遇到一些给定的默认情况,我们要经常问自己,为什么这么设计?

从MySQL的作用可知,MySQL是要频繁的与硬盘进行交互的,而与硬盘打交道就要借助操作系统,一般情况下,咱们的MySQL是部署在Linux系统的服务器上的,因此咱们来看看Linux系统读取磁盘数据时使用多大的数据页。

Linux系统默认页大小

32位操作系统下,Linux 系统默认页大小为4KB

64位操作系统下,Linux系统默认页大小为8KB

众所周知,Linux系统以页为单位管理内存,无论是将磁盘中的数据加载到内存中,还是将内存中的数据写回磁盘,操作系统都会以页为单位进行操作,哪怕我们只向磁盘中写入一个字节的数据,Linux操作系统也需要将整个页面中的全部数据刷入到磁盘中。

我们从4KB入手,来探索一下为什么默认页是4KB。

为了理解页设置的原理,我们先要理解页表的概念。

每个Linux进程能够看到的都是独立的虚拟内存空间,虚拟内存空间只是逻辑上的概念,进程仍然需要访问虚拟内存对应的物理内存,从虚拟内存到物理内存的转换就需要使用每个进程持有页表

同一CPU架构下,操作系统的虚拟地址空间大小都是一定的,整片虚拟地址空间被均匀分成了 N 个大小相同的内存页,所以内存页的大小最终会决定每个进程中页表项的层级结构和具体数量,虚拟页的大小越小,单个进程中的页表项和虚拟页也就越多。

由此可知页表项数目由虚拟内存大小及页大小决定

  • 过小的页面大小会带来较大的页表项,增加寻址时 TLB(Translation lookaside buffer)的查找速度和额外开销,正常情况下可能四层页表结构即可,但在小页面情况下,可能会需要五到六层页表结构;
  • 过大的页面大小会浪费内存空间,造成内存碎片,降低内存的利用率,即使某进程使用某一逻辑页中的1KB,但也要开一整个页面给它,形成内存碎片。

MySQL默认页大小

回到最开始的问题,为什么MySQL默认页要设计为16KB,从操作系统角度来理解,本文认为,设置MySQL默认页大小为操作系统默认页大小的倍数,在操作IO的时候会十分的便利,性能也更好,比如MySQL一次读16KB(实际上不是如此,此处为假设),那么只需要告诉操作系统,我要读4张4KB的页就好了。