<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "Cluster Stress Test"]]></title>
		<link>http://forum.space4j.org/posts/list/2.page</link>
		<description><![CDATA[Latest messages posted in the topic "Cluster Stress Test"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Cluster Stress Test</title>
				<description><![CDATA[ To stress test Space4J's cluster implementation, let's place a master node and a slave node under stress doing many reads and updates. Each node will have a predefined number of threads doing insert, delete, search and iteration at the same time in the Java collection in memory. A snapshot will also be taken from time to time by the slave node.<br /> <br /> You can download the [i]PhoneBookClusterStress.java[/i] program by [url="http://www.space4j.org/examples/PhoneBookClusterStress.java"]clicking here[/url]. The source code is also listed below. (Note that to compile and run this problem you must include the space4.jar in the classpath) <br /> <br /> To run this example you need to open two shell/dos windows, one for the master node and one for the slave node. You can also run each node in a separate machine over the network.<br /> <br /> The arguments you must pass to the each program are:<br /> <br /> :arrow: -master or -slave = to indicate if this node is the master or the slave<br /> :arrow: IP address of the master<br /> :arrow: number of insert threads<br /> :arrow: number of delete threads<br /> :arrow: number of select threads<br /> :arrow: number of search threads<br /> :arrow: thread sleep time = how long each thread will sleep after each action<br /> :arrow: collection initial size = how many elements should the collection has before the threads start<br /> :arrow: snapshot time = how often should we take a snapshot <br /> <br /> After executing the programs for some time, hit CTRL+C to print the statistics. Here is an example: <br /> <br /> [u]Master Program:[/u]<br /> [code]<br /> java -cp .;space4j.jar org.space4j.examples.phonebook.PhoneBookClusterStress -master 127.0.0.1 5 4 10 5 50 2000 1000<br /> ...<br /> ...<br /> ...<br /> Selected 302 records!<br /> Found 14 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Found 24 recods!<br /> Found 21 recods!<br /> Found 23 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Inserted record number 5004<br /> Inserted record number 5005<br /> Deleted record number 2489<br /> Inserted record number 5006<br /> Deleted record number 4974<br /> Deleted record number 655<br /> Deleted record number 4926<br /> Inserted record number 5007<br /> <br /> <br /> ========== Results:<br /> Inserted = 2487<br /> Deleted  = 2041<br /> Selected = 2334460<br /> Searched = 86698<br /> Snapshots= 0<br /> Time: 39265 ms<br /> [/code]<br /> [u]Slave Program:[/u]<br /> [code]<br /> java -cp .;space4j.jar org.space4j.examples.phonebook.PhoneBookClusterStress -slave 127.0.0.1 5 4 10 5 50 2000 1000<br /> ...<br /> ...<br /> Inserted record number 13273<br /> Deleted record number 3267<br /> Deleted record number 6578<br /> Found 31 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Found 28 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Found 41 recods!<br /> Selected 302 records!<br /> Found 24 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Found 29 recods!<br /> Selected 302 records!<br /> Executing snapshot...<br /> =============================&gt; Snapshot Complete!<br /> <br /> <br /> ========== Results:<br /> Inserted = 30<br /> Deleted  = 32<br /> Selected = 45300<br /> Searched = 2558<br /> Snapshots= 3<br /> Time: 781 ms<br /> <br /> <br /> [/code]<br /> The source code of the [i]PhoneBookClusterStress.java[/i] program:<br /> [code]<br /> package org.space4j.examples.phonebook;<br /> <br /> <br /> import java.util.Collection;<br /> import java.util.Iterator;<br /> import java.util.Random;<br /> <br /> import org.space4j.Space4J;<br /> <br /> <br /> public class PhoneBookClusterStress extends PhoneBookCluster {<br /> 	<br />     private final Thread[] insertThread;<br /> 	<br />     private final Thread[] deleteThread;<br /> 	<br />     private final Thread[] selectThread;<br /> 	<br />     private final Thread[] searchThread;<br /> 	<br />     private Thread snapshotThread;<br />     <br />     private Random rand = new Random();<br />     <br />     private volatile long totalInserted = 0;<br />     private volatile long totalDeleted = 0;<br />     private volatile long totalSelected = 0;<br />     private volatile long totalSearched = 0;<br />     private volatile long snapshotsTaken = 0;<br />     <br />     private long started;<br />     <br />     private volatile boolean running = true;<br /> 	<br />     public PhoneBookClusterStress(Space4J space4j, final int nInsert, final int nDelete, final int nSelect, final int nSearch,<br />             final int sleepTime, final int tableSize, final int snapshotTime) throws Exception {<br /> 		<br />         super(space4j);<br /> 		<br />         // populate the table if needed...<br /> 		<br />         int size = users.size();<br /> 		<br />         if (size &lt; tableSize) {<br /> 			<br />             int diff = tableSize - size;<br /> 			<br />             for (int i = 0; i &lt; diff; i++) {<br /> 				<br />                 insertRandom();<br /> 				<br />                 System.out.print("\rInserting " + i + "...                 ");<br />             }<br />         }<br /> 		<br />         System.out.println();<br /> 		<br />         insertThread = new Thread[nInsert];<br /> 		<br />         deleteThread = new Thread[nDelete];<br /> 		<br />         selectThread = new Thread[nSelect];<br /> 		<br />         searchThread = new Thread[nSearch];<br /> 		                         <br />         for (int i = 0; i &lt; nInsert; i++) {<br />             insertThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleInsert();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nDelete; i++) {<br />             deleteThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleDelete();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nSelect; i++) {<br />             selectThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleSelect();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nSearch; i++) {<br />             searchThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleSearch();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br />         <br />         if (snapshotTime &gt; 0) {<br /> 		<br /> 	        snapshotThread = new Thread(<br /> 	                new Runnable() {<br /> 				<br /> 	            public void run() {<br /> 					<br /> 	                while (running) {<br /> 						<br /> 	                    try {<br /> 							<br /> 	                        Thread.sleep(snapshotTime);<br /> 							<br /> 	                        System.out.println("Executing snapshot...");<br /> 							<br /> 	                        PhoneBookClusterStress.this.executeSnapshot();<br /> 							<br /> 	                        System.out.println(<br /> 	                                "=============================&gt; Snapshot Complete!");<br /> 	                        <br /> 	                        snapshotsTaken++;<br /> 							<br /> 	                    } catch (Exception e) {<br /> 							<br /> 	                        return;<br /> 	                    }<br /> 	                }<br /> 	            }<br /> 				<br /> 	        });<br />         }<br />     }<br /> 	<br />     public void start() {<br /> 		<br />         for (int i = 0; i &lt; insertThread.length; i++) {<br />             insertThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; deleteThread.length; i++) {<br />             deleteThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; selectThread.length; i++) {<br />             selectThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; searchThread.length; i++) {<br />             searchThread[i].start();<br />         }<br /> 		<br />         snapshotThread.start();<br />     }<br /> 	<br />     protected int insertRandom() throws Exception {<br />     	<br />     	// insert a random phone number...<br /> 		<br />         StringBuilder sb = new StringBuilder();<br />         <br />         sb.append("Oliveira").append(rand.nextInt(100) + 1);<br /> 		<br />         return this.addNumber("Sergio", sb.toString(), "123-4321", rand.nextInt(100) + 1);<br />     }<br /> 	<br />     protected int deleteRandom() throws Exception {<br />     	<br />     	// delete a random phone number<br />     	// (guess a number, iterate to choose a phone and delete it) <br /> <br />         Iterator iter = users.keySet().iterator();<br /> 		<br />         int count = rand.nextInt(users.size() / 10) + 1;<br /> 		<br />         int index = 0;<br /> 		<br />         int id = -1;<br /> 		<br />         while (iter.hasNext() && index++ &lt;= count) {<br /> 			<br />             id = (Integer) iter.next();<br /> 			<br />         }<br /> 		<br />         if (id &gt; 0) {<br /> 			<br />             this.delUser(id);<br /> 			<br />         }<br /> 		<br />         return id;<br />     }<br /> 	<br />     private void handleInsert() throws Exception {<br /> 		<br />         int id = insertRandom();<br /> 		<br />         System.out.println("Inserted record number " + id);<br />         <br />         totalInserted++;<br />     }<br /> 	<br />     private void handleDelete() throws Exception {<br /> 		<br />         int id = deleteRandom();<br /> 		<br />         if (id == -1) {<br /> 			<br />             System.out.println("Could not delete anything!");<br /> 			<br />         } else {<br /> 			<br />             System.out.println("Deleted record number " + id);<br />             <br />             totalDeleted++;<br />         }<br />     }<br /> 	<br />     private void handleSelect() {<br />     	<br />     	// select any 300 phone numbers and loop through them...<br /> 		<br />         Iterator iter = users.values().iterator();<br /> 		<br />         int count = 0;<br /> 		<br />         while (iter.hasNext() && count++ &lt;= 300) {<br /> 			<br />             iter.next();<br />         }<br /> 		<br />         System.out.println("Selected " + count + " records!");<br />         <br />         totalSelected += count;<br />     }<br /> <br />     private void handleSearch() {<br />     	<br />     	// choose a user and try to find his phone number...<br />     	<br />     	StringBuilder sb= new StringBuilder();<br /> 		<br />         sb.append("Oliveira").append(rand.nextInt(100) + 1);<br /> 		<br />         Collection coll = this.findUsers(sb.toString());<br /> 		<br />         int count = 0;<br /> 		<br />         Iterator iter = coll.iterator();<br /> 		<br />         while (iter.hasNext()) {<br /> 			<br />             count++;<br /> 			<br />             iter.next();<br />         }<br /> 		<br />         System.out.println("Found " + count + " recods!");<br />         <br />         totalSearched += count;<br /> 		<br />     }<br />     <br />     private void interruptAll() {<br />     	<br />     	for(int i=0;i&lt;insertThread.length;i++) insertThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;deleteThread.length;i++) deleteThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;selectThread.length;i++) selectThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;searchThread.length;i++) searchThread[i].interrupt();<br />     }<br /> 	<br />     public static void main(String[] args) throws Exception {<br /> 		<br />         if (args.length &gt;= 3) {<br /> 			<br />             if (args[2].equals("-nostress")) {<br /> 				<br />                 Space4J space4j = createSpace4J(args[0], args[1]);<br /> 					<br />                 PhoneBookCluster phone = new PhoneBookCluster(space4j);<br /> 				<br />                 run(phone);<br /> 				<br />                 return;<br />             }<br /> 			<br />         }<br /> 		<br />         if (args.length != 9) {<br /> 			<br />             System.out.println(<br />                     "format: java PhoneBookClusterStress [-master|-slave] &lt;ip&gt; [-nostress] &lt;number of insert threads&gt; &lt;number of delete threads&gt; "<br />                             + "&lt;number of select threads&gt; &lt;number of search threads&gt; &lt;thread sleep time&gt; &lt;table size&gt; &lt;snapshot time&gt;");<br /> 			<br />             return;<br />         }<br /> 		<br />         int nInsert, nDelete, nSelect, nSearch, sleepTime, tableSize, snapTime;<br /> 		<br />         nInsert = Integer.parseInt(args[2]);<br /> 		<br />         nDelete = Integer.parseInt(args[3]);<br /> 		<br />         nSelect = Integer.parseInt(args[4]);<br /> 		<br />         nSearch = Integer.parseInt(args[5]);<br /> 		<br />         sleepTime = Integer.parseInt(args[6]);<br /> 		<br />         tableSize = Integer.parseInt(args[7]);<br /> 		<br />         snapTime = Integer.parseInt(args[8]);<br />         <br />         // let the slaves take the snapshot<br />         if (args[0].equals("-master")) {<br />         	snapTime = 0;<br />         }<br /> 		<br />         Space4J space4j = createSpace4J(args[0], args[1]);<br /> 		<br />         final PhoneBookClusterStress stress = new PhoneBookClusterStress(space4j,<br />                 nInsert, nDelete, nSelect, nSearch, sleepTime, tableSize,<br />                 snapTime);<br />         <br />         stress.started = System.currentTimeMillis();<br />         <br />         Runtime.getRuntime().addShutdownHook(new Thread() {<br /> <br />             @Override<br />             public void run() {<br />             	<br />             	long totalInserted = stress.totalInserted;<br />             	long totalDeleted = stress.totalDeleted;<br />             	long totalSelected = stress.totalSelected;<br />             	long totalSearched = stress.totalSearched;<br />             	long snapshotsTaken = stress.snapshotsTaken;<br />             	long now = System.currentTimeMillis();<br />             	<br />             	stress.running = false;<br />             	<br />             	stress.interruptAll();<br />             	<br />             	try { Thread.sleep(1500); } catch(Exception e) { }<br />             	<br />             	System.out.println("\n\n========== Results:");<br />             	System.out.println("Inserted = " + totalInserted);<br />             	System.out.println("Deleted  = " + totalDeleted);<br />             	System.out.println("Selected = " + totalSelected);<br />             	System.out.println("Searched = " + totalSearched);<br />             	System.out.println("Snashopts= " + snapshotsTaken);<br />             	System.out.println("Time: " + (now - stress.started) + " ms");<br />             	<br />             }<br />         });<br /> 		<br />         stress.start();<br />     }<br /> 	<br /> }<br /> [/code]<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://forum.space4j.org/posts/preList/4/4.page</guid>
				<link>http://forum.space4j.org/posts/preList/4/4.page</link>
				<pubDate><![CDATA[Fri, 5 Sep 2008 15:33:08]]> GMT</pubDate>
				<author><![CDATA[ saoj]]></author>
			</item>
	</channel>
</rss>
