作者:Wim Coekaerts,Linux 设计主管
日期:2004 年

许多用户已开始从 Red Hat Enterprise Linux 2.1 Advanced Server (RHAS2.1) 向 Red Hat Enterprise Linux 3 (RHEL3) 移植,或正部署一些新的服务器到 RHEL3 上,并且有几个问题。一些大家熟知的特性要么行为发生了一些变化,要么命名或实施发生了变化。我将试着说明 RHAS2.1 的一些更常用的特性连同如何在 RHEL3 中使用他们。

在这篇技术说明中,我将重点讲述使用 Oracle VLM 选项来创建一个大的数据库 buffercache,连同如何使用 hugetlb。

新的内核命名

RHAS2.1 for ia32
2.4.9-e.25 — 单处理器内核
2.4.9-e.25-smp — 能够处理最高达 4GB 的物理内存的 SMP 内核
2.4.9-e.25 — 能够处理最高达 16GB 左右的物理内存的企业 SMP 内核

用户空间能够访问用户空间段的 3GB 左右;内核部分位于其余的 1GB 中(32 位系统上的 4GB 地址空间)。

默认的 SGA 最高可达 1.7GB (共享池和 buffercache)。通过使用 MAPPED_BASE 和将 Oracle 可执行程式和低位附加地址重新链接,有可能创建更大的、最高达 2.7GB 的 SGA。

RHEL3 for ia32
2.4.21-4.EL — 单处理器内核
2.4.21-4.ELsmp — 能够处理最高达 16 GB 的物理内存的 SMP 内核
2.4.21-4.ELhugemem — 能够处理超过 16 GB,最高达 64 GB 的 SMP 内核

和 hugemem 内核的另一个差异是内核和用户空间地址空间被分为 4GB/4GB,这意味着使用 hugemem 内核,用户空间程式能够访问其 4GB 的地址空间。

使用 smp 内核,默认的 SGA 大小和 RHAS2.1 中相同。但是,使用 hugemem 内核,能够创建一个最高达 3.6GB 的 SGA,且无需使用 VLM 选项。

bigpages 和 hugetlb

RHAS2.1 中一个典型的大型服务器部署将使用 bigpages 作为启动参数来预先分配一大块内存,以单独用于共享内存。这些页面拥有一个 2MB 或 4MB 的 TLB 入口,他减少了 TLB 丢失的数量,因此将性能提高了几个百分点。

在 RHAS2.1 中使用 bigpages 的另一个好处是他允许内核 VM 不用过多地担心这部分虚拟内存的记录。而且这些页面不是可分页或可交换的,因此能够确保 Oracle SGA 保留在主物理内存中。

Enterprise Linux 3 用一个称为 hugetlb 的特性取代了 bigpages,在 Linux kernel 2.6 中也有 hugetlb 的一个移植。hugetlb 的工作方式有一些不同。Hugetlb 的行为类似于 bigpages 的行为;页面由大的 TLB 入口支持,不可分页,并且是预先分配的,这意味着一旦您分配了 x 兆字节的 hugetlb 页面,就只能通过利用 SHM_HUGETLB 分配的 hugetlbfs 或 shm 来使用该数量的物理内存。

RHEL3 不再需要启动参数;他是能够动态调整的。在系统启动之后,您能够向 /proc/sys/vm/hugetlb_pool 回送一个值,或您能够将您想要的值放在 /etc/sysctl.conf 中。这个值的单位是兆字节,他能够分配大约 2MB 的页面。您能够在 /proc/meminfo 中看到这些值:

Hugepages_Total:500
Hugepages_Free:500
Hugepagesize:2048k

但是注意,内核需要找到 2MB 的连续物理页面来分配 hugetlb 池。他尽力获取尽可能多的页面,但假如因存在二进制程式正在运行而使得存在大量的碎片,则池分配将可能失败。

想要分配共享内存的程式必须添加一个标记(SHM_HUGETLB)到 shmget() 标记。(Oracle Database 10g 将默认这么做;对于 Oracle9i Database,则需要一个补丁。)这种方式确保 Oracle 共享内存段将在这个池外分配。

VLM 选项

对于 RHEL3,要用 VLM 选项来创建一个很大的 buffercache,有两个选项:

  • 使用 shmfs(就像您在 RHAS2.1 中将做的相同):将一个具备特定大小的 shmfs 加载到 /dev/shm 中,并配置正确的权限。请记住,在 RHEL3 中,shmfs 分配的内存是可分页的。
  • 使用 ramfs:除了页面不是可分页/可交换之外,ramfs 类似于 shmfs。这种方式提供了通常期望的效果。Ramfs 是通过加载 -t ramfs ramfs /dev/shm (先卸载 /dev/shm)来创建的。这里唯一的不同是 ramfs 页面不被大页面支持。
参数 use_indirect_data_buffers=true 保持相同;Oracle 端的配置不一定要改变。