优化 Azure 上的 Linux VM

从命令行或门户轻松创建 Linux 虚拟机(VM)。 本教程介绍如何确保已将其设置为优化其在 Microsoft Azure 平台上的性能。 本主题使用 Ubuntu Server VM,但也可以使用 自己的映像创建 Linux 虚拟机作为模板

先决条件

本主题假定你已有一个正常工作的 Azure 订阅(免费试用注册),并且已将 VM 预配到 Azure 订阅中。 在创建 VM 之前,请确保已安装最新的 Azure CLI,并使用 az login 登录到 Azure 订阅。

Azure OS 磁盘

在 Azure 中创建 Linux VM 后,它具有两个与之关联的磁盘。 /dev/sda 是 OS 磁盘, /dev/sdb 是临时磁盘。 请勿将主 OS 磁盘(/dev/sda)用于除作系统之外的任何内容,因为它已针对快速 VM 启动时间进行优化,并且不会为工作负荷提供良好的性能。 想要将一个或多个磁盘附加到 VM,以获取数据的持久性和优化存储。

添加磁盘以优化容量和性能目标

根据 VM 的大小,您可以在 A 系列计算机上最多附加 16 个磁盘,在 D 系列上附加最多 32 个磁盘,在 G 系列上附加最多 64 个磁盘,每个磁盘的大小最大为 32 TB。 您可以根据您的空间和 IOPS 要求,按需添加额外的磁盘。 对于标准存储,每个磁盘的性能目标为 500 个 IOps,高级存储的每个磁盘最多有 20,000 个 IOps。

