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? (time to motivate for a new laptop :) 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 Kiren >>>> >>>> On 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 explain >>>>> >>>> some 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 >>>> >>>> Regards >>>> >>>>> Kiren >>>>> >>>>> On Tue, Mar 27, 2012 at 11:04 PM, Sergey >>>>> Beryozkin<[email protected]**** >>>>> >>>>>> wrote: >>>>>> >>>>> >>>>> Hi Kiren >>>>> >>>>>> >>>>>> On 27/03/12 13:09, Kiren Pillay wrote: >>>>>> >>>>>> Hi Sergey, >>>>>> >>>>>>> >>>>>>> Attached is a war file against which I am testing my client. >>>>>>> >>>>>>> great, thanks >>>>>>> >>>>>> >>>>>> >>>>>> The 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 >>>>>> >>>>>> from >>>>>>> maven 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.jar >>>>>>> >>>>>>> >>>>>>> Regards >>>>>>> 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 >
