【发布时间】:2016-09-10 18:54:22
【问题描述】:
我知道在 JMeter HTTP Request 采样器中使用内置 Java HTTP 客户端时,连接可能会或可能不会被池化,具体取决于 JVM 实现和配置。
但是,在使用 HttpClient3.1 或 HttpClient4 时,JMeter 是否池化连接?
在 JMeter 文档中有一些提示,但文档中没有明确说明。
如果有,有没有办法控制连接池?例如,可以设置池的大小吗?
【问题讨论】:
我知道在 JMeter HTTP Request 采样器中使用内置 Java HTTP 客户端时,连接可能会或可能不会被池化,具体取决于 JVM 实现和配置。
但是,在使用 HttpClient3.1 或 HttpClient4 时,JMeter 是否池化连接?
在 JMeter 文档中有一些提示,但文档中没有明确说明。
如果有,有没有办法控制连接池?例如,可以设置池的大小吗?
【问题讨论】:
JMeter 在使用 HttpClient3.1 或 HttpClient4 时会进行一些 HTTP 连接池。
在这两种情况下,连接都是按线程池化的。连接不跨线程共享。
使用 HttpClient3.1 时,JMeter 在每个线程上使用SimpleHttpConnectionManager 的实例。
使用 HttpClient4 时,JMeter 在每个线程上使用 PoolingClientConnectionManager 子类的实例,并使用 PoolingClientConnectonManager 的默认设置(每个路由 2 个连接,最大连接数为 20)。
JMeter 不提供控制连接池参数的机制。
我必须去 JMeter 的源代码才能找到这个答案。请参阅以下链接以供参考(2.13 标记代码):
注意:这个答案对于 JMeter 2.13 是准确的。对于其他版本的 JMeter,答案可能会有所不同。
【讨论】:
JMeter 3 更新:在您的 HTTPSampler 配置中,您可以使用条目
<boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
<stringProp name="HTTPSampler.concurrentPool">10</stringProp>
根据此代码片段指定连接池大小(来自http://svn.apache.org/viewvc/jmeter/tags/v3_0/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java?view=markup line 785ff)
if(this.testElement.isConcurrentDwn()) {
try {
int maxConcurrentDownloads = Integer.parseInt(this.testElement.getConcurrentPool());
connManager.setDefaultMaxPerRoute(Math.max(maxConcurrentDownloads, connManager.getDefaultMaxPerRoute()));
} catch (NumberFormatException nfe) {
// no need to log -> will be done by the sampler
}
}
}
通过 JMeter UI 的配置有点古怪:
将 HTTP 采样器配置视图切换到“高级”,勾选“检索所有嵌入式资源”,然后勾选“并行下载”并输入一个数字。如果您不希望 JMeter 解析您对图像的响应,则可以取消勾选“检索所有嵌入的资源”
【讨论】: