`

使用多线程模拟多用户并发访问一个或多个tomcat,测试性能

阅读更多
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 楼 chen_yi_ping 2016-08-09  
请问楼主,怎么测试?
String filePath = args[0]; 
这个怎么赋值?

相关推荐

    Tomcat性能的测试

    1. **压力测试工具选择**:为了准确评估Tomcat的性能,我们需要使用压力测试工具模拟多用户并发访问。这些工具通常通过录制或编写脚本来重复请求页面,例如Apache Benchmark和JMeter。选择工具时,要确保它们支持Web...

    tomcat性能测试

    性能测试是一个系统性的工程,涉及到工具的选择、外部环境的优化以及Tomcat本身的配置等多个方面。通过对这些环节进行综合考量和细致调整,可以有效提升Tomcat服务器的性能,确保其在高负载情况下也能保持稳定高效的...

    Tomcat性能调整.pdf

    - **LoadRunner**:一个强大的商业性能测试工具,可以模拟大量的虚拟用户同时访问Web应用,从而检测系统的性能瓶颈。 2. **测试环境的设置**: - 客户端和服务器端是否在同一台机器上? - 测试期间服务器是否还...

    用JMeter来测试Tomcat的性能.rar

    2. 使用分布式测试:当单个JMeter实例无法模拟足够大的并发量时,可以设置分布式测试,利用多台机器协同工作,提高测试压力。 3. 脚本录制与回放:JMeter提供录制用户操作的功能,可以方便地生成测试脚本,用于模拟...

    Tomcat服务器线程控制配置以及JMeter进行WebService测试

    - **构建Test Plan**:在JMeter中,首先创建一个`ThreadGroup`,配置线程数(`Number of Threads`)、启动线程速率(`Ramp-Up Period`)和循环次数(`Loop Count`),来模拟多用户并发行为。 - **添加WebService请求**:...

    DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试代码

    1. **并发测试**:模拟多个用户同时访问,检查在高并发下连接池是否能稳定工作,是否出现连接泄漏或资源耗尽的问题。 2. **响应时间**:测试不同连接池在处理相同请求时的响应时间,对比哪个连接池的处理速度更快。 ...

    nginx+tomcat测试报告.doc

    3.3 多TOMCAT测试:在Nginx后端添加多个Tomcat实例,再次进行压力测试,评估负载均衡效果及整体性能。 4. 结果分析 (这部分应包含具体的测试数据、图表和结论,但在这里由于篇幅限制未给出) 5. 总结与建议 通过...

    loadrunner监控tomcat脚本

    4. **执行测试**:启动测试场景,模拟多个虚拟用户并发访问Tomcat服务器,同时监控服务器的各项性能指标。 5. **分析结果**:测试完成后,使用LoadRunner的分析器分析收集到的数据,找出性能瓶颈和异常情况。 描述...

    优秀的软件工程师必须掌握的几个性能测试工具.pdf

    ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL 地址进行访问。它的测试目标是基于URL 的,因此, 既可以用来测试Apache的负载压力, 也可以测试nginx 、lighthttp、tomcat、IIS 等其它 Web 服务器的...

    Tomcat性能优化

    - **负载均衡**:通过设置多个Tomcat实例或配合负载均衡器,分摊请求压力,避免单点瓶颈。 - **集成Web服务器处理静态内容**:例如与Apache结合,让Apache负责静态文件,减轻Tomcat负担。 - **调整线程池**:...

    使用JMeter进行性能测试

    一个测试计划通常包括一个或多个线程组(ThreadGroups)、逻辑控制器(LogicController)、采样生成控制器(SampleGeneratingControllers)、监听器(Listener)、定时器(Timer)、断言(Assertions)和配置元素...

    性能测试资源

    这包括负载测试(模拟多用户并发访问)、压力测试(逐渐增加负载直至系统崩溃)、耐久测试(长时间高负载运行)和容量规划(确定系统最大处理能力)。 二、Servlet与性能测试 1. Servlet基础:Servlet是Java编程...

    apache-tomcat-ab工具

    AB工具的主要目的是模拟多个并发用户向服务器发送请求,从而帮助分析服务器处理请求的能力和速度。 使用AB工具进行测试的基本命令格式如下: ```bash ab -n &lt;请求次数&gt; -c &lt;并发用户数&gt; ``` - `-n` 参数指定了总...

    优秀的软件工程师必须掌握的几个性能测试工具收集.pdf

    它可以创建多个并发访问线程,模拟多用户同时访问同一URL,不仅适用于Apache,还可以用于测试其他Web服务器,如Nginx、Lighttpd、Tomcat、IIS等。由于ab工具对发出负载的系统资源需求较低,但却能给目标服务器带来高...

    Tomcat性能优化篇笔记.pdf

    - 使用JMeter进行压力测试,模拟大量并发请求,观察系统性能。 - 使用命令行工具或图形化界面工具监控服务器资源使用情况。 3. **优化思路** - **Connector配置优化**: - Connector是Tomcat中负责接收HTTP...

    Tomcat 8.0版本 优化过

    - 使用JMeter、 Gatling等压力测试工具,模拟高并发场景,找出性能瓶颈。 8. **缓存策略**: - 应用级缓存,如Ehcache或Guava Cache,可以降低数据库查询频率,提高响应速度。 9. **JNDI资源优化**: - 合理...

    Tomcat7优化.docx

    例如,创建一个名为“tomcat”的用户,赋予相应的角色权限。 2. **Tomcat运行模式** Tomcat有三种运行模式:Bio(阻塞I/O)、NIO(非阻塞I/O)和APR(使用操作系统级别的异步I/O)。NIO模式利用Java的异步I/O技术...

    web服务器如何限流-nginx,tomcat服务器如何限制流量

    例如,你可以运行以下命令模拟多个并发用户请求: ```bash ab -n 1000 -c 100 http://example.com/ ``` 这会发送1000个请求,每次100个并发请求。观察服务器的响应时间和错误率,可以帮助调整限流策略。 另外,限...

Global site tag (gtag.js) - Google Analytics