qemu-kvm 性能优化小结(一)

应公司要求最近作者一直在调研虚机性能优化相关的技术,不得不说相关技术博大且精深,我也不得不在这些技术上面花费了相当长的时间与精力。也导致了我的文章断更了很长时间。现在稍稍有些时间,对这一段时间的工作做一下总结,希望对大家能有所帮助。

由于技术的广泛性我计划使用两篇文档来总结概述这些技术:第一篇文档介绍宿主机调优,和存储调优;第二篇文档主要集中在介绍各种网络调优方案。

这些内容都是本人根据自己理解整理出来的,由于很多技术本人也是刚刚接触,如果文章有误,欢迎批评指正。另外下面优化方案都是在 x86 CPU 测试的,不一定能适用于 arm 架构 CPU 的环境。本文只介绍优化方案,不提供相关测试数据(有些是因为还没来得及测试,有些是因为涉及到公司产品不方便公开)。

宿主机参数调整

这里想向大家介绍一个很好用的工具 TuneD

安装方法:

Fedora 系列操作系统

# dnf install tuned

Debian 系列操作系统

# apt install tuned

安装之后需要启动 Tuned 服务

# systemctl start tuned

Tuned是一款争对 Linux 的性能调优工具,通过 Tuned 我们不需要再去学习庞大且晦涩的 Linux 内核参数,不需要在去艰难的研究每个参数改设置未何值。Tuned 预置了一些 profile (一个 profile 可以理解未一套系统参数调整方案:包括内核参数,CPU 参数,电源参数)。不同的 profile 适用于不同的场景,可以通过 tuned-adm list 命令查看 Tuned 预置的 profiles。

# tuned-adm list
Available profiles:
- accelerator-performance     - Throughput performance based tuning with disabled higher latency STOP states
- balanced                    - General non-specialized tuned profile
- desktop                     - Optimize for the desktop use-case
- hpc-compute                 - Optimize for HPC compute workloads
- intel-sst                   - Configure for Intel Speed Select Base Frequency
- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console     - Optimize for serial console use.
- powersave                   - Optimize for low power consumption
- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest               - Optimize for running inside a virtual guest
- virtual-host                - Optimize for running KVM guests
Current active profile: virtual-host

因为我们是要优化 qemu-kvm 性能,所以我们只需要关注虚拟化相关,上面 profiles 有两个和虚拟化相关:virtual-host 和 virtual-guest,顾名思义,virtual-host 应当应用在宿主机上,virtual-guest 应当应用在虚拟机内部。

查看当前应用的 profile

# tuned-adm active
Current active profile: balanced

把 profile 切换成 virtual-host

# tuned-adm profile virtual-host

TuneD 重预置的 profile 位于 /usr/lib/tuned/,可以在改目录下查看每个 profile 的配置,了解每个 profile 都做了什么。

存储调优

ceph

我们公司用的主要存储后端是 ceph,所以我们也主要以 ceph 位目标,讲解一些优化方案。为了方便讲解,我把使用 ceph 作为存储后端的数据路径概述成三个阶段:前端->传输->后端,前端:虚机数据到 librbd;传输:ceph 是一套分布式存储,主要通过网络来传输数据,网络的性能是影响 ceph 性能的一个关键因素;后端:osd 将数据落盘。其中传输阶段的调优方案计划放在下一篇文档,和网络调优方案一起介绍。

librbd

关于虚机数据到 librbd这一阶段的优化主要参考两篇文档:

  • https://docs.ceph.com/en/quincy/rbd/qemu-rbd/
  • https://docs.ceph.com/en/quincy/rbd/rbd-config-ref/

第一篇文档讲解的是如何通过 qemu 操作配置 ceph rbd(qemu 代码已经集成了 librbd),第二篇文档讲解的是 librbd 相关的配置,这些配置需要配置在 /etc/ceph/ceph.conf 的 [client] 下。

下面我就摘出一些我认为的可以影响性能的一些配置项(本人还没有来得及一项一项的测试):

  • rbd_read_from_replica_policy

