
Several performance tuning for web services
Posted by andy.song in Twins Father on Dec 15, 2010 12:23:29 PM- Turn on Gzip for web service request and response
When constructing client stub instances, we can do the following things: (Assume we use CXF or JAWS-ri)
AService portyType = super.getPort(AServiceQName, AServicePortType.class);
BindingProvider bp = (BindingProvider) portType;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"<service address>");
Map<String, List<String>> httpHeaders = new HashMap<String, List<String>>();
// For request
httpHeaders.put("Content-Encoding", Collections.singletonList("gzip"));
// For response
httpHeaders.put("Accept-Encoding", Collections.singletonList("gzip"));
bp.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);
It can reduce a lots network bandwidth and faster transfer flow in the network But the server need do some configuration change can accept or
recognize gzip content.
- Cache | Pool the service stub handler
For jbossws, CXF, jaws-ri you can cache or pool the client service stub handler, you can get benefit from the JAXB cache. So the total
performance will improve a lot. But XFire you cannot as it will have perm generation contiue gc issues.
And cache | pool has two choices:
* Session based
Invovle http session, it more like pool
* Dispather
Invovle some load balancing, so it more like cache
- Reduce as many network communication as you can
* Coarse-grained api provided
But that not 100% true. For example: 99% customer need one field of one service model, at that time corase-grained or fine-grained ? But in
general coarse-grained api was the goal
* Know your capacity
Define the box for your services, so that means know your server capacity. Load balancing and partitionning prepare from the very beginning.
- Service aggregator
* Multiple correlated service request can be aggregate together and consider gateway service.
So the average performance of mutiple intranet communications better than the average of multiple internet communications.
- Tuning your enviornment
* Turn on the large memory page support
Reduce the page missing and avoid cpu swap the phsyical memory and disk.
* Turn on NUMA, turn of hyperthreading, turn Tubor boost
* Configure the JVM with the folloing:
** Turn on support NUMA: -XX:+UseNUMA -XX:NUMAPageScanRate=0 -XX:-UseAdaptiveNUMAChunkSizing
** Give enough memory with 64bit: -Xmx16g -Xms16g -Xmn4g
** Turn on parallel old gc if support: -XX:ParallelGCThreads=50 -XX:+UseParallelOldGC
** Turn on large page support: -XX:LargePageSizeInBytes=64m
Comments