您的位置:

JMeter监控服务器资源

一、JMeter监控服务器资源简介

JMeter是一个开源的Java应用程序,主要用于完整的性能测试、功能测试和负载测试。在jmeter性能测试中,我们强烈建议通过监测资源利用情况,来收集关于系统性能瓶颈分析的指标。

二、JMeter监控服务器资源的实现

1.自定义插件

自定义插件是JMeter官方提供的一种插件扩展机制,使用自定义插件可以为JMeter新增自己想要的监控器和聚类器等组件。它使用Java语言编写, 插件可以使用Java API, 从而提供更多的机会来扩展JMeter。 虽然自定义监视器通常需要更复杂的代码,但它可以轻松地将信息存储到日志文件或数据库中,或者将它们显示在GUI控制面板中。

2.通过命令行方式获取资源利用率

可以通过在命令行运行JMeter时,使用jconsole和JVM参数(如 jmxremote.port=端口)的方式连接jconsole,获取服务器资源利用率信息。 例如,在命令行中启动JMeter:

jmeter -JREMOTE_HOSTS=yourServer -JREMOTE_HOST_PORT=portnumber -JREMOTE_HOST_USER=user -JREMOTE_HOST_PASSWORD=password -JREMOTE_ENABLE=true

3.使用容器化技术进行监控

在容器化架构中,Docker和Kubernetes是最常见的技术。我们可以使用Docker和Kubernetes来监测容器和集群资源的利用情况。 Docker可以使用命令"docker stats"来获取容器的资源利用率信息。而在Kubernetes中,有一些工具可以用于监控容器和集群,例如:Prometheus,Grafana,InfluxDB等。

三、JMeter监控服务器资源的使用场景

1.系统性能调优

利用JMeter监控服务器资源,可以帮助系统管理员更好地了解系统瓶颈所在,以及找到优化系统性能、提高系统吞吐量的途径。

2.被动负载测试

当一个系统在运行时,我们可以利用JMeter配合监控器来进行被动负载测试。这种被动负载测试的好处是能够让我们对系统在运行状态下的瓶颈分析,从而得到系统可扩展性和系统运行状态下的性能指标。

3.主动负载测试

在负载测试中,我们可以使用JMeter监控服务器资源,统计请求发出时的一系列指标,包括请求响应时间、并发用户数、服务器负载、系统资源等等。根据这些指标,我们可以通过JMeter本身的聚合器和监视器等组件进行图表化展示,比较直观地评估系统性能和可靠性。

四、代码示例

JMeter自定义插件示例

下面是一个简单的示例,演示了如何使用JMeter的自定义插件来获得Web服务器的负载信息,并将其显示在控制面板中:

import org.apache.jmeter.samplers.SampleSaveConfiguration;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.visualizers.gui.AbstractVisualizer;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ResourceMonitorVisualizer extends AbstractVisualizer {
private static final long serialVersionUID = 240L;
private static final Logger log = LoggingManager.getLoggerForClass();
private JTextField throughputField;
private JTextField cpuField;
private JTextField memoryField;
private JTextField threadsField;
public ResourceMonitorVisualizer() {
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH);
JPanel displayPanel = new JPanel(new GridLayout(4, 2));
displayPanel.setPreferredSize(new Dimension(320, 120));
displayPanel.add(new JLabel("Throughput (requests/second)"));
throughputField = new JTextField(10);
throughputField.setEditable(false);
displayPanel.add(throughputField);
displayPanel.add(new JLabel("CPU (% used by JMeter)"));
cpuField = new JTextField(10);
cpuField.setEditable(false);
displayPanel.add(cpuField);
displayPanel.add(new JLabel("Memory (MB used by JMeter)"));
memoryField = new JTextField(10);
memoryField.setEditable(false);
displayPanel.add(memoryField);
displayPanel.add(new JLabel("Active Threads"));
threadsField = new JTextField(10);
threadsField.setEditable(false);
displayPanel.add(threadsField);
add(displayPanel, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout());
add(buttonPanel, BorderLayout.SOUTH);
}
public void add(SampleResult sample) {
SampleSaveConfiguration ssc = getSaveConfig();
Vector data = new Vector();
data.add(new Long(sample.getTime()));
data.add(sample.getThreadName());
data.add(sample.getSampleLabel());
data.add(sample.isSuccessful() ? "true" : "false");
data.add(new Long(sample.getBytes()));
data.add(sample.getContentType());
data.add(sample.getResponseCode());
data.add(sample.getResponseMessage());
data.add(sample.getSamplerData());
data.add(sample.getThreadGroup());
data.add(new Long(sample.getResponseTime()));
JMeterUtils.runSafe(new Runnable() {
public void run() {
throughputField.setText(String.format("%.0f", getThroughput()));
cpuField.setText(String.format("%.0f", getCpuUtilization()));
memoryField.setText(String.format("%d", getMemoryUse()));
threadsField.setText(String.format("%d", getActiveThreads()));
}});
}
public String getLabelResource() {
return "Resource Monitor";
}
public void clearData() {
throughputField.setText("");
cpuField.setText("");
memoryField.setText("");
threadsField.setText("");
}
public boolean isStats() {
return true;
}
public void updateGui() {
}
public void clearGui() {
}
public void setSampler(Sampler sampler) {
}
private double getThroughput() {
long now = System.currentTimeMillis();
long delta = now - sum.getTime();
if (delta > 0) {
return (double) sum.getCount() / (double) delta * 1000.0;
} else {
return 0.0;
}
}
private double getCpuUtilization() {
return ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage() * 100.0 / Runtime.getRuntime().availableProcessors();
}
private long getMemoryUse() {
Runtime runtime = Runtime.getRuntime();
return (runtime.totalMemory() - runtime.freeMemory()) / 1048576;
}
private int getActiveThreads() {
return JMeterContextService.getThreadCounts().activeThreads;
}
}


为JMeter监控器添加命令行参数

可以使用以下命令在监控服务器资源时启用JMeter监视器:

jmeter -JREMOTE_HOSTS=yourServer -JREMOTE_HOST_PORT=portnumber -JREMOTE_HOST_USER=user -JREMOTE_HOST_PASSWORD=password -JREMOTE_ENABLE=true

Docker中检查容器的资源利用率

使用"docker stats"命令可以查看Docker容器的资源利用率:

docker stats container_name

Kubernetes中使用Prometheus监控资源使用率

使用Prometheus来监控Kubernetes集群资源利用率。Prometheus是一种度量工具,可以存储、检索和可视化数据。 首先,需要在Kubernetes上安装Prometheus Operator。然后,Kubernetes集群上的每个Pod都需要将指标发送给Prometheus。指标可以是CPU利用率、内存利用率等等。 数据流转链路为:Kubernetes活动 -> Prometheus数据抓取器 -> 网络传输 -> Prometheus -> Grafana。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myservice-monitor
spec:
selector:
matchLabels:
app: myservice
endpoints:
- port: myservice-port
顶部