JAVA如何写一个纯并发的压力测试

Python022

JAVA如何写一个纯并发的压力测试,第1张

import java.io.BufferedReader

import java.io.File

import java.io.FileInputStream

import java.io.InputStreamReader

import java.io.PrintWriter

import java.net.HttpURLConnection

import java.net.URL

import java.util.HashMap

import java.util.Map

import java.util.concurrent.ExecutorService

import java.util.concurrent.Executors

import java.util.concurrent.Semaphore

public class ConcurrentTest {

private static int thread_num = 200

private static int client_num = 460

private static Map keywordMap = new HashMap()

static {

try {

InputStreamReader isr = new InputStreamReader(new FileInputStream(

new File("clicks.txt")), "GBK")

BufferedReader buffer = new BufferedReader(isr)

String line = ""

while ((line = buffer.readLine()) != null) {

keywordMap.put(line.substring(0, line.lastIndexOf(":")), "")

}

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

int size = keywordMap.size()

// TODO Auto-generated method stub

ExecutorService exec = Executors.newCachedThreadPool()

// 50个线程可以同时访问

final Semaphore semp = new Semaphore(thread_num)

// 模拟2000个客户端访问

for (int index = 0 index < client_num index++) {

final int NO = index

Runnable run = new Runnable() {

public void run() {

try {

// 获取许可

semp.acquire()

System.out.println("Thread:" + NO)

String host = "http://10.99.23.42:7001/KMQueryCenter/query.do?"

String para = "method=getQueryResult&pageNum=1&pageSize=5&"

+ "queryKeyWord="

+ getRandomSearchKey(NO)

+ "&questionID=-1&questionIdPath=-1&searchType=1"

+ "&proLine=&proSeries=&proType=" + NO

System.out.println(host + para)

URL url = new URL(host)// 此处填写供测试的url

HttpURLConnection connection = (HttpURLConnection) url

.openConnection()

// connection.setRequestMethod("POST")

// connection.setRequestProperty("Proxy-Connection",

// "Keep-Alive")

connection.setDoOutput(true)

connection.setDoInput(true)

PrintWriter out = new PrintWriter(connection

.getOutputStream())

out.print(para)

out.flush()

out.close()

BufferedReader in = new BufferedReader(

new InputStreamReader(connection

.getInputStream()))

String line = ""

String result = ""

while ((line = in.readLine()) != null) {

result += line

}

// System.out.println(result)

// Thread.sleep((long) (Math.random()) * 1000)

// 释放

System.out.println("第:" + NO + " 个")

semp.release()

} catch (Exception e) {

e.printStackTrace()

}

}

}

exec.execute(run)

}

// 退出线程池

exec.shutdown()

}

private static String getRandomSearchKey(final int no) {

String ret = ""

int size = keywordMap.size()

// int wanna = (int) (Math.random()) * (size - 1)

ret = (keywordMap.entrySet().toArray())[no].toString()

ret = ret.substring(0, ret.lastIndexOf("="))

System.out.println("\t" + ret)

return ret

}

}

思路:

压力测试原理有两种,一种是连接测试,一种是负载测试

1,连接测试,就是多线程,不停的请求直到服务器死机或达到预期效果即可!

2,负载测试,就是一个线程的多步操作,每个线程占用服务器cpu 内存是否符合节能高效的标准,如果不是,那就优化吧

建议用LOADRUNNER吧。

建议别老盯着测试结果,如果出现这种情况,看一看程序日志和数据库的日志,尤其是数据库SQL日志,看看每个SQL完成的时间变化,应该是耗时越来越长,这样就要优化了。

建议先搞数据库压力测试,根据情况制作10万-200万测试记录,目标是优化SQL语句,大中型项目中,这时第一项。

接下来再搞逻辑层和Web层的压力测试,目标是优化业务逻辑实现算法。