class RRRequest {
public String uri;
public String body;
public String toString() {
return "uri:" + uri + ",body=" + body;
}
}
import java.io.BufferedReader;
public class Loadgen {
public static List<RRRequest> cmd = null;
private static int num = 0;
private static String cmdfilepath = null;
private static long duration = 0; // unit : minute
private static long interval = 0;
private static int time_out = 10000;
public static AtomicLong numOfStart = new AtomicLong(0);
public static AtomicLong numOfFinished = new AtomicLong(0);
public static AtomicLong numOfFail = new AtomicLong(0);
public static AtomicLong successedRequest = new AtomicLong(0);
public static AtomicLong failedRequest = new AtomicLong(0);
private static boolean printLog = false;
public Loadgen() {
loadcmd();
loadstatistics();
checkoutDuration();
}
private void checkoutDuration() {
Long starttime = System.currentTimeMillis();
int j=0;
while (true) {
if (System.currentTimeMillis() - starttime > duration * 1000) {
message("exiting... (wait 30 second for exiting)","info");
try {
Thread.sleep(30000L);
} catch (InterruptedException e) {
}
long tps=Loadgen.successedRequest.get()/duration;
message("TPS:"+tps, "info");
Long started=Loadgen.numOfStart.get();
Long failed = Loadgen.numOfFail.get();
float clientFailRate = Float.valueOf(failed)/Float.valueOf(started);
message("Client Fail Rate "+failed+"/"+started+"="+clientFailRate,"info");
Long successReq=Loadgen.successedRequest.get();
Long failedReq = Loadgen.failedRequest.get();
float requestFailRate = Float.valueOf(failedReq)/Float.valueOf(successReq+failedReq);
message("Request Fail Rate "+failedReq+"/("+successReq+"+"+failedReq+")="+requestFailRate,"info");
message("normal exit, total spend " + duration + " seconds", "info");
System.exit(0);
}
for (int i=0; i < num; i++) {
new Thread(new Client(j + 1, time_out)).start();
j++;
numOfStart.incrementAndGet();
}
try{
Thread.sleep(interval);
}catch(Exception e){
}
}
}
private void loadstatistics() {
try {
new Thread(new Statistics()).start();
} catch (Exception e) {
message(e.getMessage(), "error");
}
}
public static void message(String msg, String level) {
if (printLog && level.equals("error")) {
try {
File file = new File("error.txt");
boolean flag = true;
if (!file.exists()) {
flag = file.createNewFile();
}
if (!flag) {
System.out.println("Create log file Error.");
}
FileWriter saveFile = new FileWriter(file, true);
PrintWriter saveF = new PrintWriter(saveFile);
saveF.println(msg);
saveF.close();
} catch (IOException e) {
e.printStackTrace();
}
}else if(level.equals("info")){
try {
File file = new File("info.txt");
boolean flag = true;
if (!file.exists()) {
flag = file.createNewFile();
}
if (!flag) {
System.out.println("Create log file Error.");
}
FileWriter saveFile = new FileWriter(file, true);
PrintWriter saveF = new PrintWriter(saveFile);
saveF.println(msg);
saveF.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void loadcmd() {
File file = new File(cmdfilepath);
FileInputStream fis = null;
InputStreamReader bis = null;
BufferedReader dis = null;
cmd = new ArrayList<RRRequest>();
String temp = null;
try {
fis = new FileInputStream(file);
bis = new InputStreamReader(fis);
dis = new BufferedReader(bis);
while ((temp = dis.readLine()) != null) {
RRRequest request = new RRRequest();
if (temp.length() != 0) {
request.uri = temp.substring(4);
temp = dis.readLine();
if (temp.length() != 0) {
request.body = temp.substring(5);
} else {
message(cmdfilepath + "error.","error");
}
}
cmd.add(request);
}
fis.close();
bis.close();
dis.close();
} catch (FileNotFoundException e) {
message(e.getMessage(),"error");
} catch (IOException e) {
message(e.getMessage(),"error");
}
}
public static void main(String args[]) {
System.out.println("Start.........");
message("started at " + new Date().toString(),"info");
for (int argsPos = 0; argsPos < args.length; argsPos++) {
if (args[argsPos].equals("-n")) {
argsPos++;
num = Integer.valueOf(args[argsPos]).intValue();
} else if (args[argsPos].equals("-cmdf")) {
argsPos++;
cmdfilepath = args[argsPos];
} else if (args[argsPos].equals("-duration")) {
argsPos++;
duration = Long.valueOf(args[argsPos]);
} else if (args[argsPos].equals("-t")) {
argsPos++;
interval = Long.valueOf(args[argsPos]).longValue() * 1000;
} else if (args[argsPos].equals("-to")) {
argsPos++;
time_out = Integer.valueOf(args[argsPos]).intValue() * 1000;
} else if (args[argsPos].equals("log")) {
printLog = true;
}
}
new Loadgen();
}
}
request.txt