若要在高级存储磁盘上实现最高 IOps,其缓存设置已设置为 ReadOnlyNone,必须在 Linux 中装载文件系统时禁用 屏障 。 您不需要任何屏障,因为在这些缓存设置下,写入到高级存储支持的磁盘是持久耐用的。

  • 如果使用 reiserFS,请使用挂载选项 barrier=none 来禁用屏障(若启用屏障,请使用 barrier=flush
  • 如果使用 ext3/ext4,请使用装载选项 barrier=0 禁用屏障(若要启用屏障,请使用 barrier=1
  • 如果使用 XFS,请使用装载选项 nobarrier 禁用屏障(对于启用屏障,请使用选项 barrier

非托管存储帐户注意事项

使用 Azure CLI 创建 VM 时的默认作是使用 Azure 托管磁盘。 这些磁盘由 Azure 平台处理,不需要任何准备或位置来存储这些磁盘。 非托管磁盘需要存储帐户,并有一些额外的性能注意事项。 有关托管磁盘的详细信息,请参阅 Azure 托管磁盘概述。 以下部分概述了仅在使用非托管磁盘时的性能注意事项。 同样,默认和建议的存储解决方案是使用托管磁盘。

如果创建包含非托管磁盘的 VM,请确保从与 VM 位于同一区域的存储帐户附加磁盘,以确保邻近性并最大程度地降低网络延迟。 每个标准存储帐户的最大 IOps 大小为 20k,容量为 500 TB。 此限制适用于大约 40 个大量使用的磁盘,包括 OS 磁盘和你创建的任何数据磁盘。 对于高级存储帐户,没有最大 IOps 限制,但大小限制为 32 TB。

处理高 IOps 工作负荷时,你已为磁盘选择了标准存储,可能需要将磁盘拆分到多个存储帐户,以确保没有达到标准存储帐户的 20,000 个 IOps 限制。 VM 可以包含来自不同存储帐户和存储帐户类型的磁盘组合,以实现最佳配置。

VM 临时驱动器

默认情况下,创建 VM 时,Azure 会提供 OS 磁盘(/dev/sda)和临时磁盘(/dev/sdb)。 添加的所有附加磁盘显示为 /dev/sdc/dev/sdd/dev/sde 等。 临时磁盘(/dev/sdb)上的所有数据都不持久,如果 VM 大小调整、重新部署或维护等特定事件强制重启 VM,则可能会丢失。 临时磁盘的大小和类型与部署时选择的 VM 大小相关。 所有高级大小的 VM(DS、G 和 DS_V2 系列)的临时磁盘都由本地 SSD 提供支持,以提高性能,最高可达 48k IOps。

Linux 交换分区

如果 Azure VM 来自 Ubuntu 或 CoreOS 映像,则可以使用 CustomData 将云配置发送到 cloud-init。 如果上传了使用 cloud-init 的 自定义 Linux 映像 ,则还会使用 cloud-init 配置交换分区。

不能使用 /etc/waagent.conf 文件来管理 cloud-init 预配和支持的所有映像的交换。 关于完整的映像列表,请参阅Using cloud-init

管理这些映像的交换的最简单方法是完成以下步骤:

  1. /var/lib/cloud/scripts/per-boot 文件夹中,创建名为 create_swapfile.sh的文件:

    $ sudo touch /var/lib/cloud/scripts/per-boot/create_swapfile.sh

  2. 将以下行添加到该文件中:

    $ sudo vi /var/lib/cloud/scripts/per-boot/create_swapfile.sh

    #!/bin/sh
    if [ ! -f '/mnt/swapfile' ]; then
    fallocate --length 2GiB /mnt/swapfile
    chmod 600 /mnt/swapfile
    mkswap /mnt/swapfile
    swapon /mnt/swapfile
    swapon -a ; fi
    

    注释

    可以根据需求并根据资源磁盘中的可用空间更改该值,具体取决于所使用的 VM 大小。

  3. 使文件可执行

    $ sudo chmod +x /var/lib/cloud/scripts/per-boot/create_swapfile.sh

  4. 若要创建交换文件,请在最后一步之后立即执行脚本:

    $ sudo /var/lib/cloud/scripts/per-boot/./create_swapfile.sh

对于不支持 cloud-init 的映像,从 Azure 市场部署的 VM 映像具有与 OS 集成的 VM Linux 代理。 此代理允许 VM 与各种 Azure 服务交互。 假设已从 Azure 市场部署了标准映像,则需要执行以下作才能正确配置 Linux 交换文件设置:

/etc/waagent.conf 文件中找到和修改两个条目。 它们控制是否存在专用交换文件和交换文件的大小。 需要验证的参数是否为ResourceDisk.EnableSwapResourceDisk.SwapSizeMB

若要启用正确启用的磁盘和装载的交换文件,请确保参数具有以下设置:

  • ResourceDisk.EnableSwap=Y
  • ResourceDisk.SwapSizeMB={以 MB 为单位的大小,以满足你的需求}

进行更改后,需要重启 waagent 或重启 Linux VM 以反映这些更改。 你会知道更改已被实施并且交换文件已创建,这是因为你使用 free 命令查看可用空间时会看到这些结果。 修改 waagent.conf 文件后,创建了一个 512MB 的交换文件,下面是示例:

azuseruser@myVM:~$ free
            total       used       free     shared    buffers     cached
Mem:       3525156     804168    2720988        408       8428     633192
-/+ buffers/cache:     162548    3362608
Swap:       524284          0     524284

高级存储的 I/O 计划算法

使用 2.6.18 Linux 内核时,默认 I/O 计划算法已从截止时间更改为 CFQ(完全公平的队列算法)。 对于随机访问 I/O 模式,CFQ 和截止时间之间的性能差异是微不足道的。 对于 I/O 模式主要顺序的 SSD 磁盘,切换回 NOOP 或 Deadline 算法可以实现更好的 I/O 性能。

查看当前的 I/O 调度器

使用以下命令:

cat /sys/block/sda/queue/scheduler

你将看到以下输出,它指示当前的调度器。

noop [deadline] cfq

更改 I/O 计划算法的当前设备(/dev/sda)

使用以下命令:

azureuser@myVM:~$ sudo su -
root@myVM:~# echo "noop" >/sys/block/sda/queue/scheduler
root@myVM:~# sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop"/g' /etc/default/grub
root@myVM:~# update-grub

注释

单独将此设置应用于 /dev/sda 是不具意义的。 在顺序 I/O 主宰 I/O 模式的所有数据磁盘上设置。

应会看到以下输出,指示已成功重新生成 grub.cfg ,并且默认计划程序已更新为 NOOP。

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.13.0-34-generic
Found initrd image: /boot/initrd.img-3.13.0-34-generic
Found linux image: /boot/vmlinuz-3.13.0-32-generic
Found initrd image: /boot/initrd.img-3.13.0-32-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
done

对于 Red Hat 发行版,您只需要使用以下命令:

echo 'echo noop >/sys/block/sda/queue/scheduler' >> /etc/rc.local

Ubuntu 18.04 使用经过 Azure 优化的内核和多队列 I/O 调度器。 在这种情况下, none 是适当的选择,而不是 noop。 有关详细信息,请参阅 Ubuntu I/O 计划程序

使用软件 RAID 提升 I/Ops 性能

如果工作负荷需要的 IOps 多于单个磁盘所能提供的,则需要使用多个磁盘的软件 RAID 配置。 由于 Azure 已在本地构造层执行磁盘复原,因此可以通过 RAID-0 条带化配置实现最高级别的性能。 在 Azure 环境中预配和创建磁盘,并将其附加到 Linux VM,然后再对驱动器进行分区、格式化和装载。 有关在 Azure 中的 Linux VM 上配置软件 RAID 设置的更多详细信息,请参阅 Linux 上的“配置软件 RAID” 文档。

作为传统 RAID 配置的替代方法,还可以选择安装逻辑卷管理器(LVM),以便将多个物理磁盘配置为单个条带化逻辑存储卷。 在此配置中,读取和写入将分发到卷组中包含的多个磁盘(类似于 RAID0)。 出于性能原因,很可能需要对逻辑卷进行分条,从而使读写操作能够利用所有连接的数据磁盘。 有关在 Azure 中的 Linux VM 上配置条带化逻辑卷的更多详细信息,请参阅 在 Azure 中的 Linux VM 上配置 LVM 文档。

后续步骤

请记住,与所有优化讨论一样,每次更改前后都需要执行测试,以衡量更改的影响。 优化是一个分步过程,在环境中的不同计算机上具有不同的结果。 适用于一个配置的内容可能不适用于其他配置。

指向其他资源的一些有用链接: