剑客
关注科技互联网

IBM Power Systems 上的 MongoDB 调优指南

MongoDB 是一个面向文档的 NoSQL 数据库,能在使用默认环境的 IBM® Power Systems™ 上高效运行。但是,您可以通过调优一些环境设置,在 Power Systems 上实现最佳性能,本文将介绍这些调优方法。

系统级调优

  • 超频、磁盘调优、CPU 绑定、内存关联

使用 PowerKVM 的虚拟化级调优

  • 主机调优:超频、磁盘调优
  • 来宾调优:内存关联、数据磁盘直通、网络外围组件互联 (PCI) 直通、CPU 解锁

应用程序级调优

  • Java 调优:大页面、堆大小、垃圾收集线程、压缩引用
  • 分片/集群调优

本文中的指南源自对 Yahoo!Cloud Serving Benchmark (YCSB)
工作负载和其他客户概念证明 (POC) 工作负载的测试。每个客户端工作负载都有不同的需求。请仅使用这些建议作为指导;您需要根据计划部署的实际工作负载来调整具体的调优需求。

系统级调优

除非另行说明,以下指南适合在 Linux on Power 上运行的所有 MongoDB 工作负载。

频率

本节将介绍如何设置频率来超频。

  • 在裸机环境中,CPU 能源调节器由操作系统 (OS) 控制。
    • 使用 cpupower

      命令验证和设置频率,如下所示:

      cpupower -c 0-159 frequency-info

      cpupower -c 0-159 frequency-set -g performance

  • 在 IBM PowerVM™ 环境中,使用硬件管理控制台 (HMC) 设置想要的性能:
    1. 登录到 ASM (Advanced System Management)。
    2. 展开 System Configuration
      -> Power Management
    3. 单击 Power Mode Setup
      -> Enable Dynamic Power Save (favor performance) mode
    4. 单击 Continue
    5. 单击 Save Settings

同时多线程 (SMT)

使用 SMT,您可以在同一个核心上同时运行多个线程的指令流。在基于 IBM POWER8® 处理器的服务器上,SMT8 是默认设置,大部分工作负载都能使用此默认设置高效地运行。对于数据库,将 SMT 设置为 SMT8 模式被视为一种最佳实践。

可使用 ppc64_cpu
命令将 SMT 模式设置为 8、4 或 2,如下所示:

  • SMT8: ppc64_cpu –smt=on
  • SMT4: ppc64_cpu –smt=4
  • SMT2: ppc64_cpu –smt=2

ulimit

对于 ulimit 设置,可使用 MongoDB 管理指南
中的建议。

磁盘调优

对于内部存储:

  • 使用磁盘簇 (JBOD),使用 iprconfig
    命令来格式化驱动器。可在以下地址找到 iprconfig 实用程序的更多细节: https://www.ibm.com/support/knowledgecenter/HW4L4/p8ebk/starting_iprconfig.htm
  • 使用以下设置打开写磁盘缓存,其中 x

    是磁盘编号:

    sdparm–set=WCE /dev/sdx

  • 对于生产工作负载,您可能需要使用固态硬盘 (SSD) 来满足工作负载的每秒输入/输出操作次数 (IOPS) 需求。

对于外部存储:

对于客户工作负载,可使用独立磁盘冗余阵列 (RAID) 保护。使用 RAID0 执行基准测试。您应确定最适合您的特定环境的 RAID 级别。

内存关联和 CPU 绑定

  • 内存关联在使用 PowerVM 时非常重要。有关内存关联的更多信息,请查阅以下 IBM Redbooks® 中的 “第 3 章. IBM POWER Hypervisor”: 包括 IBM POWER8 在内的 IBM Power Systems 处理器的性能优化和调优技术
  • 将运行的基准测试进程固定到特定核心。
  • 要在创建虚拟机 (VM) 时避免非一致性内存存取 (NUMA) 镜像,可将内存限制到单个芯片或节点。
  • 在生产环境中不推荐 CPU 绑定,但对于基准测试概念证明,可使用 taskset
    命令执行 CPU 绑定。例如,要在拥有 10 个核心(80 个逻辑 CPU)的 CPU 的第一个插槽上运行 MongoDB,可使用以下命令:
    taskset –c 0-79 numactl –localalloc  mongod --config /home/mongoDB/test/mongodb.conf

虚拟化级调优

在虚拟化环境中运行 MongoDB 时,以下指南描述了如何配置实际服务器(主机)和虚拟机(来宾)。

主机调优

来宾调优

以下来宾调优指南将会介绍应如何配置每个虚拟机。

内存关联