rbd 副本读策略,我们知道 ceph 为了可靠性,ceph 数据是多副本存放的,副本数据存放位置根据 crush 规则的不同,可以是不同的 osd,不同的主机,不同的机架,甚至是不同的机房。改配置项影响到 librbd 从什么位置来读取数据,改配置项的值有三种选择:default(总是从主副本所在 osd 读取),balance(随机选择一个副本读取),localize(根据 crush map 就近读取)。个人建议把这个配置项的值配置为 localize。

  • rbd_cache

是否为 rbd 开启缓存,默认值是 true (开启缓存)。开启后能极大优化读性能,对于写性能的优化还需根据 rbd_cache_policy 的值来决定

  • rbd_cache_policy

缓存策略(主要影响的是写操作),有三种值可选:writethrough(写通:缓存和后端硬盘同时写入才算成功);writeback(写回:写入缓存即算成功);writearound(默认选项,写入数据时不经过缓存直接写入后端硬盘)。这三个值:writeback 性能是最高的,但是存在丢失数据的风险(物理机突然宕机,缓存中数据会丢失),writethrough 和 writearound 性能差不多,但是 writethrough 会在缓存中参数更多的无用数据(不会被立即读取使用的数据)。

其他和 cache 相关的配置项:rbd_cache_size,rbd_cache_max_dirty,rbd_cache_target_dirty,rbd_cache_max_dirty_age 个人认为默认值就行。

  • 预读相关配置

预读能极大优化顺序读的性能,开启预读一般会作用于虚机的启动阶段,优化虚机启动性能(选择操作系统一般都会支持预读,虚机启动后使用操作系统的预读即可)。相关的配置项有三个:rbd_readahead_trigger_requests(触发预读所需的顺序读请求数),rbd_readahead_max_bytes 预读的最大字节数,rbd_readahead_disable_after_bytes(从RBD映像中读取这么多字节之后,该映像的预读将被禁用,直到关闭为止,一般认为读到这么多字节后虚机已经成功启动,后续使用操作预读即可。)个人认为把 rbd_readahead_trigger_requests 值适当调小,rbd_readahead_max_bytes 和 rbd_readahead_disable_after_bytes 值适当调大,可以增加性能。

osd

我们知道固态硬盘(ssd)的读写速度要远大于机械硬盘(hdd),但是固态硬盘的价格也要远大于机械硬盘。如果 osd 采用 ssd,虽然速度快,但是价格昂贵;反之,如果 osd 采用 hdd,同样的花销,存储空间话大好几倍,但是速度也会慢很多。那有么有什么办法将两者结合起来呢?

osd 将数据落盘这一阶段,介绍一种 bcache 的方案,通过 bcache 我们就可以把 hdd 的价格优势和 ssd 的性能优势结合起来。bcache 是一个内核模块,最早出现在 linux 3.10 内核,其重要原理是使用少量的 ssd 盘为大量 hdd 盘做缓存,应用直接对 ssd 盘进行读写,bcache 会根据用户配置的策略适时的把 ssd 中的数据刷入 hdd。

关于 bcache 的操作可参考:https://markrepo.github.io/maintenance/2018/09/10/bcache。这里就不做过多的介绍了。

SPDK

SPDK Storage Performance Development Kit,是 intel 开发的一套优化存储性能的工具库,其原理参照了 DPDK:1、在用户空间驱动设备,避免了数据从用户空间到内核空间的拷贝;2、轮询代替中断,能更快的响应数据的读写。

虽然 SPDK 描述自己是一组工具和库,但是 SPDK 本身也提供了一些应用示例,这其中有两个示例应用可以用于优化 ceph 性能:

  • vhost target, 其是一种 vhost-user 的实现,相对于传统的 ceph vhost 实现(qemu 中集成 librbd),SPDK 的 vhost-user-blk 借助轮询的特性移除了传统的 I/O 提交通知的机制,增大了 vhost 服务的的吞吐,减少了 I/O 时延。这个应用作用于上文提到的 Ceph 数据路径的前端
  • bdev,使用 SPDK 提供的块设备作为 ceph osd 的存储设备,可以减少 osd 提交数据的延迟与吞吐,配置方法可以参考ceph 文档
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值