【云和恩墨】性能优化:Linux环境下匼理配置大6g内存条怎么设置页(HugePage)
PC Server发展到今天在性能方面有着长足的进步。64位的CPU在数年前都已经进入到寻常的家用PC之中更别说是更高端的PC Server;在Intel和AMD两大处理器巨头的努力下,x86 CPU在处理能力上不断提升;同时随着制造工艺的发展在PC Server上能够安装的6g内存条怎么设置容量也越来越大,現在随处可见数十G6g内存条怎么设置的PC Server正是硬件的发展,使得PC
Server的处理能力越来越强大性能越来越高。而在稳定性方面搭配PC Server和Linux操作系统,同样能够满重要业务系统所需要的稳定性和可靠性当然在成本方面,引用一位在行业软件厂商的网友的话来说“如果不用PC Server改用小型機,那我们赚什么钱啊”。不管从初期的购买运行期的能耗和维护成本,PC
Server都比相同处理能力的小型机便宜很多正是在性能和成本这兩个重要因素的影响下,运行在PC Server上的数据库越来越多笔者所服务的一些客户,甚至把高端的PCServer虚拟化成多台机器在每台虚拟机上跑一套Oracle數据库,这些数据库不乏承载着重要的生产系统
Server上运行Oracle数据库,最适合的操作系统无疑是Linux作为与UNIX极为类似的操作系统,在稳定性、可靠性和性能方面有着与UNIX同样优异的表现但是Linux在6g内存条怎么设置分页处理机制上与AIX、HP-UX等操作系统相比有一个明显的缺陷,而这个缺陷在使鼡较大SGA的Oracle数据库上体现尤为明显严重时对数据库性能有着显著的负面影响,甚至会导致数据库完全停止响应而本文就将从一个案例来詳述这种缺陷,并使用Linux下的大6g内存条怎么设置页来解决这一问题
Server都关闭之后,数据库服务器的CPU利用率在数分钟之内都一直是100%然后逐渐丅降,大约需要经过20分钟才会下降到正常的空闲状态因为这个时候所有的应用都已经关闭,只有非常低的CPU利用率才是正常的状态据这套系统的数据库维护人员反映,这种情况已经出现多次就算是重启数据库之后,过不了一两天这样的故障同样会出现。同时这套系统朂近也没做过大的变动
笔者在接到接到故障报告后,通过SSH连接到数据库数据库都非常慢需要差不多1分钟才能连接上去。先简单的看一丅服务器的性能状况发展IO极低、6g内存条怎么设置剩余还比较多,至少还有1GB以上也没有page in / page
out。而最显著的现象就是CPU利用率相当地高一直保歭在100%,同时CPU利用率的SYS部分均在95%以上。而操作系统运行队列也一直在200以上服务器6g内存条怎么设置的使用情况如下:
从现象上看,SYS CPU高是分析问题的一个重要线索
在以最快的速度了解了一下操作系统层面的性能情况之后,立即通过Sqlplus连接到数据库查看数据库内部的性能信息:(注:以下数据关于SQL、服务器名称、数据库名称等相关信息经过处理。)
...为节省篇幅省略部分内容...
从数据库中的活动以及等待事件来看,并没有太大的异常值得注意的是,在数据库服务器CPU利用率长期在100%或物理6g内存条怎么设置耗尽并伴有大量的交换6g内存条怎么设置换入換出时,需要仔细地诊断数据库中的性能现象比如某类较多的等待事件,是由CPU或6g内存条怎么设置不足导致的结果还是因为这些数据库中嘚特定的活动才是Root Cause引起CPU过高或6g内存条怎么设置耗尽
从上面的数据来看,活动会话并不是特别多不到50个,加上后台进程的数量与操作系统中高达200的运行相比,存在不小的差异数据库中主要有三类的非空闲等待事件,IO相关的等待如db file sequential readdatabase link相关的SQL*Net more data from dblink以及latch
相关的等待事件。在这三類种通常只有latch这类等待事件才会引起CPU的利用率增加。
通过分析对比AWR报告在故障期间和正常期间,从数据库活动来说没有特别明显的差异。但是在系统统计上差异较大:
上面的数据中,是来自于包含故障时间段的1小时(1st)和正常时间段1小时(2nd)的AWR的对比数据对于故障分析来說,特别是故障时间比较短的情况下1小时的AWR报告会不够准确地反映故障期间的性能情况。但是我们在Trouble
Shooting之时首要的是需要从各种数据中,确定方向正如前面提到,SYS部分的CPU利用率过高是一个很重要的线索而数据库内部的其他性能数据相差不大的情况下,可以先从CPU这一点著手
操作系统中CPU使用分析
那么,在操作系统中SYS和USER这两个不同的利用率代表着什么?或者说二者有什么区别
简单来说,CPU利用率中的SYS部汾指的是操作系统内核(Kernel)使用的CPU部分,也就是运行在内核态的代码所消耗的CPU最常见的就是系统调用(SYS CALL)时消耗的CPU。而USER部分则是应用软件自巳的代码使用的CPU部分也就是运行在用户态的代码所消耗的CPU。比如Oracle在执行SQL时从磁盘读数据到db buffer
cache,需要发起read调用这个read调用主要是由操作系統内核包括设备驱动程序的代码在运行,因此消耗的CPU计算到SYS部分;而Oracle在解析从磁盘中读到的数据时则只是Oracle自己的代码在运行,因此消耗嘚CPU计算到USER部分
那么SYS部分的CPU主要会由哪些操作或是系统调用产生呢:
1. I/O操作,比如读写文件、访问外设、通过网络传输数据等这部分操作┅般不会消耗太多的CPU,因为主要的时间消耗会在IO操作的设备上比如从磁盘读文件时,主要的时间在磁盘内部的操作上而消耗的CPU时间只占I/O操作响应时间的少部分。只有在过高的并发I/O时才可能会使SYS CPU有所增加
2. 6g内存条怎么设置管理,比如应用进程向操作系统申请6g内存条怎么设置操作系统维护系统可用6g内存条怎么设置,交换空间换页等其实与Oracle类似,越大的6g内存条怎么设置越频繁的6g内存条怎么设置管理操作,CPU的消耗会越高
3. 进程调度。这部分CPU的使用在于操作系统中运行队列的长短,越长的运行队列表明越多的进程需要调度,那么内核的負担也就越高
4. 其他,包括进程间通信、信号量处理、设备驱动程序内部一些活动等等
从系统故障时的性能数据来看,6g内存条怎么设置管理和进程调度这两项可能是引起SYS CPU很高的原因但是运行队列高达200以上,很可能是由于CPU利用率高导致的结果而不是因为运行队列高导致叻CPU利用率高。从数据库里面来看活动会话数不是特别高那么接下来,需要关注是否是由于系统6g内存条怎么设置管理方面的问题导致了CPU利鼡率过高
回顾本文开始部分收集的/proc/meminfo中系统6g内存条怎么设置方面数据,可以发现一项重要的数据:
从数据可以看到PageTables6g内存条怎么设置达到叻4637MB。PageTables在字面意思上是指“页面表”简单地说,就是操作系统内核用于维护进程线性虚拟地址和实际物理6g内存条怎么设置地址对应关系的表格
现代计算机对于物理6g内存条怎么设置,通常是将其以页(Page Frame)为单位进行管理和分配在
x86处理器架构上,页面大小为4K运行在操作系统上嘚进程,可访问的地址空间称为虚地址空间跟处理器位数有关。对于32位的x86处理器进程的可访问地址空间为4GB。在操作系统中运行的每一個进程都有其独立的虚地址空间或线性地址空间,而这个地址空间同样也是按页(Page)进行管理在Linux中,页大小通常为4KB进程在访问6g内存条怎麼设置时,由操作系统和硬件配合负责将进程的虚拟地址转换成为物理地址。两个不同的进程其相同的虚拟线性地址,指向的物理6g内存条怎么设置可能相同,比如共享6g内存条怎么设置;也可能不同比如进程的私有6g内存条怎么设置。
下图是关于虚拟地址和物理6g内存条怎么设置对应关系的示意图:
假设有两个进程A、B分别有一个6g内存条怎么设置指针指向的地址为0x12345(0x表示16进制数),比如一个进程fork或clone出另一個进程那么这2个进程就会存在指向相同6g内存条怎么设置地址的指针的情况。进程在访问0x12345这个地址指向的6g内存条怎么设置时操作系统将這个地址转换为物理地址,比如A进程为0x23456B进程为0x34567,二者互不影响那么这个物理地址是什么时候得来?对于进程私有6g内存条怎么设置(大蔀分情况均是如此)来说是进程在向操作系统请求分配6g内存条怎么设置时得来。进程向操作系统请求分配6g内存条怎么设置时操作系统將空闲的物理6g内存条怎么设置以Page为单位分配给进程,同时给进程产生一个虚拟线程地址在虚拟地址和物理6g内存条怎么设置地址之间建立
映射关系,这个虚拟地址作为结果返回给进程
Page Table(页表)就是用于操作系统维护进程虚拟地址和物理6g内存条怎么设置对应关系的数据结构。下图是一个比较简单情况下的Page Table示意图:
下面简单地描述在32位系统下页大小为4K时,操作系统是如何为进程的虚拟地址和实际物理地址之間进行转换的
1. 目录表是用于索引页表的数据结构,每个目录项占32位即4字节,存储一个页表的位置目录表刚好占用1页6g内存条怎么设置,即4KB可以存储1024个目录项,也就是可以存储1024个页表的位置
2. 页表项(Page Table Entry)大小为4字节,存储一个物理6g内存条怎么设置页起始地址每个页表同樣占用4K6g内存条怎么设置,可以存储1024个物理6g内存条怎么设置页起始地址由于物理6g内存条怎么设置页起始地址以4KB为单位对齐,所以32位中只需要20位来表示地址,其他12位用于其他用途比如表示这16g内存条怎么设置页是只读还是可写等等。
3. 1024个页表每个页表1024个物理6g内存条怎么设置頁起始地址,合计就是1M个地址每个地址指向的物理6g内存条怎么设置页大小为4KB,合计为4GB
操作系统及硬件将虚拟地址映射为物理地址时,將虚拟地址的31-22这10位用于从目录项中索引到1024个页表中的一个;将虚拟地址的12-21这10位用于从页表中索引到1024个页表项中的一个从这个索引到的页表项中得到物理6g内存条怎么设置页的起始地址,然后将虚拟地址的0-11这12位用作4KB6g内存条怎么设置页中的偏移量那么物理6g内存条怎么设置页起始地址加上偏移量就是进程所需要访问的物理6g内存条怎么设置的地址。
再看看目录表和页表这2种数据结构占用的空间会有多少目录表固萣只有4KB。而页表呢由于最多有1024个页表,每个页表占用4KB因此页表最多占用4MB6g内存条怎么设置。实际上32位Linux中的进程通常不会那么大的页表進程不可能用完所有的4GB大小地址空间,甚至有1GB虚拟地址空间分给了内核同时Linux不会为进程一次性建立那么大的页表,只有进程在分配和访問6g内存条怎么设置时操作系统才会为进程建立相应地址的映射。
这里只描述了最简单情况下的分页映射实际上页表目录连同页表一共囿四级。同时在32位下启用PAE或64位系统其页表结构比上面的示意图更复杂。但无论怎么样最后一级即页表的结构是一致的。在64位系统中Page
Table(页表)中的页表项,与32位相比大小从32位变为64位。那么这会有多大的影响假如一个进程,访问的物理6g内存条怎么设置有1GB即262144个6g内存条怎么设置页,在32位系统中页表需要/MB,而在64位系统下页表占用的空间增加1倍,即为2MB那再看看对于Linux系统中运行的Oracle数据库,又是怎么样一番情景本文案例中数据库的SGA大小12GB,如果一个OracleProcess访问到了所有的SGA6g内存条怎么设置那么其页表大小会是24MB,这是一个惊人的数字这里忽略掉PGA,因为平均下来每个进程的PGA不超过2M与SGA相比实在太小。从AWR报告来看有300个左右的会话,那么这300个连接的页表会达到7200MB只不过并不是每个进程都会访问到SGA中所有的6g内存条怎么设置。而从meminfo查看到的Page
系统中显然不会只有Page Table这唯一的6g内存条怎么设置管理数据结构还有其他一些数据结構用于管理6g内存条怎么设置。这些过大的6g内存条怎么设置管理结构无疑会大大增加操作系统内核的负担和对CPU的消耗。而在负载变化或其怹原因导致6g内存条怎么设置需求大幅变化比如多进程同时申请大量的6g内存条怎么设置,可能引起CPU在短时间内达到高峰从而引起问题。
使用大6g内存条怎么设置页来解决问题
虽然没有确实的证据也没有足够长的时间来收集足够的证据来证明是过大的Page Table导致了问题,那需要面臨多次半小时以上的系统不可用故障但是从目前来看,这是最大的可疑点因此,决定先使用大6g内存条怎么设置页来调优系统的6g内存条怎么设置使用
使用大6g内存条怎么设置页有哪些好处:
2. Huge Page6g内存条怎么设置只能锁定在物理6g内存条怎么设置中,不能被交换到交换区这样避免了交换引起的性能影响。
3. 由于页表数量的减少使得CPU中的TLB(可理解为CPU对页表的CACHE)的命中率大大提高。
Table的大小实际上这里可以反映出Linux在汾页处理机制上的缺陷。而其他操作系统比如AIX,对于共享6g内存条怎么设置段这样的6g内存条怎么设置进程共享相同的页表,避免了Linux的这種问题像笔者维护的一套系统,连接数平常都是5000以上实例的SGA在60GB左右,要是按Linux的分页处理方式系统中大部分6g内存条怎么设置都会被页表给用掉。
那么怎么样为Oracle启用大6g内存条怎么设置页(Huge Page)?以下是实施步骤由于案例中涉及的数据库在过一段时间后将SGA调整为了18G,这里就以18G為例:
HugePages Total表示系统中配置的大6g内存条怎么设置页页面数HugePages Free表示没有访问过的大6g内存条怎么设置页面数,这里free容易引起误解这在稍后有所解釋。HugePages Rsvd表示已经分配但是还未使用的页面数Hugepagesize表示大6g内存条怎么设置页面大小,这里为2MB注意在有的内核配置中可能为4MB。
1. 计划要设置的6g内存條怎么设置页数量到目前为止,大6g内存条怎么设置页只能用于共享6g内存条怎么设置段等少量类型 的6g内存条怎么设置一旦将物理6g内存条怎么设置用作大6g内存条怎么设置页,那么这些物理6g内存条怎么设置就不能用作其他用途比如作为进程的私有6g内存条怎么设置。因此不能將过多的6g内存条怎么设置设置为大6g内存条怎么设置页我们通常将大6g内存条怎么设置页用作Oracle数据库的SGA,那么大6g内存条怎么设置页数量:
-m命囹查看共享6g内存条怎么设置段的大小可以看到共享6g内存条怎么设置段的大小实际上比SGA_MAX_SIZE约大。如果服务器上有多个Oracle实例需要为每个实例栲虑共享6g内存条怎么设置段多出的部分,即N值会越大另外,Oracle数据库要么全部使用大6g内存条怎么设置页要么完全不使用大6g内存条怎么设置页,因此不合适的HugePages_Total将造成6g内存条怎么设置的浪费
然后执行sysctl –p命令,使配置生效
这里vm.nr_hugepages这个参数值为第2步计算出的大6g内存条怎么设置页數量。然后检查/proc/meminfo如果HugePages_Total小于设置的数量,那么表明没有足够的连续物理6g内存条怎么设置用于这些大6g内存条怎么设置页需要重启服务器。
這里设定oracle用户可以锁定6g内存条怎么设置的大小 以KB为单位。
然后重新以oracle用户连接到数据库服务器使用ulimit -a命令,可以看到:
-a查看所有系统参數也没有找到vm.nr_hugepages这个参数这是由于Linux内核没有编译进HugePage这个特性。我们需要使用其他的内核来启用HugePage
发现这个系统使用的内核带有"xen"字样,我们修改这个文件将default=0改为default=2,或者将前面2种内核用#号屏蔽掉然后重启数据库服务器,发现新的内核已经支持HugePage
数据库启用大6g内存条怎么设置頁之后,本文描述的性能问题甚至是在增大了SGA的情况下也没有出现观察/proc/meminfo数据,PageTables占用的6g内存条怎么设置一直保持在120M以下与原来相比,减尐了4500MB据观察,CPU的利用率也较使用HugePages之前有所下降而系统运行也相当地稳定,至少没有出现因使用HugePage而产生的BUG
测试表明,对于OLTP系统来说茬运行Oracle数据库的Linux上启用HugePage,数据库处理能力和响应时间均有不同程度的提高最高甚至可以达到10%以上。
本文以一个案例介绍了Linux操作系统下夶6g内存条怎么设置页在性能提升方面的作用,以及如何设置相应的参数来启用大6g内存条怎么设置页在本文最后,笔者建议在Linux操作系统中運行Oracle数据库时启用大6g内存条怎么设置页来避免本文案例遇到的性能问题,或进一步提高系统性能可以说,HugePage是少数不需要额外代价就能提升性能的特性另外值得高兴的是,新版本的Linux内核提供了Transparent
Huge Pages以便运行在Linux上的应用能更广泛更方便地使用大6g内存条怎么设置页,而不仅仅昰只有共享6g内存条怎么设置这类6g内存条怎么设置才能使用大6g内存条怎么设置页对于这一特性引起的变化,让我们拭目以待