Skip to main content

Application Network Performance Tunnig

This post shares some the factors that need to be considered while designing an application that is going to be accessed using a network having high latencies and low bandwidth. The post will also look at some of the important TCP level tuning factors.

Symptom

The application works well when accessed from some locations and from some other locations its very slow.

Possible causes

Network Issues
  • Network is having high latency
  • Bandwidth is very narrow
  • Packet loss is high
Application design related
  • Multiple calls to server
During design itself avoid using multiple server calls to fulfill a business process.
From the client issue a single call to the server and let the server do the processing and return the desired objects in this call.
  • Unnecessary transfer of data
Re look your design/code and find out whether you are transmitting data that's not of
importance to the client. Reduce all unnecessary data transfer to the client.
  • Sending large chunks of uncompressed data
Using different compression algorithms compress the data before sending to the client. Gzip
compression is a good option. But compression can be CPU intensive ; so the capacity planning should consider this factor also.
  • Not Caching Master Data
Look at the possibility of caching the data that's not changed frequently.

TCP Related
TCP's slow start and congestion control issue :-

TCP starts a session by sending two packets at a time and waiting for acknowledgment.TCP increases its connection window one packet at a time until it receives congestion signal.when it recognizes a congestion signal;it reduces the current send window size to half and then resumes additive increase.This increase happens one packet at time until congestion window equals advertisedWindow or a till a congestion signal is received.

This TCP behavior results in an oscillating send window and it affect the effective utilized capacity of a TCP connection. Large TCP Advertised window is an option to tune this behavior.
This better done by an OS expert.

TCP Window Size:-

TCP has a window of packets that can be in flight from one network end to another.If the window is full ; the sender cannot send additional packets until the destination acknowledges the receipt of some of the already sent packets. Since on a high latency network the acknowledgment takes a long time to come; the transmission from the sender is halted when the window is full until ack comes for the packets already send. This can be a problem.
The possible solution is to increase the TCP window size. The default value of this is 64 KB.
A lot of optimizations on this TCP behavior is done at the OS level in many new OS; like Windows Vista.


Comments

Anonymous said…
Interesting to know.

Popular posts from this blog

Using Database login Module in JBoss

This post is a detailed description on how to use the database login module in JBoss with a J2EE Application. Scenario There is a EJB and we want to restrict the access to this ejb's method to an authenticated user having a particular role. The EJB is accessed from a standalone Java Client using Remote Lookup. Implementation The EJB is HelloSSB and the roles allowed are admin and user. First step is to write the EJB The source code is given below. This is a stateless session bean. package com.prem.ejb; import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.annotation.security.RolesAllowed; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.jboss.annotation.security.SecurityDomain; @Stateless @SecurityDomain ("helloworld") public class HelloSSB implements HellioIntf{ @PersistenceContext(unitName = "EntApp") EntityManager em; @Reso...

Design Patterns

A note on Design patterns Many times we can see ourselves looking for design patterns to fit the design of a requirement. Of course if the requirement is simple enough to apply any existing design pattern we should do so. This will save us valuable time. In my opinion it is better not to worry about which pattern to apply.But concentrate on the three basic Object oriented principles. 1) Encapsulate what varies 2) Prefer composition over inheritance 3) Program to an interface not to an implementation. If we approach the design with these principles in mind , we don't have to search for patterns. Pattern will emerge itself. Once we apply these principles, we can definitely look whether any of the existing patterns can solve the issue better than the way we thought of. This way our thinking process will improve tremendously and at times we may end up creating a solution which may be better than any available design patterns.

Load Balancing

Why do you need to load balance ? Here i will put forward the various options available for web load balancing. Before we go into that , let us first examine why do we need load balancing after all.Consider you develop a website and is available to the public.If the application is served from a single webserver then there is a high chance that the machine will be overwhelmed if the usage of the application increases. This may result in users experiancing unusually high response times or in worse case the machine can come to a halt.So you need some mechanism to distribute the load across different machines,without the client having to swich address. There are many widely used approaches. The most common ones are DNS based load balancing Software load balancing Hardware load balancing DNS based Load Balancing Here the DNS server is configured in such a way that it returns different IP addresses for various requests to the DNS server for a particular domain name. The DNS server may contai...