package test;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.CountDownLatch;
import org.apache.log4j.Logger;
public class CallHttpRequest implements Runnable {
private static Logger log = Logger.getLogger(CallHttpRequest.class);
public static int successRequest = 0;
public static int failRequest = 0;
public static int timeOutRequest = 0;
private final String hostString = "http://localhost:";
private String port;
private String puductPartURL;
private CountDownLatch begin;
private CountDownLatch end;
CallHttpRequest(String port, String puductPartURL, CountDownLatch begin,
CountDownLatch end) {
this.port = port;
this.puductPartURL = puductPartURL;
this.begin = begin;
this.end = end;
}
private String makeFullURL() {
return hostString + port + puductPartURL;
}
private static synchronized void incrementSuccessCount(){
successRequest++;
}
private static synchronized void incrementFailCount(){
failRequest++;
}
private static synchronized void incrementTimeOutCount(){
timeOutRequest++;
}
@Override
public void run() {
String urlStr = makeFullURL();
URL url;
try {
begin.await();
url = new URL(urlStr);
URLConnection URLconnection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) URLconnection;
httpConnection.setConnectTimeout(3000);
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
incrementSuccessCount();
} else {
incrementFailCount();
}
} catch (SocketTimeoutException e) {
incrementTimeOutCount();
log.error(e.getMessage(), e);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
end.countDown();
}
}
}
package test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
public class ParseUrl {
private static Logger log = Logger.getLogger(ParseUrl.class);
private static final String[] portArray = new String[] { "1111", "2222",
"3333" };
/*从文件中使用正则解析出url的部分信息,下面正则是将 以/开头的,非空白字符结尾的字符串取出,如“/abcc空格”字符串,\s为任意的空白符 */
public static ArrayList<String> fetchUrlFromFile(String str) {
ArrayList<String> arrayList = new ArrayList<String>();
Pattern urlPattern = Pattern.compile("/[^\\s]+");
//Pattern urlPattern = Pattern.compile("/[\\S]+");
Matcher matcher = urlPattern.matcher(str);
while (matcher.find()) {
arrayList.add(matcher.group());
}
return arrayList;
}
public static void main(String[] args) throws Exception {
CountDownLatch begin = new CountDownLatch(1);
StringBuilder stringBuilder = new StringBuilder();
String filePath = args[0];
FileReader fr = new FileReader(filePath);
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
stringBuilder.append(br.readLine());
}
String stringAll = stringBuilder.toString();
ArrayList<String> arrayList = fetchUrlFromFile(stringAll);
int allRequestSize = arrayList.size();
log.info("all request size is " + allRequestSize);
//设置最大的并发数量为60
ExecutorService exec = Executors.newFixedThreadPool(60);
CountDownLatch end = new CountDownLatch(allRequestSize);
// int i = 0;
for (String str : arrayList) {
exec.execute(new CallHttpRequest(portArray[0], str, begin, end));
/*如果想测试60个线程并发的访问,发配到同一台服务器上的两个tomcat,就用下面注释掉的代码
* if (i % 2 == 0) {
exec.execute(new CallHttpRequest(portArray[0], str, begin, end));
} else if (i % 2 == 1) {
exec.execute(new CallHttpRequest(portArray[1], str, begin, end));
} */
// i++;
}
long startTime = System.currentTimeMillis();
//当60个线程,初始化完成后,解锁,让六十个线程在4个双核的cpu服务器上一起竞争着跑,来模拟60个并发线程访问tomcat
begin.countDown();
try {
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
log.info("all url requests is done!");
log.info("the success size: " + CallHttpRequest.successRequest);
log.info("the fail size: " + CallHttpRequest.failRequest);
log.info("the timeout size: " + CallHttpRequest.timeOutRequest);
double successRate = (double)CallHttpRequest.successRequest / allRequestSize;
log.info("the success rate is: " + successRate*100+"%");
long endTime = System.currentTimeMillis();
long costTime = endTime - startTime;
log.info("the total time cost is: " + costTime + " ms");
log.info("every request time cost is: " + costTime / allRequestSize
+ " ms");
}
exec.shutdown();
log.info("main method end");
}
}
分享到:
相关推荐
1. **压力测试工具选择**:为了准确评估Tomcat的性能,我们需要使用压力测试工具模拟多用户并发访问。这些工具通常通过录制或编写脚本来重复请求页面,例如Apache Benchmark和JMeter。选择工具时,要确保它们支持Web...
性能测试是一个系统性的工程,涉及到工具的选择、外部环境的优化以及Tomcat本身的配置等多个方面。通过对这些环节进行综合考量和细致调整,可以有效提升Tomcat服务器的性能,确保其在高负载情况下也能保持稳定高效的...
- **LoadRunner**:一个强大的商业性能测试工具,可以模拟大量的虚拟用户同时访问Web应用,从而检测系统的性能瓶颈。 2. **测试环境的设置**: - 客户端和服务器端是否在同一台机器上? - 测试期间服务器是否还...
2. 使用分布式测试:当单个JMeter实例无法模拟足够大的并发量时,可以设置分布式测试,利用多台机器协同工作,提高测试压力。 3. 脚本录制与回放:JMeter提供录制用户操作的功能,可以方便地生成测试脚本,用于模拟...
- **构建Test Plan**:在JMeter中,首先创建一个`ThreadGroup`,配置线程数(`Number of Threads`)、启动线程速率(`Ramp-Up Period`)和循环次数(`Loop Count`),来模拟多用户并发行为。 - **添加WebService请求**:...
1. **并发测试**:模拟多个用户同时访问,检查在高并发下连接池是否能稳定工作,是否出现连接泄漏或资源耗尽的问题。 2. **响应时间**:测试不同连接池在处理相同请求时的响应时间,对比哪个连接池的处理速度更快。 ...
3.3 多TOMCAT测试:在Nginx后端添加多个Tomcat实例,再次进行压力测试,评估负载均衡效果及整体性能。 4. 结果分析 (这部分应包含具体的测试数据、图表和结论,但在这里由于篇幅限制未给出) 5. 总结与建议 通过...
4. **执行测试**:启动测试场景,模拟多个虚拟用户并发访问Tomcat服务器,同时监控服务器的各项性能指标。 5. **分析结果**:测试完成后,使用LoadRunner的分析器分析收集到的数据,找出性能瓶颈和异常情况。 描述...
为了准确评估Web服务器的性能,通常会使用压力测试工具来模拟高并发访问场景。这些工具通过不断向服务器发送大量请求来制造压力,帮助开发者识别系统的瓶颈所在。目前市面上有许多可用的工具,包括但不限于: - **...
ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL 地址进行访问。它的测试目标是基于URL 的,因此, 既可以用来测试Apache的负载压力, 也可以测试nginx 、lighthttp、tomcat、IIS 等其它 Web 服务器的...
- **负载均衡**:通过设置多个Tomcat实例或配合负载均衡器,分摊请求压力,避免单点瓶颈。 - **集成Web服务器处理静态内容**:例如与Apache结合,让Apache负责静态文件,减轻Tomcat负担。 - **调整线程池**:...
一个测试计划通常包括一个或多个线程组(ThreadGroups)、逻辑控制器(LogicController)、采样生成控制器(SampleGeneratingControllers)、监听器(Listener)、定时器(Timer)、断言(Assertions)和配置元素...
这包括负载测试(模拟多用户并发访问)、压力测试(逐渐增加负载直至系统崩溃)、耐久测试(长时间高负载运行)和容量规划(确定系统最大处理能力)。 二、Servlet与性能测试 1. Servlet基础:Servlet是Java编程...
AB工具的主要目的是模拟多个并发用户向服务器发送请求,从而帮助分析服务器处理请求的能力和速度。 使用AB工具进行测试的基本命令格式如下: ```bash ab -n <请求次数> -c <并发用户数> ``` - `-n` 参数指定了总...
它可以创建多个并发访问线程,模拟多用户同时访问同一URL,不仅适用于Apache,还可以用于测试其他Web服务器,如Nginx、Lighttpd、Tomcat、IIS等。由于ab工具对发出负载的系统资源需求较低,但却能给目标服务器带来高...
- 使用JMeter进行压力测试,模拟大量并发请求,观察系统性能。 - 使用命令行工具或图形化界面工具监控服务器资源使用情况。 3. **优化思路** - **Connector配置优化**: - Connector是Tomcat中负责接收HTTP...
- 使用JMeter、 Gatling等压力测试工具,模拟高并发场景,找出性能瓶颈。 8. **缓存策略**: - 应用级缓存,如Ehcache或Guava Cache,可以降低数据库查询频率,提高响应速度。 9. **JNDI资源优化**: - 合理...
例如,创建一个名为“tomcat”的用户,赋予相应的角色权限。 2. **Tomcat运行模式** Tomcat有三种运行模式:Bio(阻塞I/O)、NIO(非阻塞I/O)和APR(使用操作系统级别的异步I/O)。NIO模式利用Java的异步I/O技术...
例如,你可以运行以下命令模拟多个并发用户请求: ```bash ab -n 1000 -c 100 http://example.com/ ``` 这会发送1000个请求,每次100个并发请求。观察服务器的响应时间和错误率,可以帮助调整限流策略。 另外,限...