/**
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cloudExplorer;
import static cloudExplorer.NewJFrame.jTextArea1;
import com.googlecode.charts4j.AxisLabelsFactory;
import com.googlecode.charts4j.Color;
import com.googlecode.charts4j.Data;
import com.googlecode.charts4j.DataUtil;
import com.googlecode.charts4j.GCharts;
import com.googlecode.charts4j.Plot;
import com.googlecode.charts4j.Plots;
import com.googlecode.charts4j.XYLineChart;
import static java.awt.Color.BLUE;
import static java.awt.Color.WHITE;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
public class PerformanceThread implements Runnable {
String type_operation = null;
String Home = System.getProperty("user.home");
NewJFrame mainFrame;
String throughput_log = Home + File.separator + "throughput_results.csv";
String latency_log = Home + File.separator + "latency_results.csv";
String ops_log = Home + File.separator + "ops_results.csv";
int threadcount;
String getValue;
String getOperationCount;
Put put;
Thread performancethread;
String temp_file = (Home + File.separator + "object.tmp");
String what = null;
String access_key = null;
String secret_key = null;
String bucket = null;
String endpoint = null;
Boolean operation = true;
Boolean graphdata = true;
double[] x;
double[] y;
double[] x_latency;
double[] y_latency;
double[] x_iops;
double[] y_iops;
Get get;
JLabel label_throughput;
String[] getTempArray;
JButton performance;
public static Boolean throughput_graph = false;
public static Boolean ops_graph = false;
public static Boolean latency_graph = false;
int num_graphs = 0;
public static Boolean mixed = false;
Boolean overwrite = false;
String folder = null;
Boolean folder_enabled = false;
public void performance_logger(double time, double rate, String what) {
try {
FileWriter frr = new FileWriter(what, true);
BufferedWriter bfrr = new BufferedWriter(frr);
bfrr.write("\n" + time + "," + rate);
bfrr.close();
} catch (Exception perf_logger) {
}
}
public void calibrate() {
try {
jTextArea1.setCaretPosition(jTextArea1.getLineStartOffset(jTextArea1.getLineCount() - 1));
} catch (Exception e) {
}
}
PerformanceThread(JButton Aperformance, int Athreadcount, String AgetValue, String AgetOperationCount, String Aaccess_key, String Asecret_key, String Abucket, String Aendpoint, Boolean Aoperation, Boolean Agraphdata, Boolean Athroughput_graph, Boolean Alatency_graph, Boolean Aops_graph, int Anum_graphs, Boolean Amixed, Boolean Aoverwrite, String Afolder) {
threadcount = Athreadcount;
getValue = AgetValue;
getOperationCount = AgetOperationCount;
access_key = Aaccess_key;
secret_key = Asecret_key;
bucket = Abucket;
endpoint = Aendpoint;
operation = Aoperation;
graphdata = Agraphdata;
performance = Aperformance;
ops_graph = Aops_graph;
latency_graph = Alatency_graph;
throughput_graph = Athroughput_graph;
num_graphs = Anum_graphs;
mixed = Amixed;
overwrite = Aoverwrite;
folder = Afolder;
}
public String makeDirectory(String what) {
if (what.substring(0, 2).contains(":")) {
what = what.substring(3, what.length());
}
if (what.substring(0, 1).contains("/")) {
what = what.substring(1, what.length());
}
if (what.contains("/")) {
what = what.replace("/", File.separator);
}
if (what.contains("\\")) {
what = what.replace("\\", File.separator);
}
int slash_counter = 0;
int another_counter = 0;
for (int y = 0; y != what.length(); y++) {
if (what.substring(y, y + 1).contains(File.separator)) {
slash_counter++;
another_counter = y;
}
}
return Home + File.separator + what.substring(0, another_counter);
}
public void run() {
File throughputfile = new File(throughput_log);
File opsfile = new File(ops_log);
File latencyfile = new File(latency_log);
int op_count = Integer.parseInt(getOperationCount);
int file_size = Integer.parseInt(getValue);
float num_threads = threadcount;
if (folder == null || folder.contains("null")) {
folder_enabled = false;
} else {
folder_enabled = true;
}
File tempFile = new File(temp_file);
if (tempFile.exists()) {
tempFile.delete();
}
if (throughputfile.exists()) {
throughputfile.delete();
}
if (latencyfile.exists()) {
latencyfile.delete();
}
if (opsfile.exists()) {
opsfile.delete();
}
if (file_size > 0 && num_threads > 0 && op_count > 0) {
try {
FileOutputStream s = new FileOutputStream(temp_file);
byte[] buf = new byte[file_size * 1024];
s.write(buf);
s.flush();
s.close();
} catch (Exception add) {
}
if (tempFile.exists()) {
try {
String upload = tempFile.getAbsolutePath();
calibrate();
if (!operation || mixed) {
if (!folder_enabled) {
put = new Put(upload, access_key, secret_key, bucket, endpoint, "performance_test_data", false, false, false);
put.startc(upload, access_key, secret_key, bucket, endpoint, "performance_test_data", false, false, false);
} else {
put = new Put(upload, access_key, secret_key, bucket, endpoint, folder + "performance_test_data", false, false, false);
put.startc(upload, access_key, secret_key, bucket, endpoint, folder + "performance_test_data", false, false, false);
}
}
x = new double[op_count];
y = new double[op_count];
x_latency = new double[op_count];
y_latency = new double[op_count];
x_iops = new double[op_count];
y_iops = new double[op_count];
int counter = 0;
int display_counter = 0;
getTempArray = new String[(int) op_count * (int) num_threads];
for (int z = 0; z != op_count; z++) {
if (mixed) {
if (operation) {
operation = false;
} else {
operation = true;
}
}
ExecutorService executor = Executors.newFixedThreadPool((int) num_threads);
long t1 = System.currentTimeMillis();
for (int i = 0; i != num_threads; i++) {
if (operation) {
if (overwrite) {
if (!folder_enabled) {
Runnable put = new Put(upload, access_key, secret_key, bucket, endpoint, "performance_test_data_PUT-" + i, false, false, false);
executor.execute(put);
} else {
Runnable put = new Put(upload, access_key, secret_key, bucket, endpoint, folder + "performance_test_data_PUT-" + i, false, false, false);
executor.execute(put);
}
} else {
if (!folder_enabled) {
Runnable put = new Put(upload, access_key, secret_key, bucket, endpoint, "performance_test_data_" + i + "_" + z, false, false, false);
executor.execute(put);
} else {
Runnable put = new Put(upload, access_key, secret_key, bucket, endpoint, folder + "performance_test_data_" + i + "_" + z, false, false, false);
executor.execute(put);
}
}
} else {
if (!folder_enabled) {
Runnable get = new Get("performance_test_data", access_key, secret_key, bucket, endpoint, temp_file + +i + "_" + z, null);
getTempArray[i] = temp_file + i + "_" + z;
executor.execute(get);
} else {
Runnable get = new Get(folder + "performance_test_data", access_key, secret_key, bucket, endpoint, temp_file + +i + "_" + z, null);
getTempArray[i] = temp_file + i + "_" + z;
executor.execute(get);
}
}
}
executor.shutdown();
while (!executor.isTerminated()) {
}
double t2 = System.currentTimeMillis();
double diff = t2 - t1;
double total_time = diff / 1000;
double rate = (num_threads * file_size / total_time / 1024);
rate = Math.round(rate * 100);
rate = rate / 100;
double iops = (num_threads / total_time);
iops = Math.round(iops * 100);
iops = iops / 100;
if (operation) {
NewJFrame.jTextArea1.append("\nPUT : " + z + ". Time: " + total_time + " seconds." + " Average speed with " + num_threads + " thread(s) is: " + rate + " MB/s. OPS/s: " + iops);
} else {
NewJFrame.jTextArea1.append("\nGET : " + z + ". Time: " + total_time + " seconds." + " Average speed with " + num_threads + " thread(s) is: " + rate + " MB/s. OPS/s: " + iops);
}
if (!mixed) {
performance_logger(counter, rate, throughput_log);
performance_logger(counter, iops, ops_log);
performance_logger(counter, total_time, latency_log);
}
/**
* if (counter == 100) { counter = 0; x = new
* double[op_count]; y = new double[op_count]; x_latency
* = new double[op_count]; y_latency = new
* double[op_count]; x_iops = new double[op_count];
* y_iops = new double[op_count]; }
*
*/
y[counter] = (Double) rate;
x[counter] = counter;
y_latency[counter] = total_time;
x_latency[counter] = counter;
y_iops[counter] = iops;
x_iops[counter] = counter;
if (graphdata && !mixed) {
graph();
} else {
if (op_count <= 9 || z <= 9) {
display(rate, iops);
display_counter = 0;
}
if (display_counter == 9) {
display(rate, iops);
display_counter = 0;
}
}
if (!operation) {
for (String what : getTempArray) {
if (what != null) {
File del = new File(what);
if (del.exists()) {
del.delete();
}
}
}
}
counter++;
display_counter++;
calibrate();
}
} catch (Exception ex) {
System.out.print("\nException:" + ex.getMessage() + ex.getLocalizedMessage() + "\nThreads test: " + (int) num_threads);
}
} else {
NewJFrame.jTextArea1.append("\n Please specifiy more than 0 threads.");
calibrate();
}
if (!mixed) {
NewJFrame.jTextArea1.append("\n\nResults saved in CSV format to: " + "\n" + throughput_log + "\n" + latency_log + "\n" + ops_log);
if (num_graphs > 0) {
NewJFrame.jTextArea1.append("\n\nGraphs saved in PNG format to: " + Home);
}
}
calibrate();
NewJFrame.perf = false;
} else {
NewJFrame.jTextArea1.append("\nError: Thread and Count values must be greater than 0. Object Size value must be 1024 or greater.");
calibrate();
}
performance.setVisible(true);
throughput_graph = false;
ops_graph = false;
latency_graph = false;
num_graphs = 0;
}
void display(double throughput, double iops
) {
if (!operation) {
type_operation = "GET";
} else {
type_operation = "PUT";
}
JLabel throughputIcon = new JLabel("\n Average " + type_operation + " Throughput \n\n" + Double.toString(throughput) + " MB/s");
throughputIcon.setFont(throughputIcon.getFont().deriveFont(19.0f));
throughputIcon.setForeground(BLUE);
throughputIcon.setBackground(WHITE);
JLabel iopsIcon = new JLabel("\n " + type_operation + " OP/s \n\n" + Double.toString(iops));
iopsIcon.setFont(iopsIcon.getFont().deriveFont(19.0f));
iopsIcon.setForeground(BLUE);
iopsIcon.setBackground(WHITE);
//Configures the panel
NewJFrame.jPanel11.removeAll();
GridLayout layout = new GridLayout(0, 3);
NewJFrame.jPanel11.setLayout(layout);
NewJFrame.jPanel11.add(throughputIcon);
NewJFrame.jPanel11.add(iopsIcon);
NewJFrame.jPanel11.revalidate();
NewJFrame.jPanel11.repaint();
}
void graph() {
try {
if (!operation) {
type_operation = "GET";
} else {
type_operation = "PUT";
}
//Configures the IO graph
Data xdata_iops = DataUtil.scaleWithinRange(0, x_iops.length, x_iops);
Data ydata_iops = DataUtil.scaleWithinRange(0, y_iops[1] * 4, y_iops);
Plot plot_iops = Plots.newXYLine(xdata_iops, ydata_iops);
plot_iops.setColor(Color.GREEN);
XYLineChart xyLineChart_iops = GCharts.newXYLineChart(plot_iops);
xyLineChart_iops.setSize(600, 300);
xyLineChart_iops.setTitle(type_operation + " OP/s");
xyLineChart_iops.addXAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "Operations")));
xyLineChart_iops.addYAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "OP/s")));
xyLineChart_iops.addXAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, x_iops.length + 1));
xyLineChart_iops.addYAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, y_iops[1] * 4));
ImageIcon ops_icon = new ImageIcon(ImageIO.read(new URL(xyLineChart_iops.toURLString())));
JLabel label_ops = new JLabel(ops_icon);
//Configures the latency graph
Data xdata_latency = DataUtil.scaleWithinRange(0, x_latency.length, x_latency);
Data ydata_latency = DataUtil.scaleWithinRange(0, y_latency[1] * 4, y_latency);
Plot plot_latency = Plots.newXYLine(xdata_latency, ydata_latency);
plot_latency.setColor(Color.RED);
XYLineChart xyLineChart_latency = GCharts.newXYLineChart(plot_latency);
xyLineChart_latency.setSize(600, 300);
xyLineChart_latency.setTitle(type_operation + " Latency");
xyLineChart_latency.addXAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, x_latency.length + 1));
xyLineChart_latency.addYAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, y_latency[1] * 4));
xyLineChart_latency.addXAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "Operations")));
xyLineChart_latency.addYAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "Seconds")));
ImageIcon latency_icon = new ImageIcon(ImageIO.read(new URL(xyLineChart_latency.toURLString())));
JLabel label_latency = new JLabel(latency_icon);
//Configures the throughput graph
Data xdata = DataUtil.scaleWithinRange(0, x.length, x);
Data ydata = DataUtil.scaleWithinRange(0, y[1] * 4, y);
Plot plot = Plots.newXYLine(xdata, ydata);
plot.setColor(Color.BLUE);
XYLineChart xyLineChart = GCharts.newXYLineChart(plot);
xyLineChart.setSize(600, 300);
xyLineChart.setTitle(type_operation + " Throughput");
xyLineChart.addXAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "Operations")));
xyLineChart.addYAxisLabels(AxisLabelsFactory.newAxisLabels(Arrays.asList("", "MB/s")));
xyLineChart.addXAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, x.length + 1));
xyLineChart.addYAxisLabels(AxisLabelsFactory.newNumericRangeAxisLabels(0, y[1] * 4));
ImageIcon throughput_icon = (new ImageIcon(ImageIO.read(new URL(xyLineChart.toURLString()))));
label_throughput = new JLabel(throughput_icon);
//Configures the panel
NewJFrame.jPanel11.removeAll();
GridLayout layout = new GridLayout(0, 3);
NewJFrame.jPanel11.setLayout(layout);
if (throughput_graph) {
NewJFrame.jPanel11.add(label_throughput);
try {
Image image_throughput = throughput_icon.getImage();
BufferedImage buffered_throughput_icon = (BufferedImage) image_throughput;
File outputfile = new File(Home + File.separator + "GRAPH-throughput.png");
ImageIO.write(buffered_throughput_icon, "png", outputfile);
} catch (Exception ex) {
}
}
if (ops_graph) {
NewJFrame.jPanel11.add(label_ops);
try {
Image image_ops = ops_icon.getImage();
BufferedImage buffered_ops_icon = (BufferedImage) image_ops;
File outputfile = new File(Home + File.separator + "GRAPH-ops.png");
ImageIO.write(buffered_ops_icon, "png", outputfile);
} catch (Exception ex) {
}
}
if (latency_graph) {
NewJFrame.jPanel11.add(label_latency);
try {
Image image_latency = latency_icon.getImage();
BufferedImage buffered_latency_icon = (BufferedImage) image_latency;
File outputfile = new File(Home + File.separator + "GRAPH-latency.png");
ImageIO.write(buffered_latency_icon, "png", outputfile);
} catch (Exception ex) {
}
}
NewJFrame.jPanel11.revalidate();
NewJFrame.jPanel11.repaint();
System.gc();
} catch (Exception graph) {
}
}
void stop() {
performancethread.stop();
NewJFrame.jTextArea1.append("\nTest aborted.");
calibrate();
}
void startc(JButton Aperformance, int Athreadcount, String AgetValue, String AgetOperationCount, String Aaccess_key, String Asecret_key, String Abucket, String Aendpoint, Boolean Aoperation, Boolean Agraphdata, Boolean Athroughput_graph, Boolean Alatency_graph, Boolean Aops_graph, int Anum_graohs, Boolean Amixed, Boolean Aoverwrite, String Afolder
) {
performancethread = new Thread(new PerformanceThread(Aperformance, Athreadcount, AgetValue, AgetOperationCount, Aaccess_key, Asecret_key, Abucket, Aendpoint, Aoperation, Agraphdata, Athroughput_graph, Alatency_graph, Aops_graph, Anum_graohs, Amixed, Aoverwrite, Afolder));
performancethread.start();
}
}