在虚拟机上容器环境性能静态测试问题分析总结(一)

背景描述:

最近在一个客户的项目拓展和做过程中,希望客户在IDC中自建的容器服务能够部分使用云上的容器服务,基于IDC环境和虚拟机上的容器服务之间,做了一些静态和动态的性能对比测试。测试过程终于到一些问题,针对问题前后经过多轮分析对比,在问题定位和分析上的一些总结,希望能供大家借鉴。

测试环境:

测试场景说明:

下属公有云的容器均指公有云上的容器PaaS服务,参考:https://cloud.tencent.com/product/tke

1.静态测试:

物理机环境:在物理机上部署容器,其中一个容器中部署nginx,压测的apache ab压测工具分别在同一个物理机的容器中和在另外一个物理节点的容器中。

虚拟机环境:在公有云虚拟机上部署容器,其中一个容器中部署nginx,压测的apache ab压测工具分别在同一个公有云虚拟机上的容器中和在另外一个虚拟机节点容器中。

2.动态测试:

该应用分布有3个节点,基于Java应用,OSP1节点作为前端的入口,接受请求,请求业务逻辑通过proxy节点,最终转发到后端OSP-2节点。这3个节点分别存在如下两个场景:

a)3个节点分别部署于物理机上的容器中。

b)3个节点分别部署于虚拟机上的容器中。

测试过程:

1.静态测试场景分析

静态测试方法和模型:

实际最终静态测试的初步统计:

客户初步测试的结论:

1.如果ab所在工具节点和nginx所在容器不在一个虚拟机上,跨虚拟机压测,那么性能会比物理机环境有20%差异。

2.但是虚拟机的CPU主频和性能比物理机的CPU新2代,V2和V4,主频也更高。

过程分析:

如上图所示,根据客户的测试场景,我们分别重新登录客户环境,进行了一些模拟测试,发现主要性能差异电视,12核24G的虚拟机节点作为被调用的服务器端时,和物理机环境存在差异。

因此分析思路分别从几下几个途径展开:

1.物理机和虚拟机的配置差异,环境差异。

2.网卡队列上的差异:

差异点2:物理机关闭rps,CVM开启rps,物理机的网络中断都由CPU0和CPU6处理,CVM的8个核处理硬中断,12个核处理软中断,用于网络处理,抢占了业务CPU。

最终的分析原因:

原因:配置存在差异

1)物理机是24核,CVM是12核,CPU核数少一半。

2)物理机默认关闭rps,虚拟机是开启RPS;物理机网卡中断默认绑定到cpu0和cpu6,虚拟机CPU都需要处理中断

3)CVM网卡开启多队列,总共8个队列。

原理:

Ø(CVM4)这个CVM存在网络中断、软中断抢占了CPU,以及跨numa访问

Ø这个CVM只有12C,但有8个队列,2个numa,开启了rps导致网路过来时,8个核有硬中断处理,12个cpu都有软中断处理,与业务抢CPU

改进建议:

①关闭rps,有8个cpu响应中断和处理软中断,可以达到15K~16K qps

②关闭rps,只开启一个队列,由CPU0处理硬中断和软中断,将nginx绑定到1~11核上运行

③正式业务的时候,可以用指定镜像创建CVM,在CVM中设置好网络中断。

配置优化改进建议:

①创建24核CVM,再进行测试,按照默认开启RPS,QPS为14k

②关闭rps,有8个cpu响应中断和处理软中断,QPS可以达到15K~16K(和物理机保持一致,关闭rps)

③关闭rps,只开启一个队列,由CPU0处理硬中断和软中断,QPS可以达到17~18K(和物理机类似,网卡中断绑定到某个核)

④关闭rps,只开启一个队列,由CPU0处理硬中断和软中断,将nginx绑定到1~11核上运行,可以达到23000~24000 qps(该步骤不做推荐,只做优化测试)

⑤正式业务的时候,可以用指定镜像创建CVM,在CVM中设置好网络中断。

ab测试,对于网络请求和吞吐的要求不是很高,但是对于CPU的处理和响应要求较高,所以是比较消耗CPU资源的。

但是RSS,RPS通过在队列和CPU不对等的情况下,通过四元组hash来将网络请求转发到不同的CPU来处理(软中断),虽然能提升网络IO,但是由于CPU处于不断的中断处理,反而降低了CPU计算处理的能力。所以这是为什么关闭RPS后,性能反而提升的原因。

扩展阅读:

RPS(Receive Packet Steering)主要是把软中断的负载均衡到各个cpu,简单来说,是网卡驱动对每个流生成一个hash标识,这个HASH值得计算可以通过四元组来计算(SIP,SPORT,DIP,DPORT),然后由中断处理的地方根据这个hash标识分配到相应的CPU上去,这样就可以比较充分的发挥多核的能力了。通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能,如果网卡本身支持多队列功能的话RPS就不会有任何的作用。该功能主要针对单队列网卡多CPU环境,如网卡支持多队列则可使用SMP irq affinity直接绑定硬中断。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

scrapy爬取免费代理IP存储到数据库构建自有IP池

有一部分网站是通过检测同一IP短时间内多次访问同一页面来进行反爬虫,为了应对这种反爬虫机制,使用IP代理就可以解决。可以利用scrapy写一个爬虫,爬取网上免费...

46850
来自专栏kl的专栏

DevOps自动化组件-RUNDECK介绍、开发、部署、使用

RunDeck 是用 Java开发的自动化部署持续集成的工具应用,项目已开源。runDeck的产品属性和jenkis类似。提供web界面和restapi来给用户...

1.1K90
来自专栏Ken的杂谈

ZooKeeper集群部署指南

ZooKeeper是一个开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现。ZooKeeper为分布式应用提供一致性服务,提供的功能包括:...

54110
来自专栏北京马哥教育

【图文并茂】一步步带你了解Web站点架构

1.1 http反向代理服务器 在web站点前端,我们需要搭建一个反向代理服务器,用于负责接受用户的请求,请求包括动态和静态的内容请求。一般反向代理服务器的部署...

50780
来自专栏Python中文社区

突破反爬虫的利器——开源IP代理池

专栏作者简介 七 夜 信息安全研究人员,比较擅长网络安全、逆向工程、Python爬虫开发、Python Web开发。 博客园:http://cnblogs.co...

1.2K90
来自专栏程序员互动联盟

浏览器开发系列第四篇:windows下如何调试最新chromium源码

接二连三的事情,时间比较紧张,但是还是没有把这个系列的文章丢掉,因为这也是对自己知识的总结吧。提倡大家多写写,以后再看的时候会有种莫名的小激动。 上周写的是ch...

41680
来自专栏.Net移动开发

.Net语言 APP开发平台——Smobiler学习日志:基于Access数据库的Demo

说明:该demo是基于Access数据库进行客户信息的新增、查看、编辑 新增客户信息和客户列表

16720
来自专栏程序员互动联盟

linux设备驱动第一篇:设备驱动程序简介

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义...

538100
来自专栏zhisheng

听说你要做网站

现代 Web 后端技术超入门 引言 现在房价这么高,作为一个程序员只能靠做个网站看能不能卖出 100 万这样搏一手了。这里尝试介绍一下现代 Web 后端并解释一...

39380
来自专栏分享达人秀

开发IDE大升级,终于迎来了Android Studio

通过前面几期的学习,我们知道了Android的前世今生,也了解了Android的系统架构和应用组件,也连续用了几期来学习Android开发环境的搭建,不...

270100

扫码关注云+社区

领取腾讯云代金券