在Openstack中,建议给虚拟机合理地分配合适的大页内存,以提升虚拟机性能,除非虚拟机操作系统不使用大页内存。
设置flavor
openstack flavor set FLAVOR-NAME \ --property hw:mem_page_size=PAGE_SIZE
选项PAGE_SIZE参数值说明:
参数值 | 说明 |
small | 默认值,使用最小的内存页面,例如:x86平台的4KB。 |
large | 只使用大页内存,例如:x86平台的2MB或1G。 |
any | 取决于计算驱动程序,例如:Libvirt根据服务器的大页内存设置进行决策,优先使用最大页,逐步递减。 |
pagesize | 指定页大小,例如:4KB、2MB、2048、1GB。 |
举两个例子:
# 创建页大小为large的flavor openstack flavor create --vcpus 2 --ram 2048 --disk 50 \ --property hw:mem_page_size=large FLAVOR_NAME_1 # 创建页大小为1GB的flavor openstack flavor create --vcpus 2 --ram 2048 --disk 50 \ --property hw:mem_page_size=1GB FLAVOR_NAME_2 # 修改FLAVOR_NAME_1的页大小为1GB openstack flavor set FLAVOR_NAME_1 \ --property hw:mem_page_size=1GB
补充说明:
- 大页内存要求内存页对齐,即Flavor内存是hw:mem_page_size的整数倍。
- 宿主机的大页面是平均分到每个NUMA节点上的,除非某个NUMA节点没有足够的可用连续内存来生成大页面。
- 当Flavor内存大于单个NUMA节点的可用大页内存容量时,需要将Flavor内存分配到不同的NUMA节点,否则,会因资源不足导致无法创建虚拟机。
某个NUMA节点的大页容量=大页面数量*单个大页面容量,通过以下方式可以指定大页面具体由哪个NUMA节点来生成:
# 先清0,以便重新生成HugePages页面 echo 0 > /proc/sys/vm/nr_hugepages # 第1-40个HugePages页面全部在NUMA节点0上生成 numactl -m 0 echo 40 >/proc/sys/vm/nr_hugepages_mempolicy # 第41-60个HugePages页面全部在NUMA节点1上生成 numactl -m 1 echo 60 >/proc/sys/vm/nr_hugepages_mempolicy # 第61-80个HugePages页面平均在NUMA节点0和1上生成 echo 80 >/proc/sys/vm/nr_hugepages_mempolicy
查看NUMA节点的大页面资源:
cat /sys/devices/system/node/node*/meminfo | fgrep Huge
与NUMA相关的更多知识请阅读Openstack云平台扩展课程·NUMA拓扑。
附加知识
内存页大小设置建议
# 2G 内存设置 256
# 4G 内存设置 512
# 8G 内存设置 1024
手动为虚拟机中设置大页内存:
echo 1024 > /proc/sys/vm/nr_hugepages
Nova虚拟机的大页内存设置
绝大多数CPU支持多种内存页尺寸,从4KB到2M/4M,甚至1GB,但都默认使用最小的4KB页。
如果具有较大的内存可以选择启用大页内存进行分配,将会明显减少CPU的页表项,也会增加TLB页表缓存的命中率,降低内存访问延迟。如果操作系统使用默认的小页内存,随着运行时间,系统会出现越来越多的碎片,导致最终无法申请大页的内存,因此,如果有使用大页内存的需求,最好的办法是在系统启动时就预留好内存空间。
Linux内核已经支持THP(Transparent Huge Pages,透明巨型页)特性,该特性会尝试为应用程序预分配大页内存,依赖该特性的一个问题是,虚拟机的拥有者并不能保证给虚拟机使用的是大页内存还是小页内存。
内存块是直接指定给特定的NUMA单元的,这就意味着大页内存也是直接指定在NUMA单元上的,因此,在NUMA单元上分配虚拟机时,计算服务需要考虑在NUMA单元或者主机上可能会用到的大页内存,但是,为虚拟机内存启用大页内存时,可以不用考虑虚拟机操作系统是否会使用。
Linux内核有一项特性,叫做内核共享存储(KSM),该特性使得不同的CPU可以共享相同内容的内存页,内核会主动扫描内存,合并内容相同的内存页,当有CPU改变这个共享的内存页时,会采用写时复制(COW)的方式写入新的内存页。当一台主机上的多台虚拟机使用相同操作系统或者虚拟机使用很多相同内容内存页时,KSM 可以显著提高内存的利用率,因为内存扫描的消耗,使用KSM的代价是增加了CPU的负载,并且如果虚拟机突然做写操作时,会引发大量共享的页面,此时会存在潜在的内存压力峰值。虚拟化管理层必须因此积极地监控内存压力情况并做好现有虚拟机迁移到其他宿主机的准备,如果内存压力超过一定的水平限制,将会引发大量不可预知的Swap操作,甚至引发OOM,所以在性能要求严格的场景中,我们建议关闭内存共享特性。
计算节点可以配置CPU与内存的超配比例,但是一旦使用了大页内存,内存便不能再进行超配。因为当使用大页内存时,虚拟机内存页必须与主机内存页一一映射,并且主机操作系统能通过Swap分区分配大页内存,这也排除了内存超配的可能。大页内存的使用,意味着需要支持内存作为专用资源的虚拟机类型。
尽管设置专用资源时,不会超配内存与CPU,但是CPU与内存的资源仍然需要主机操作系统提前预留。如果使用大页内存,必须在主机操作系统中明确预留,对于CPU则有一些灵活性,因为尽管使用专用资源绑定CPU,主机操作系统依然会使用这些CPU的一些时间。不管怎么样,最好可以预留一定的物理CPU专门为主机操作系统服务,以避免操作系统过多占用虚拟机CPU,而造成对虚拟机性能的影响。
允许内存超配时,超出主机内存的部分将会使用到Swap。ZSWAP特性允许压缩内存页被写入Swap设备,这样可以大量减少Swap设备的I/O执行,减少了交换主机内存页面中固有的性能下降。Swap会影响主机整体I/O性能,所以尽量不要把需要专用内存的虚拟机机与允许内存超配的虚拟机放在同一台物理主机上。如果专用CPU的虚拟机与允许超配的虚拟机竞争CPU,由于Cache的影响,将会严重影响专用CPU的虚拟机的性能,特别在同一个NUMA单元上时,因此,最好将使用专用CPU的虚拟机与允许超配的虚拟机放在不同的宿主机上,其次是不同的NUMA单元上。
关于虚拟机在主机上的CPU与内存的布局决策,也会影响其他的主机资源分配。例如,PCI设备与NUMA单元关系密切,PCI设备的DMA操作使用的内存最好在本地NUMA单元上,因此,在哪个NUMA单元上分配虚拟机,将会影响到PCI设备的分配。
原创文章禁止转载:技术学堂 » Openstack云平台性能优化·大页内存