Hi Kiren On 10/04/12 17:19, Kiren Pillay wrote:
Hi Sergey!Sorry for the delay in getting back to you, we are having bank holidays on our side.:) The numbers are impressive, it looks like having a more powerful CPU plays a big role, however I never expected it to be more than twice as fast?
Yea, I know the CXF performance figures can be pretty hard to believe sometimes to, they are so good :-)
(time to motivate for a new laptop :)
Indeed :-). Cheers, Sergey
Thanks for the help! Regards Kiren On Thu, Apr 5, 2012 at 3:23 PM, Sergey Beryozkin<[email protected]>wrote:Actually was testing with CXF 2.5.2 Sergey On 05/04/12 16:04, Sergey Beryozkin wrote:Hi Kiren sorry for a delay, here is the output from the test program on my laptop: pool-1-thread-1 awaiting pool-1-thread-2 awaiting pool-1-thread-3 awaiting pool-1-thread-4 awaiting pool-1-thread-5 awaiting pool-1-thread-6 awaiting pool-1-thread-7 awaiting pool-1-thread-8 awaiting pool-1-thread-9 awaiting pool-1-thread-10 awaiting pool-1-thread-10 started pool-1-thread-1 started pool-1-thread-2 started pool-1-thread-5 started pool-1-thread-4 started pool-1-thread-9 started pool-1-thread-3 started pool-1-thread-8 started pool-1-thread-7 started pool-1-thread-6 started pool-1-thread-5done pool-1-thread-8done pool-1-thread-4done pool-1-thread-10done pool-1-thread-3done pool-1-thread-6done pool-1-thread-1done pool-1-thread-2done pool-1-thread-7done pool-1-thread-9done Average exec time ... 36 No Users:10 NO_REQUESTS_PER_USER100 Was 44 originally, then between 39-36 Not too bad I guess given that we have 10 threads executing 100 requests simultaneously with JAXB marshalling/unmarshalling involved :-) I tried 2.6.0-SNAPSHOT. I'm getting convinced CXF is performing pretty well indeed :-), there could be a lot of other factors though affecting the actual performance data Cheers, Sergey On 28/03/12 18:59, Kiren Pillay wrote:Hi Sergey! I've taken your multi-threaded project and modified it so that each thread sends a specific number of requests. What I am seeing is that the average time is 100ms. Can you please confirm if this is correct? All my cores go to 100% when I run this. Note that the Response object is our own xml Response object, and not the CXF one. Regards Kiren package za.co.kiren.load; import java.util.concurrent.**ArrayBlockingQueue; import java.util.concurrent.**CountDownLatch; import java.util.concurrent.**ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.**AtomicLong; import javax.ws.rs.core.MediaType; import org.apache.cxf.jaxrs.client.**WebClient; import za.co.xxx.pams.messaging.**response.Response; public class MultiUserLoadTest { private static final int NO_USERS = 10; private static final int NO_REQUESTS_PER_USER = 1000/NO_USERS; public static void main(String[] args) throws InterruptedException { AtomicLong totalTime=new AtomicLong(); ThreadPoolExecutor executor = new ThreadPoolExecutor(NO_USERS, NO_USERS, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(**NO_USERS)); CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(NO_USERS); for (int j = 0; j< NO_USERS; j++) { executor.execute(new MultiUserLoadTest().new Worker(totalTime, startSignal, doneSignal)); } startSignal.countDown(); doneSignal.await(120, TimeUnit.SECONDS); executor.shutdownNow(); if (doneSignal.getCount() != 0) { throw new RuntimeException("Not all threads done, must have timed out?"); } System.out.println("Average exec time ... " + totalTime.intValue() / (NO_USERS*NO_REQUESTS_PER_**USER)); System.out.println("No Users:"+NO_USERS); System.out.println("NO_**REQUESTS_PER_USER"+NO_**REQUESTS_PER_USER); } class Worker implements Runnable { private final AtomicLong total; private CountDownLatch startSignal; private CountDownLatch doneSignal; private int count=0; private String threadName; public Worker(AtomicLong total, CountDownLatch startSignal, CountDownLatch doneSignal) { this.total = total; this.startSignal = startSignal; this.doneSignal = doneSignal; } @Override public void run() { threadName=Thread.**currentThread().getName(); try { System.out.println(Thread.**currentThread().getName()+" awaiting"); startSignal.await(); System.out.println(Thread.**currentThread().getName()+" started"); WebClient wc = WebClient.create( "http://localhost:8080/**RestTest/rest/test/xml<http://localhost:8080/RestTest/rest/test/xml> ", "user", "passwordt", null); wc.accept(MediaType.TEXT_XML); for (int i = 0; i< NO_REQUESTS_PER_USER; i++) { count++; /* wc.replaceQueryParam("**batchNumber", ((int) (1000 + Math.random() * 100)));*/ long l1 = System.currentTimeMillis(); Response response = wc.get(Response.class); long l2 = System.currentTimeMillis(); total.getAndAdd(l2 - l1); } doneSignal.countDown(); System.out.println(Thread.**currentThread().getName()+" done"); } catch (Exception ex) { System.err.println(threadName+**" "+ex.getMessage()); ; throw new RuntimeException(); } } } } On Wed, Mar 28, 2012 at 12:20 PM, Sergey Beryozkin<[email protected]**>wrote: Hi KirenOn 28/03/12 10:33, Kiren Pillay wrote: Hi Sergey!With your code I'm getting 13 ms average on my Tomcat server and 34ms on Jetty maven plugin (I was actually expecting the opposite). Against the String response url I'm getting 4ms on Tomcat and 5ms on Jetty. I think now we're getting down to the level of differences in the quality of our hardware, I've got an intel I5 (M 430 @ 2.27GHz) laptop with plenty of RAM, you probably have a better machine. I'm running Java 7 update 3 on a linux 64bit Ubuntu 11.10 machine. I have I7 with few processors and plenty of memory, so that can explainsome difference. Java6& Ubuntu 11.04. Please try CXF 2.5.3-SNAPSHOT, that might help with saving few milliseconds too plus in case of JAXB - save on the pretty-printing 'expenses' which you already verified. What I think is that the server runtime is performing pretty well, the client runtimes have different qualities though and that can affect the performance measurements... Wonder how would JIXB perform :-) Cheers, Sergey RegardsKiren On Tue, Mar 27, 2012 at 11:04 PM, Sergey Beryozkin<[email protected]****wrote:Hi KirenOn 27/03/12 13:09, Kiren Pillay wrote: Hi Sergey,Attached is a war file against which I am testing my client. great, thanksThe test URLS are given below together with the Jamon stats for a 1000 hits.1. Large response (27k) url="http://localhost:8080/******RestTest/rest/test/long/27000<http://localhost:8080/****RestTest/rest/test/long/27000> **<http://localhost:8080/****RestTest/rest/test/long/27000<http://localhost:8080/**RestTest/rest/test/long/27000><**http://localhost:8080/****RestTest/rest/test/long/27000<http://localhost:8080/**RestTest/rest/test/long/27000> <**http://localhost:8080/**RestTest/rest/test/long/27000<http://localhost:8080/RestTest/rest/test/long/27000>"**;JAMon Label=myCodeTimer, Units=ms.: (Hits=1000.0, Avg=7.77, Total=7770.0, Min=4.0 tps:128.5512276642242 2. Small response url="http://localhost:8080/******RestTest/rest/test/short<http://localhost:8080/****RestTest/rest/test/short> <http**://localhost:8080/**RestTest/**rest/test/short<http://localhost:8080/**RestTest/rest/test/short><http:**//localhost:8080/**RestTest/**rest/test/short<htt** p://localhost:8080/RestTest/**rest/test/short<http://localhost:8080/RestTest/rest/test/short>"; JAMon Label=myCodeTimer, Units=ms.: (Hits=1000.0, Avg=5.454, Total=5454.0, Min=3.0, Max=37.0 tps:183.0831197363603 3. Dummy Response using the JAXB schema url="http://localhost:8080/******RestTest/rest/test/xml<http://localhost:8080/****RestTest/rest/test/xml> <http:/**/localhost:8080/**RestTest/**rest/test/xml<http://localhost:8080/**RestTest/rest/test/xml><http://**localhost:8080/**RestTest/rest/**test/xml<http:** //localhost:8080/RestTest/**rest/test/xml<http://localhost:8080/RestTest/rest/test/xml>"; JAMon Label=myCodeTimer, Units=ms.: (Hits=1000.0, Avg=15.381, Total=15381.0, Min=9.0, Max=542.0, tps:64.96037417175522 With the following code:WebClient wc = WebClient.create("http://**** localhost:8080/RestTest/rest/****** test/xml<http://localhost:****8080/RestTest/rest/test/xml<ht** tp://localhost:8080/RestTest/**rest/test/xml<http://localhost:8080/RestTest/rest/test/xml>")**;wc.accept("text/xml"); // warm up a bit for (int i = 0; i< 50; i++) { wc.get(); } long total = 0; for (int i = 0; i< 1000; i++) { long l1 = System.currentTimeMillis(); wc.get(Document.class); long l2 = System.currentTimeMillis(); total += l2-l1; } System.out.println("Average: " + total/1000); I'm getting 10 millisecs average. Note I'm adding a Document reading just to eliminate any optimizations with webClient.get() where no actual read is done. Running the same code against http://localhost:8080/******RestTest/rest/test/long/27000<http://localhost:8080/****RestTest/rest/test/long/27000> <**http://localhost:8080/****RestTest/rest/test/long/27000<http://localhost:8080/**RestTest/rest/test/long/27000><**http://localhost:8080/****RestTest/rest/test/long/27000<http://localhost:8080/**RestTest/rest/test/long/27000> <**http://localhost:8080/**RestTest/rest/test/long/27000<http://localhost:8080/RestTest/rest/test/long/27000>(changing address, accept to text/plain, and wc.get(Document.class); to wc.get(String.class);) gives me 2 milliseconds average. Can you try the same code please ? Cheers, Sergey I've include our custom JAXB-enabled schema jar, the rest you can build frommaven pom.xml. http://cxf.547215.n5.nabble.******com/file/n5597650/**** RestWarProject.tar.gz<http://****cxf.547215.n5.nabble.com/**file/**<http://cxf.547215.n5.nabble.com/file/**> n5597650/RestWarProject.tar.**gz<http://cxf.547215.n5.** nabble.com/file/n5597650/**RestWarProject.tar.gz<http://cxf.547215.n5.nabble.com/file/n5597650/RestWarProject.tar.gz>**> RestWarProject.tar.gz Custom JAXB schema file: http://cxf.547215.n5.nabble.******com/file/n5597650/pams-core-**** xsd-server-1.3.0_ba_nemo-******SNAPSHOT.jar<http://cxf.** 547215.n5.nabble.com/file/****n5597650/pams-core-xsd-server-****<http://547215.n5.nabble.com/file/**n5597650/pams-core-xsd-server-**> 1.3.0_ba_nemo-SNAPSHOT.jar<htt**p://cxf.547215.n5.nabble.com/** file/n5597650/pams-core-xsd-**server-1.3.0_ba_nemo-SNAPSHOT.**jar<http://cxf.547215.n5.nabble.com/file/n5597650/pams-core-xsd-server-1.3.0_ba_nemo-SNAPSHOT.jar>pams-core-xsd-server-1.3.0_ba_******nemo-SNAPSHOT.jarRegards Kiren -- View this message in context: http://cxf.547215.n5.nabble.** com/CXF-Test-client-for-JAXB-******load-testing-**** tp5597650p5597650.html<http://****cxf.547215.n5.nabble.com/**CXF-**<http://cxf.547215.n5.nabble.com/CXF-**> Test-client-for-JAXB-load-****testing-tp5597650p5597650.**html< http://cxf.547215.n5.**nabble.com/CXF-Test-client-** for-JAXB-load-testing-**tp5597650p5597650.html<http://cxf.547215.n5.nabble.com/CXF-Test-client-for-JAXB-load-testing-tp5597650p5597650.html>**> Sent from the cxf-user mailing list archive at Nabble.com.-- Sergey Beryozkin Talend Community Coders http://coders.talend.com/ Blog: http://sberyozkin.blogspot.com-- Sergey Beryozkin Talend Community Coders http://coders.talend.com/ Blog: http://sberyozkin.blogspot.com
-- Sergey Beryozkin Talend Community Coders http://coders.talend.com/ Blog: http://sberyozkin.blogspot.com
