通过性能测试配置递增线程
除了Grinder引擎提供的进程斜坡之外,nGrinder 3.3还支持线程斜坡。因为进程是非常昂贵的资源,在单个核心机器中,大约10是可执行进程的最大计数。因此,到目前为止,流程渐变只支持非常有限的渐变(从0到10)。在nGrinder 3.3中,可以通过配置启用线程斜坡。因为每个进程可以执行100多个线程,这使得过渡比进程过渡非常平稳。
通过在右上角选择线程并在vuser部分提供足够的线程数,图表将显示平滑的渐变图表。执行测试之后,您可以在详细的报告中看到如下结果。随着时间的推移,vuser的数量也在增加,TPS也在增加。
通过脚本递增线程
3.3版本之前的nGrinder支持进程渐变作为默认特性。如果用户希望逐步增加负载,那么用户可以在测试配置页面的过渡面板上设置许多进程以及如何增加它们。
这是一个渐进的过程。如果您喜欢在过渡过程中执行10个步骤,那么您应该将流程计数设置为至少10个步骤。如果需要更多,应该设置更多进程数量。
但是,这些流程需要调用大量资源。代理中的100个进程是不现实的。这会导致代理机器内存不足错误。
假设你想知道系统从哪个TPS水平开始饱和。
在这种情况下,您可以使用线程级别渐变。您只需要在脚本中添加以下代码。
Jython
# -*- coding:utf-8 -*-
# A simple example using the HTTP plugin that shows the retrieval of a
# single page via HTTP.
#
# This script is auto generated by ngrinder.
#
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from net.grinder.plugin.http import HTTPPluginControl
from HTTPClient import NVPair
control = HTTPPluginControl.getConnectionDefaults()
control.setTimeout(30000)
test1 = Test(1, "Test1")
request1 = HTTPRequest();
test1.record(request1)
class TestRunner:
def initialSleep( self ):
sleepTime = grinder.threadNumber * 1000 # 1 seconds per thread
grinder.sleep(sleepTime, 0)
def __call__( self ):
if grinder.runNumber == 0: self.initialSleep()
grinder.statistics.delayReports=True
result = request1.GET("http://www.google.com")
if result.getText().find("Google") != -1 :
grinder.statistics.forLastTest.success = 1
else :
grinder.statistics.forLastTest.success = 0
Groovy
如果您使用的是nGrinder 3.2.3或更高版本,那么应该在代码中加入sleep逻辑。
/**
* A simple example using the HTTP plugin that shows the retrieval of a
* single page via HTTP.
*
* This script is auto generated by ngrinder.
*
* @author ${userName}
*/
@RunWith(GrinderRunner)
class Test1 {
public static GTest test;
public static HTTPRequest request;
@BeforeProcess
public static void beforeClass() {
test = new GTest(1, "aa000000");
request = new HTTPRequest();
test.record(request);
grinder.logger.info("before process.");
}
@BeforeThread
public void beforeThread() {
grinder.statistics.delayReports=true;
grinder.logger.info("before thread.");
}
public void initialSleep() {
grinder.sleep(grinder.threadNumber * 1000, 0)
}
@Test
public void test(){
if (grinder.runNumber == 0) {
initialSleep()
}
HTTPResponse result = request.GET("http://www.google.com");
if (result.statusCode == 301 || result.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", result.statusCode);
} else {
assertThat(result.statusCode, is(200));
}
}