原文地址:http://www.51gocloud.com/?p=1912
前言
- 业务上云并非简单地将应用部署在VM里就完事了,还需要针对业务特性定制优化方案,特别需要仔细考虑网络性能的优化。本文通过HPC(高性能计算)和RDS(关系数据库服务)两种应用场景上云,来具体说明IaaS层部署必须的考虑和性能优化手段。
场景分析
HPC
- HPC早于类似Hadoop那样的针对大数据的批量分析之前就已经出现。典型的 HPC 应用包括:大气建模、基因研究、汽车碰撞模拟、流体动态分析等,虽然数据量也很大,但是这些应用更强调高强度的计算。在HPC集群中,各种计算节点是通过集群内的超高速交换网络连接到一起的,集群的性能和可扩展性主要和消息在节点之间的传递速度有关,需要的是低延迟的消息传递。而infiniband技术正是在此处擅长。
HPC应用上云的方案实施起来实际上是两个阶段:
* 1. HPC数据准备阶段:云提供商给客户拉一条直通专线,在云上启动若干VM接收数据,然后存放在云上的高速存储设备上(可以是本地盘),走的是TCP/IP网络协议栈,服务器网络硬件采用的是高带宽的以太网卡。
* 2. HPC运行阶段:HPC应用部署在一组高规格的虚拟机上,infiniband卡直通,HPC应用真正运行起来时,进程间通信是通过infiniband卡,与TCP/IP无关。HPC的最常用的并行文件系统就是lustre,可以使用以太网硬件走TCP/IP,也可以直接使用Infiniband。
- HPC真正运行起来走的进程间通信使用infiniband,拼的是硬件,所以不用特别关注。本文重点关注第一个过程和lustre文件系统基于以太网卡时的网络性能优化。这一过程基本上类似大数据应用处理前ETL的过程,拼的是VM的TCP大包多流的带宽,网络性能测试工具是netperf TCP_STREAM模式。
RDS
- 数据库是IT标准的业务应用,OLTP的场景下读写数据大多都是100~200个字节的小包,通常客户端会维护一个连接池,几百个连接同时到dbserver上访问,这就要求RDS实例的网络拼的是单台VM的TCP小包多流下完成请求响应的数量,网络性能测试工具是netperf TCP_RR模式。
VM网络性能优化的手段
虚拟网卡多队列
网络性能优化最常用的支持技术就是网卡多队列,用CPU换性能这一招已经是无数物理网卡的套路了,虚拟网卡也不例外。
参考openstack计算模块nova的设计[1],用户需要额外完成的动作实际就两步:
- 给镜像增加一个属性:
hw_vif_multiqueue_enabled=true|false (default false)
- 在guest VM内部,打开多队列:
ethtool -L eth0 combined 8
- 在guest VM内部,对virtio-input/output中断绑核
其实在openstack官方或是libvirt社区的多队列指南中并没有提到要绑核的问题,
但是经过对centos7.x的性能测试发现,在host侧经常只会看到一个vhost线程跑到100%的情况,
而不是多个vhost都跑起来的理想状态。原因:在VM内部处理接收TCP ACK响应包的中断跑到同一个vCPU上
解决方法,必须对中断进行绑核处理,怎么绑核这种小事就不再多说了。
建议部署LACP负荷分担网卡绑定模式加大VM带宽
lacp也就是linux mode 4,相比于主备模式,虚拟机TCP多流带宽翻倍。
参考
- [1] https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/libvirt-virtiomq.html