虚拟机压力测试延迟高的可能原因及 ILPIP 配置 / 查询脚本
测试初期 Client VM 的延迟结果正常; 测试后期 Client VM 的延迟偶尔突增/连接失败,越后期超高延迟(比如 30 秒)出现越多;
问题分析
造成这一现象的根本原因很可能是 SNAT(Source NAT)数量过高。
什么是 SNAT 呢?
对于 ASM 虚拟机,出于可拓展性的考虑,云服务中每台虚拟机都隐藏在云服务面向公网的 VIP 之后,各自有自己的 DIP。
对于 ARM 虚拟机,默认会分配一个面向公网的 VIP 和一个面向内部的 DIP。用户可以自定义设置,不为 ARM 虚拟机分配公网 IP。
当这些未部署特定公网 IP 的虚拟机访问公网资源时,出站流量将通过 NAT 层(更改虚拟机的 DIP 和端口为面向公网的 VIP 和对应端口,以便流量被路由,否则虚拟机单凭 DIP 无法在公网中被路由)。
这个过程即 SNAT:更改源信息(源 IP 地址和源端口)。
SNAT 数量建议上限是多少?
出于整体性能考虑,Azure 为每个虚拟机预分配了 160 个源端口。虚拟机访问公网资源时, Azure 会为该会话分配这 160 个中可用的端口。如果同时有 160 个请求正在运行,第 161 个及之后的请求需等 Azure 分配了新的端口才能使用。
当用户的并发非常高时,Azure 分配新端口的速度可能不足以保障每个请求都能及时获得 Azure 分配的 SNAT 端口。未被分配到端口的请求就可能出现出站连接尝试失败 / 延迟高的情况。
解决方法
资源管理器模式
对于 ARM 部署的虚拟机,可以为它的网卡 NIC 配置公网 IP 通过 Portal 或 PowerShell 创建公网 IP,具体操作步骤可以参考官网:创建公共 IP 地址。
在 Portal 上虚拟机对应的 "网络接口" 内, 点击IP 配置,配置对应的公共 IP 地址 即可。
经典模式
一般对此的解决方法是为这台高负载的机器配置独有的公网 IP —— 实例层级公共 IP(ILPIP)。
对于 ASM 部署的虚拟机,将创建的公网 IP 配置为虚拟机的 ILPIP:
ILPIP(Instance Level Public IP) 为用户虚拟机提供了一个独有的公网 IP,于是用户可用此 IP 直接访问虚拟机,出站流量也无需作 SNAT。
具体说明可参考官网:实例层级公共 IP(经典)概述。
具体配置方法如下,具体参数请根据实际情况修改。
如何检索虚拟机的 ILPIP 信息:
若要查看虚拟机的 ILPIP 信息,请运行以下 PowerShell 命令,然后观察 PublicIPAddress 和 PublicIPName 的值:
PowerShell复制
Get-AzureVM-NameFTPInstance-ServiceNameFTPService
预期输出:
复制
DeploymentName : FTPService
Name : FTPInstance
Label :
VM : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.PersistentVM
InstanceStatus : ReadyRole
IpAddress : 100.74.118.91
InstanceStateDetails :
PowerState : Started
InstanceErrorCode :
InstanceFaultDomain : 0
InstanceName : FTPInstance
InstanceUpgradeDomain : 0
InstanceSize : Small
HostName : FTPInstance
AvailabilitySetName :
DNSName : http://ftpservice888.chinacloudapp.cn/
Status : ReadyRole
GuestAgentStatus : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.GuestAgentStatus
ResourceExtensionStatusList : {Microsoft.Compute.BGInfo}
PublicIPAddress : 104.43.142.188
PublicIPName : ftpip
NetworkInterfaces : {}
ServiceName : FTPService
OperationDescription : Get-AzureVM
OperationId : 568d88d2be7c98f4bbb875e4d823718e
OperationStatus : OK
如何向现有的虚拟机配置 ILPIP
运行以下 PowerShell 命令(仅支持使用 Powershell 配置 ILPIP),下面的示例为 FTPInstance 这台虚拟机新建了一个名为 ftpip2 的 ILPIP:
复制
Get-AzureVM -ServiceName FTPService -Name FTPInstance | Set-AzurePublicIP -PublicIPName ftpip2 | Update-AzureVM
配置 ILPIP 是否会造成虚拟机重启?
用户可能担心此操作是否会造成虚拟机重启、业务中断等等。
配置 ILPIP 不会导致虚拟机重启,配置成功后 Cloud Service IP 和 ILPIP 都可以用来连接虚拟机。
ILPIP 能否被保留 / 设置为静态?
ILPIP 不可设置为静态。如有需要建议部署 ARM 的虚拟机,并设置虚拟机的 Public IP(VIP)为 Reserved IP。
统计现有的 ILPIP
ILPIP 单独计价,具体价格可以参考:IP 地址价格详情。
每个订阅最多可以分配 5 个 ILPIP 地址。然而,查看订阅下已经使用了多少个 ILPIP 只能通过查询每一台虚拟机看是否有 PublicIP Address 项,过程比较费时。
具体查询的 PowerShell 命令如下:
PowerShell复制
$vm=Get-AzureVM-Namexxx-ServiceNamexxx
其中$vm.publicIPAddress即 ILPIP。 为便于查询某订阅下的所有 ILPIP,我们在 GitHub 中提供自动化获取订阅下所有 ILPIP 的脚本供用户使用,直接下载后在 PowerShell 中运行即可。
ILPIP 带来的安全问题
配置 ILPIP 后相当于直接将虚拟机暴露在公网,安全方面建议在虚拟机内部配置防火墙。 更多详细的安全策略解释可以参考:Microsoft 云服务和网络安全性,这里也提到了外围网络的安全概念和具体示例。
立即访问http://market.azure.cn
虚拟机压力测试延迟高的可能原因及 ILPIP 配置 / 查询脚本的更多相关文章
- laravel+Redis简单实现队列通过压力测试的高并发处理
秒杀活动 在一般的网络商城中我们会经常接触到一些高并发的业务状况,例如我们常见的秒杀抢购等活动, 在这些业务中我们经常需要处理一些关于请求信息过滤以及商品库存的问题. 在请求中比较常见的状况是同一用户 ...
- 使用Jmeter进行压力测试结果偏差较大原因分析
Apache软件基金会(ASF)是一家总部位于美国的非营利性慈善组织.ASF的所有产品都通过公共论坛的在线协作开发,并从美国境内的中央服务器分发.Jmeter是ASF的一款开源免费软件 ,在国内被很多 ...
- Jmeter接口测试+压力测试+环境配置+证书导出
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...
- 压力测试+接口测试(工具jmeter)
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因 为jmeter是java开发的,所以运行的时候必须 ...
- Jmeter压力测试和接口测试
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...
- JMeter接口测试和压力测试
JMeter接口测试和压力测试 JMeter可以做接口测试和压力测试.其中接口测试的简单操作包括做http脚本(发get/post请求.加cookie.加header.加权限认证.上传文件).做web ...
- 【转载】Jmeter接口测试+压力测试
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要 ...
- Jmeter接口测试+压力测试(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/github_27109687/artic ...
- 使用JMeter进行MySQL的压力测试
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 前言 1. JMeter安装 2. 导入MyS ...
随机推荐
- JDK的windows和Linux版本之下载(图文详解)
不多说,直接上干货! 简单说下,Eclipse需要Jdk,MyEclipse有自带的Jdk,除非是版本要求 http://www.oracle.com/technetwork/java/javase/ ...
- JavaScript -- Table
-----048-Table.html----- <!DOCTYPE html> <html> <head> <meta http-equiv="c ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- docker cgroup 技术之memory(首篇)
测试环境centos7 ,内核版本4.20 内核使用cgroup对进程进行分组,并限制进程资源和对进程进行跟踪.内核通过名为cgroupfs类型的虚拟文件系统来提供cgroup功能接口.cgroup有 ...
- springboot+zuul(一)------实现自定义过滤器、动态路由、动态负载。
参考:https://blog.csdn.net/u014091123/article/details/75433656 https://blog.csdn.net/u013815546/articl ...
- 将本地代码提交到github
最近练习了freemarker 做了个代码生成工具,想提交到github上,在本地进行了提交,执行如下些命令 git init git add . * git commit -m "comm ...
- linux下开启、关闭、重启mysql服务
linux下开启.关闭.重启mysql服务命令 一. 启动1.使用 service 启动:service mysql start2.使用 mysqld 脚本启动:/etc/inint.d/mysql ...
- es6学习笔记9--函数的扩展
函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接写在参 ...
- C指针与内存
C指针与内存 指针是C / C++ 中重要的构造类型,指针赋予了C / C++程序直接访问和修改内存的能力.C / C++的许多重要应用,如编译.OS.嵌入式开发都依赖于这种能力. 冯诺依曼体系的计算 ...
- 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理
在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...