Visual Studio 使用 Json 上下文参数加载 CPU 使用率飙升
Visual Studio Load CPU usage skyrockets with Json Context Parameters
我使用 Visual Studio 2015 记录了负载测试使用的 WebPerformance 测试。在初始记录之后,我可以 运行 20 个同时使用的用户,而使用率只有大约 25% CPU。然而,我正在测试的网站使用 Json,因此为了使测试更真实,我为 Json 添加了自定义提取规则:
[DisplayName("JSON Extraction Rule")]
[Description("Extracts the specified JSON value from an object.")]
public class JsonExtractionRule : ExtractionRule
{
[DisplayName("Name/path of attribute")]
[Description("String to fetch the attribute from the Json Object.")]
public string Name { get; set; }
[DisplayName("Fetch 4 first characters only")]
[Description("Set to true if only the first 4 characters of the attribute should be fetched.")]
public Boolean fourFirstCharacters { get; set; }
public override void Extract(object sender, ExtractionEventArgs e)
{
if (e.Response.BodyString != null)
{
var json = e.Response.BodyString;
if (json.StartsWith("["))
{
json = "{\"array\":" + json + "}";
}
var data = JObject.Parse(json);
if (data != null)
{
var attribute = data.SelectToken(Name).ToString();
if (fourFirstCharacters)
{
e.WebTest.Context.Add(this.ContextParameterName, attribute.Substring(0, 4));
} else
{
e.WebTest.Context.Add(this.ContextParameterName, attribute);
}
e.Success = true;
return;
}
}
e.Success = false;
e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", Name);
}
}
我用它从响应中提取了几个 Json 属性,并使用上下文参数将它们添加到后续请求中。
在像这样添加多个提取并将一些上下文参数传递给请求后,我的负载测试达到 100% CPU 使用率,同时只有 5 个用户。
上述提取规则在 WebPerformance 测试中使用了大约 20 次,在任何单个响应中使用了 0-5 次。 Json 响应和请求的长度约为 2k 个字符。最大的提取包含大约 500 个字符。
我可以理解响应时间是否会因为更现实的 Json 被通过而增加或类似的东西。但是我不明白为什么 CPU 使用率飙升?请求的响应时间是否会影响 CPU 负载测试的使用?
在请求中实现 Json 的提取 + 上下文参数是一种糟糕的(在 CPU 用法的上下文中)方式吗?有没有更聪明的方法可以节省 CPU 的使用量?
大多数 CPU 用法似乎是由在验证规则中使用上述自定义 Json 提取引起的。我删除了它,因为验证并不重要,而且一切 运行 更顺利。
我使用 Visual Studio 2015 记录了负载测试使用的 WebPerformance 测试。在初始记录之后,我可以 运行 20 个同时使用的用户,而使用率只有大约 25% CPU。然而,我正在测试的网站使用 Json,因此为了使测试更真实,我为 Json 添加了自定义提取规则:
[DisplayName("JSON Extraction Rule")]
[Description("Extracts the specified JSON value from an object.")]
public class JsonExtractionRule : ExtractionRule
{
[DisplayName("Name/path of attribute")]
[Description("String to fetch the attribute from the Json Object.")]
public string Name { get; set; }
[DisplayName("Fetch 4 first characters only")]
[Description("Set to true if only the first 4 characters of the attribute should be fetched.")]
public Boolean fourFirstCharacters { get; set; }
public override void Extract(object sender, ExtractionEventArgs e)
{
if (e.Response.BodyString != null)
{
var json = e.Response.BodyString;
if (json.StartsWith("["))
{
json = "{\"array\":" + json + "}";
}
var data = JObject.Parse(json);
if (data != null)
{
var attribute = data.SelectToken(Name).ToString();
if (fourFirstCharacters)
{
e.WebTest.Context.Add(this.ContextParameterName, attribute.Substring(0, 4));
} else
{
e.WebTest.Context.Add(this.ContextParameterName, attribute);
}
e.Success = true;
return;
}
}
e.Success = false;
e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", Name);
}
}
我用它从响应中提取了几个 Json 属性,并使用上下文参数将它们添加到后续请求中。
在像这样添加多个提取并将一些上下文参数传递给请求后,我的负载测试达到 100% CPU 使用率,同时只有 5 个用户。
上述提取规则在 WebPerformance 测试中使用了大约 20 次,在任何单个响应中使用了 0-5 次。 Json 响应和请求的长度约为 2k 个字符。最大的提取包含大约 500 个字符。
我可以理解响应时间是否会因为更现实的 Json 被通过而增加或类似的东西。但是我不明白为什么 CPU 使用率飙升?请求的响应时间是否会影响 CPU 负载测试的使用?
在请求中实现 Json 的提取 + 上下文参数是一种糟糕的(在 CPU 用法的上下文中)方式吗?有没有更聪明的方法可以节省 CPU 的使用量?
大多数 CPU 用法似乎是由在验证规则中使用上述自定义 Json 提取引起的。我删除了它,因为验证并不重要,而且一切 运行 更顺利。