除非另行说明,以下建议适合 PowerKVM 3.1 以前的 IBM PowerKVM® 环境。

  • 使用 PowerVM 时,可使用动态平台优化器 (DPO) 工具。有关更多信息,请查阅 IBM Redbooks 包括 IBM POWER8 在内的 IBM Power Systems 处理器的性能优化和调优技术
  • 基于 POWER8 处理器的服务器包含多个芯片或插槽。根据工作负载的 CPU 和内存需求,一种最佳实践是将来宾限制在芯片或插槽边界内。下面的示例展示了如何将来宾限制在一个拥有 4 个节点的 IBM Power® System S822L 主机上的一个插槽上:
    ...
    numactl -H
    available: 4 nodes (0-1,16-17)
    node 0 cpus: 0 8 16 24 32
    node 0 size: 65536 MB
    node 0 free: 63286 MB
    node 1 cpus: 40 48 56 64 72
    node 1 size: 131072 MB
    node 1 free: 131000 MB
    node 16 cpus: 80 88 96 104 112
    node 16 size: 65536 MB
    node 16 free: 64286MB
    node 17 cpus: 120 128 136 144 152
    node 17 size: 65536 MB
    node 17 free: 64286 MB
  • 如果来宾需要多于 10 个核心和约 100GB 内存,那么来宾应使用两个节点。在下面的 libvirt XML 定义示例中,使用了节点 16 和 17 来限制来宾。
    ...
    <memory unit='KiB'>125566976</memory>
      <currentMemory unit='KiB'>125566976</currentMemory>
      <memoryBacking>
        <hugepages/>
      </memoryBacking>
      <vcpu placement='static'>80</vcpu>
      <cputune>
        <vcpupin vcpu='0' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='1' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='2' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='3' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='4' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='5' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='6' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='7' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='8' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='9' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='10' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='11' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='12' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='13' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='14' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='15' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='16' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='17' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='18' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='19' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='20' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='21' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='22' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='23' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='24' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='25' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='26' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='27' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='28' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='29' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='30' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='31' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='32' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='33' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='34' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='35' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='36' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='37' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='38' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='39' cpuset='80,88,96,104,112'/>
        <vcpupin vcpu='40' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='41' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='42' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='43' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='44' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='45' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='46' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='47' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='48' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='49' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='50' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='51' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='52' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='53' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='54' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='55' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='56' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='57' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='58' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='59' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='60' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='61' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='62' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='63' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='64' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='65' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='66' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='67' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='68' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='69' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='70' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='71' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='72' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='73' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='74' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='75' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='76' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='77' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='78' cpuset='120,128,136,144,152'/>
        <vcpupin vcpu='79' cpuset='120,128,136,144,152'/>
      </cputune>
    ……
    
     <numa>
          <cell cpus='0-39' memory='62783488'/>
          <cell cpus='40-79' memory='62783488'/>
      </numa>
    
    ...
  • 在来宾使用大页面时,向主机上的节点 16 和 17 分配足够多的大页面:
    echo 3840 >/sys/devices/system/node/node16/hugepages/hugepages-16384kB/nr_hugepages
    echo 3840 >/sys/devices/system/node/node17/hugepages/hugepages-16384kB/nr_hugepages
  • 使用 pagemapscan-numa 实用程序,确保来宾限制在节点 16 和 17 中,如下所示:
    ./pagemapscan-numa 85538 2
    
                     host-node00    host-node01    host-node16    host-node17    not-present
                     -----------    -----------    -----------    -----------    -----------
       VM-node00|        0(000%)        0(000%)   978176(100%)        0(000%)        0(000%)
       VM-node01|        0(000%)        0(000%)              0(000%)   978176(100%)        0(000%)
  • 在 PowerKVM 3.1 中,libvirt XML 定义有一个新的内存固定选项,该选项不需要使用大页面来在来宾上设置内存关联。
  • numatune memnode
    特性可将来宾节点 cellid
    (与它上方的单元创建节匹配)映射到相应的主机节点 nodeset
    。下面的代码示例显示了定义的第一个单元创建部分:
    <cpu>
        <topology sockets='2' cores='10' threads='8'/>
        <numa>
          <cell id='0' cpus='0-79' memory='5242880' unit='KiB'/>
          <cell id='1' cpus='80-159' memory='5242880' unit='KiB'/>
        </numa>
      </cpu>
      <numatune>
         <memnode cellid='0' mode='strict' nodeset='1'/>
         <memnode cellid='1' mode='strict' nodeset='16'/>
      </numatune>

大页面支持

