Managing Operating System Resources
本章介绍如何调整操作系统以获得Oracle数据库的最佳性能。
本章包含以下部分:
■了解操作系统性能问题
■解决操作系统问题
■了解CPU
■解决CPU问题
Understanding Operating System Performance Issues
操作系统性能问题通常涉及进程管理,内存管理和调度。如果您调整了Oracle数据库实例并仍然需要提高性能,请验证您的工作或尝试减少系统时间。确保有足够的I / O带宽,CPU功率和交换空间。但是,不要指望进一步调整操作系统会对应用程序性能产生重大影响。 Oracle数据库配置或应用程序中的更改很可能导致操作系统效率的差异比简单调整操作系统更为显着。
例如,如果应用程序遇到过多的缓冲区忙等待,则系统调用的次数会增加。如果通过调整应用程序来减少忙碌等待缓冲区,那么系统调用的次数会减少。
本节涵盖与操作系统性能问题相关的以下主题:
■使用操作系统缓存
■内存使用情况
■使用操作系统资源管理器
Using Operating System Caches使用操作系统缓存
操作系统和设备控制器提供不直接与Oracle数据库缓存管理冲突的数据缓存。尽管如此,这些结构可以消耗资源,同时几乎没有性能优势。当数据库文件存储在Linux或UNIX文件系统中时,这种情况最为明显。默认情况下,所有数据库I / O都通过文件系统缓存。
在某些Linux和UNIX系统上,文件存储可以使用直接I / O。这种安排允许在文件系统内访问数据库文件,绕过文件系统缓存。直接I / O节省CPU资源,并允许文件系统缓存专用于非数据库活动,如程序文本和假脱机文件。
虽然操作系统高速缓存通常是冗余的,因为Oracle数据库缓冲区缓存缓冲区块,但在某些情况下,数据库不会使用数据库缓冲区高速缓存。在这些情况下,使用直接I / O或原始设备可能会产生比使用操作系统缓冲更差的性能。例子包括:
■读取或写入TEMP表空间
■存储在NOCACHE LOB中的数据
■并行查询从机读取数据
----------------------------------------------------------------------------------------------------------------------------------
注意:
在某些情况下,数据库可以将并行查询数据缓存到数据库缓冲区缓存中,而不是直接从磁盘读取到PGA中。 当数据库服务器具有大量内存时,此配置可能适用。 请参阅Oracle数据库VLDB和分区指南以了解更多使用并行执行的信息。
----------------------------------------------------------------------------------------------------------------------------------
您可能想缓存但不是操作系统级别的所有文件。
异步I / O
对于同步I / O,当I / O请求提交给操作系统时,写入过程会阻塞,直到确认写入完成。然后它可以继续处理。使用异步I / O,处理在I / O请求被提交和处理时继续进行。尽可能使用异步I / O以避免瓶颈。
有些平台默认支持异步I / O,其他平台需要特殊配置,有些平台仅支持某些底层文件系统类型的异步I / O。
FILESYSTEMIO_OPTIONS初始化参数
您可以使用FILESYSTEMIO_OPTIONS初始化参数启用或禁用文件系统文件上的异步I / O或直接I / O。该参数是特定于平台的,并且具有最适合特定平台的默认值。
FILESYTEMIO_OPTIONS可以设置为以下值之一:
■ASYNCH:在文件系统文件上启用异步I / O,它没有传输时序要求。
DIRECTIO:在文件系统文件上启用直接I / O,绕过缓冲区缓存。
■SETALL:启用文件系统文件上的异步和直接I / O。
■NONE:禁用文件系统文件上的异步和直接I / O。
限制NFS服务器环境中的异步I / O
在某些NFS服务器环境中,如果在很短的时间内发出大量异步I / O请求,性能可能会受到影响。在这种情况下,使用DNFS_BATCH_SIZE初始化参数通过限制Oracle进程发出的I / O数来提高性能并提高系统的稳定性。
当启用Direct NFS时,DNFS_BATCH_SIZE初始化参数控制可由Oracle前台进程排队的异步I / O的数量。在NFS服务器无法处理大量未完成的异步I / O请求的环境中,Oracle建议将该参数设置为128.然后,您可以根据NFS服务器的性能增加或减少其值。
-----------------------------------------------------------------------------------------------------------------------------------
注意:
DNFS_BATCH_SIZE初始化参数的默认设置为4096.建议值128仅适用于NFS服务器无法处理大量异步I / O请求并检测到严重延迟的系统。
----------------------------------------------------------------------------------------------------------------------------------
内存使用情况
内存使用受缓冲区高速缓存限制和初始化参数的影响。
缓冲区缓存限制
UNIX缓冲区缓存消耗操作系统内存资源。虽然在某些版本的UNIX中,UNIX缓冲区缓存可能会被分配一定量的内存,但现在通常会使用更复杂的内存管理机制。通常,这些将允许空闲内存页面用于缓存I / O。在这样的系统中,操作系统报告工具通常显示没有空闲内存,这通常不是问题。如果进程需要更多内存,通常会释放内存缓存I / O数据以允许分配进程内存。
影响内存使用的参数
任何一个Oracle数据库会话所需的内存取决于许多因素。通常主要的促成因素是:
■打开游标的数量
■PL / SQL使用的内存,例如PL / SQL表
■SORT_AREA_SIZE初始化参数
在Oracle数据库中,PGA_AGGREGATE_TARGET初始化参数可更好地控制会话的内存使用情况。
使用操作系统资源管理器
有些平台提供操作系统资源管理器。这些旨在通过优先访问系统资源来降低峰值负载使用模式的影响。他们通常实施管理政策来管理用户可以访问哪些资源以及每个用户可以使用多少资源。
操作系统资源管理器与域或其他类似的设施不同。域在一个系统内提供一个或多个完全分离的环境。磁盘,CPU,内存和所有其他资源专用于每个域,不能从任何其他域访问。其他类似的设备将系统资源的一部分完全分离到不同的区域,通常是分开的CPU或内存区域。与域一样,单独的资源区域仅专用于分配给该区域的处理;进程无法跨越边界进行迁移。与域不同,所有其他资源(通常是磁盘)都被系统上的所有分区访问。
只要分区内存(RAM)资源的分配是固定的,而不是动态的,Oracle数据库就可以在域内运行,而在其他不太完整的分区结构内运行。
操作系统资源管理器优先考虑全局资源池(通常是域或整个系统)内的资源分配。进程被分配给组,而组又被分配资源池中的任何地方的资源。
--------------------------------------------------------------------------------------------------------------------------------
注意:
Oracle数据库不支持与任何UNIX操作系统资源管理器的内存管理和分配工具一起使用。在Oracle数据库实例中提供资源分配功能的Oracle数据库资源管理器不能与任何操作系统资源管理器一起使用。
注意:
如果节点上有多个实例,并且您希望在它们之间分配资源,则应将每个实例分配给专用的操作系统资源管理器组或管理实体。要在托管实体中运行多个实例,请使用实例锁定来管理托管实体中的CPU资源如何在实例之间分配。当Oracle数据库资源管理器管理CPU资源时,它需要为该实例提供固定数量的CPU资源。如果没有实例锁定,它希望可用的CPU资源等于管理实体中的CPU数量。通过实例锁定,它期望可用的CPU资源等于CPU_COUNT初始化参数的值。如果CPU资源比预期的要少,那么Oracle数据库资源管理器在执行资源计划中的资源分配时效果不佳。
----------------------------------------------------------------------------------------------------------------------------------
解决操作系统问题
本部分通过解释以下主题提供调整各种系统的提示:
■基于UNIX的系统上的性能提示
■Windows系统上的性能提示
■HP OpenVMS系统的性能提示
熟悉特定于平台的问题,以便了解操作系统提供的性能选项。
基于UNIX的系统的性能提示
在UNIX系统上,尝试在操作系统完成系统调用和执行进程调度的时间与应用程序运行的时间之间建立良好的比例。目标应该是在应用程序模式下运行大部分时间,也称为用户模式,而不是系统模式。
每种模式花费的时间比例只是潜在问题的一个症状,可能涉及以下几点:
■分页或交换
■执行太多操作系统调用
■运行的进程太多
如果存在这样的条件,那么应用程序运行的时间就会减少。从操作系统方面释放的时间越多,应用程序可执行的事务就越多。
Windows系统上的性能提示
在Windows系统上,与基于UNIX的系统一样,在应用程序模式下的时间与系统模式下的时间之间建立适当的比率。您可以使用Windows管理性能工具轻松监视许多因素:CPU,网络,I / O和内存都显示在同一图表上,以帮助您避免这些方面的瓶颈。
HP OpenVMS系统的性能提示
考虑大型机上的分页参数,并记住Oracle数据库可以利用非常大的工作集。
HP OpenVMS环境中的可用内存实际上是未映射到任何操作系统进程的内存。在繁忙的系统中,空闲内存可能包含属于一个或多个当前活动进程的页面。发生该访问时,将发生软页面错误,并将该页面包含在该进程的工作集中。如果该进程无法扩展其工作集,则该进程当前映射的其中一个页面必须移至自由集。
任何数量的进程都可能在其工作集中包含共享内存页面。工作集的大小总和可以明显地超过可用内存。当Oracle服务器运行时,SGA,Oracle数据库内核代码和Oracle Forms运行时可执行文件通常都是可共享的,并且可能占访问页面的80%或90%。
了解CPU
要解决CPU问题,首先要确定系统应该使用的CPU资源数量的适当期望值。然后,确定是否有足够的CPU资源可用,并确定您的系统何时耗费太多资源。首先确定在以下三种情况下Oracle数据库实例在系统中使用的CPU资源量:
■只有少量的Oracle数据库和非Oracle活动存在时,系统处于空闲状态
■系统在平均工作负载下
■工作负载高峰期的系统
您可以使用自动工作量存储库,Statspack或UTLBSTAT / UTLESTAT实用程序捕获各种工作负载快照。操作系统实用程序(例如UNIX上的vmstat,sar和iostat以及Windows上的管理性能监视工具)可以与自动工作量存储库,Statspack或相同的时间间隔一起与V $ OSSTAT或V $ SYSMETRIC_HISTORY视图一起使用UTLBSTAT / UTLESTAT提供免费的整体统计数据。
评估系统的CPU利用率时,工作负载是一个重要因素。在工作负载高峰时段,90%的CPU利用率和10%的空闲和等待时间可以接受。在工作量低的时候,即使使用率达到30%也是可以理解的。但是,如果您的系统在正常工作负载下显示高利用率,那么高峰工作量没有余地。例如,图9-1说明了在上午10:00和下午2:00有高峰期的应用程序随时间的工作负载。
这个示例应用程序有100个用户每天工作8小时。每5分钟输入一笔交易的每个用户每天转换成9,600笔交易。在8小时内,系统必须支持每小时1,200笔交易,平均每分钟交易20笔交易。如果需求率不变,那么你可以建立一个系统来满足这个平均工作量。
但是,使用模式并不是恒定的,在这种情况下,每分钟20个事务可以被理解为仅仅是最低要求。如果您需要达到的峰值速度是每分钟120个事务,那么您必须配置一个可支持此峰值工作负载的系统。
对于此示例,假设在工作负载高峰期,Oracle数据库使用90%的CPU资源。对于一段平均工作量,Oracle数据库使用不超过可用CPU资源的15%,如以下等式所示:
20 tpm / 120 tpm * 90%=可用CPU资源的15%
其中tpm是一分钟的交易。
如果系统需要50%的CPU资源达到20 tpm,则存在一个问题:系统无法使用90%的CPU每分钟实现120个事务。但是,如果您调整此系统以使其仅使用15%的CPU达到20 tpm,那么假设线性可扩展性,则系统可能会使用90%的CPU资源每分钟实现120个事务。
随着用户被添加到应用程序中,工作负载可能会上升到之前的峰值水平。新的峰值速率没有更多的CPU容量可用,这实际上比以前更高。
解决CPU问题
您可以通过以下方式解决CPU容量问题
■按照第9-8页上的“查找和调整CPU使用率”中的说明检测并解决过度使用CPU问题。
■按照第9-10页上的“使用Oracle数据库资源管理器管理CPU资源”中所述,通过使用Oracle数据库资源管理器优先分配CPU资源分配来降低峰值负载使用模式的影响。
■如第9-11页上的“使用实例屏蔽管理CPU资源”中所述,使用实例屏蔽限制数据库实例在多CPU系统上运行多个数据库实例时可同时使用的CPU数量。
■增加硬件容量并改进系统架构,如第2-5页的“系统架构”中所述。
查找和调整CPU利用率
系统上运行的每个进程都会影响可用的CPU资源。 因此,调整非数据库因素也可以提高数据库性能。
使用V$OSSTAT或V$SYSMETRIC_HISTORY视图来监视操作系统中的系统利用率统计信息。 V $OSSTAT和V$SYSMETRIC_HISTORY中包含的有用统计信息包括:
■CPU数量
■CPU利用率
■负载
■寻呼
■物理内存
您可以使用操作系统监视工具来确定整个系统上运行哪些进程。如果系统负载过重,请检查本节稍后介绍的内存,I / O和进程管理区域。
您可以在许多基于UNIX的系统上使用sar -u等工具来检查系统上CPU利用率的级别。在UNIX中,统计信息显示用户时间,系统时间,空闲时间和等待I / O的时间。如果在正常或低工作负载下,等待I / O的空闲时间和时间都接近于零(小于5%),则存在CPU问题。
在Windows上,您可以使用管理性能工具来监视CPU利用率。此实用程序提供有关处理器时间,用户时间,特许时间,中断时间和DPC时间的统计信息。
本节包含与检查系统CPU使用率有关的以下主题:
■检查内存管理
■检查I / O管理
■检查网络管理
■检查过程管理
检查内存管理
检查以下内存管理区域:
■分页和交换
■超大页面表
分页和交换
使用V $ OSSTAT视图,UNIX上的sar或vmstat等实用程序或Windows上的管理性能工具来调查分页和交换的原因。
超大页面表
在UNIX上,如果处理空间变得太大,则可能导致页表变得太大。这在Windows系统上不是问题。
检查I / O管理
Thrashing是一个I / O管理问题。确保您的工作负载适合内存,因此计算机不会发生颠簸(交换和分页进程和内存不足)。操作系统分配CPU资源可用于您的进程的固定时间部分。如果该过程在每个时间段检查中浪费了很大一部分时间以确保其可以运行并确保所有必要的组件都在计算机中,那么该过程可能仅使用分配的50%的时间来实际执行工作。
检查网络管理
检查客户端/服务器往返。处理消息时有开销。当应用程序生成许多需要通过网络发送的消息时,发送消息的延迟可能导致CPU过载。为了缓解这个问题,捆绑多个消息而不是执行大量的往返行程。例如,您可以使用数组插入,数组提取等。
检查过程管理
应该检查本节中讨论的几个过程管理问题。
调度和切换
操作系统可能会花费过多的时间安排和切换过程。检查您使用操作系统的方式,因为可能有太多的进程正在使用中。在Windows系统上,请勿使用太多的非数据库进程重载服务器。
上下文切换
由于操作系统特定的特性,您的系统可能会花费大量时间在上下文切换中。上下文切换可能很昂贵,特别是对于大型SGA。 Windows上的上下文切换不是问题,每个实例只有一个进程。所有线程共享相同的页面表。
Oracle数据库具有多种用于上下文切换的功能
■等待后驱动程序
Oracle流程必须能够发布另一个Oracle流程(给它一个消息),并且必须能够等待发布。例如,前台进程可能需要发布LGWR,告诉它将所有块写出到给定点,以便它可以确认提交。
通常这种等待后机制是通过UNIX信号量实现的,但这些可能是资源密集型的。因此,一些平台提供了一个后等待驱动程序,通常是内核设备驱动程序,它是实现等待后接口的轻量级方法。
■内存映射系统定时器
Oracle数据库通常需要查询系统时间以获取时间信息。这可能涉及操作系统调用,导致相对昂贵的上下文切换。某些平台实现了一个内存映射计时器,该计时器使用进程虚拟地址空间中的地址来包含当前时间信息。从这个内存映射定时器中读取时间比系统调用的上下文切换开销要便宜。
■列出I / O接口以在一次调用中提交多个异步I / O
列表I / O是一个应用程序编程接口,允许在单个系统调用中提交多个异步I / O请求,而不是通过单独的系统调用提交多个I / O请求。此功能的主要优点是减少所需的上下文切换次数。
启动新的操作系统进程
启动新操作系统流程的成本很高。开发人员通常会创建一个单一目的进程,退出进程,然后创建一个新进程。这种技术每次都会重新创建和销毁进程,消耗过多的CPU,特别是在拥有大型SGA的应用程序中。 CPU需要每次构建页表。当您锁定或锁定共享内存时,问题会加剧,因为您必须访问每个页面。
例如,如果您有1 GB的SGA,则每4 KB可能有页表项,并且页表项可能为8个字节。您可能会以(1 GB / 4 KB)* 8字节条目结束。这变得很昂贵,因为你需要不断确保页面表被加载。
Managing CPU Resources Using Oracle Database Resource Manager
Oracle数据库资源管理器通过以下方式在数据库用户和应用程序之间分配和管理CPU资源:
■防止CPU饱和
如果CPU以100%运行,则可以使用Oracle数据库资源管理器为每个使用者组中的会话分配最大数量的CPU。此功能可以确保高优先级会话可以立即运行并降低低优先级会话的CPU消耗。
■限制用户组的CPU使用率
您可以使用资源管理器指令max_utilization_limit对用户组可以使用的CPU的百分比进行硬性限制。此功能可限制低优先级会话的CPU消耗,并可帮助为使用者组中的工作负载提供更一致的性能。
■限制失控查询造成的损失
从Oracle数据库11g第2版(11.2.0.2)开始,Oracle数据库资源管理器可以通过限制呼叫的最大执行时间或将长时间运行的查询移动到优先级较低的使用者组,限制失控查询造成的损害。
■限制消费者组的并行声明活动
从Oracle数据库11g第2版(11.2.0.2)开始,您可以使用Resource Manager指令parallel_target_percentage来防止一个使用者组垄断所有并行服务器。数据库将排队并行语句,如果它们会导致超出此限制。
例如,假设目标并行服务器数量为64,并且使用者组ETL将此指令设置为50%。如果使用者组ETL使用30个并行服务器,并且如果新并行语句需要4个并行服务器,则数据库将对该语句进行排队。
使用实例封套管理CPU资源
在单个系统上运行多个数据库实例时,这些实例将争夺CPU资源。一个资源密集型数据库实例可能会显着降低其他实例的性能。为避免此问题,可以使用实例锁定来限制每个实例可以使用的CPU数量。 Oracle数据库资源管理器会根据您为实例设置的资源计划在各种数据库会话中分配CPU,从而最大限度地降低实例成为CPU限制的可能性。