在使用基于 Java™ 的 MongoDB 应用程序时,只需要在来宾上配置大页面支持。

  • libvirt XML 定义文件中的来宾定义必须按以下方式指定 memoryBacking
    <domain type=’kvm’>
    	<name>myguest</name>
    	<uuid>...</uuid>
    	<memory>2048</memory>
    	<currentMemory>2048</currentMemory>
    	<memoryBacking>
    		<hugepages/>
    	</memoryBacking>
    ...
    </domain>
  • 运营以下命令在来宾中启用大页面:

    echo 2000 &gt; /proc/sys/vm/nr_hugepages

    hugeadm –create-mounts

  • 您还需要根据后面的 Application-level -> Java Tuning 部分的介绍,在主机上分配大内存。

数据磁盘直通

因为来宾分区上的虚拟 SCSI (VSCSI) 模拟磁盘通常很慢,所以您应在 libvirt XML 定义文件中将磁盘设置为 lun
,如下所示:

<disk type="block" device="lun">
      <driver name="qemu" type="raw" cache="directsync"/>
      <source dev="/dev/sdb"/>
      <target dev="sdb" bus="scsi"/>
      <address type="drive" controller="0" bus="0" target="3" unit="0"/>
    </disk>

有关更多信息,请参阅 IBM Redbooks IBM PowerKVM:配置和使用
中的第 98 页。

网络 PCI 直通

在 libvirt XML 定义中将 type
属性设置为 pci
,如下面的示例所示:

<devices>
...
	<hostdev mode=’subsystem’ type=’pci’ managed=’yes’>
	<source>
		<address domain=’0x000’ bus=’0x15’ slot=’0x00’ function=’0x0’/>
	</source>
	</hostdev>
</devices>

有关更多信息,请参阅 IBM Redbooks IBM PowerKVM:配置和使用
中的第 23 页。

应用程序级调优

除了系统级和虚拟化级设置之外,根据您运行的应用程序,通常还需要进行额外的调优。本节将介绍如何配置一些更常见的应用程序级设置。

Java 调优

本节中的建议仅适用于基于 Java 的工作负载,包括 YCSB。

大页面

以下设置应适用于裸机和 PowerKVM 主机环境。

  • 您将使用的大页面数量取决于您的特定应用程序需求。设置该数量来包含所需的最大值,例如所有 Java 进程的 Java 虚拟机 (JVM) 堆的总大小。
  • 您分配给大页面的最大内存不应超过系统内存的 90%。
  • 使用较大的数字。下面的示例使用 512 GB:
    echo 549755813888 > /proc/sys/kernel/shmmax
    echo 549755813888 > /proc/sys/kernel/shmall
  • 要在下次系统重新启动时永久设置此数字,可将它附加到 /etc/sysctl.conf 文件,如下所示:
    # Shared memory – max segment size:
    	   kernel.shmmax = 549755813888
    	   # Total amount of shared memory pages
    	   kernel. shmall = 549755813888
  • 设置保留的大内存页面数量,即保留页面数量。下面的示例保留了 60 GB:
    echo 3750 > /proc/sys/vm/nr_hugepages
  • 要在下次系统重新启动时永久设置此数字,可将它附加到 /etc/sysctl.conf 文件,如下所示:
    # Enable kernel to reserve 60GB
    	vm.nr_hugepages = 3750

使用 IBM JDK 版本 7、8 或更高版本

应根据您的具体 Java 工作负载来设置 Java 选项。对于更高的 YCSB 版本,可使用 Java 默认设置;对于较低的版本,可修改 ycsb 脚本文件并添加以下选项:

&quot;-Xlp&quot;, &quot;-Xms4096m&quot;, &quot;-Xmx4096m&quot;, &quot;-Xmn3400m&quot;, &quot;-Xgcthreads8&quot;, &quot;-Xcompressedrefs&quot;

大页面

许多 Java 工作负载使用大页面时运行效率更高。对于 YCSB,可使用大页面 (16 MB) 和 -Xlp。请参阅上面的部分,了解有关的更多信息。

堆大小

对于 YCSB,可使用每个 Java 实例 4 GB 堆大小。

垃圾收集线程

对于 YCSB,可将垃圾收集线程数设置为 8。

压缩引用

使用压缩引用选项来更有效地使用可用空间。

有关更多信息,请查阅 IBM Redbooks 包括 IBM POWER8 在内的 IBM Power Systems 处理器的性能优化和调优技术
的第 177 页。

分片/集群调优

对于写/更新密集型工作负载,将它们限制到一个插槽能够实现最佳关联(使用最多每个分片 10 个核心)。对于读/查询密集型工作负载,将它们限制到一个插槽能够实现最佳关联(使用最多每个分片 20 个核心)。

有关更多信息,请访问 https://docs.mongodb.com/manual/sharding/

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址