Sunday, January 10, 2010

Basic Definitions + Guidelines

For enterprise applications, the distinguishing feature of the deployment environment are the network links that exist between application tiers:



The existence of these network links is relevant because the time necessary to make a call over a network link is thousands of times longer than what would be necessary to make a call passing the same parameters locally. Further, looking at the time necessary to make a network call in detail reveals two components:

Network Latency – A relatively fixed duration that is incurred by all transmissions across the link. Think of it as the time necessary for the first transmission packet to make its way from the sender, through all intermediate networks and network devices, to the receiver.

Serialization Delay – A highly variable duration that is the time required to move the entire transmission content over the effective bandwidth available. A good analog for this type of transmission delay is water draining out of a sink. The larger the drain hole is, that faster the sink will drain.

Given that these two types of transmission delay together are typically thousands of times longer that memory call durations and neither adds anything positive to the application user’s experience, you would think they should be minimized. That leads us directly to the most fundamental guidelines for performance engineering:
  • Reduce the number of calls across application tiers in order to avoid network latency.
  • Reduce the size of messages that are passed between application tiers in order to avoid serialization delay.


Design efficiencies that are not related to these two fundamental guidelines do exist and they are important, but I’m always amazed at the variety of performance problems that relate to one of these if you dig into it deep enough.

Sunday, January 3, 2010

Priorities

You might think the first priority of a blog called ‘The Performance Analyst’ would be performance engineering, but optimizing application performance is just one element of an organization’s software development process. A manager of mine stated our priorities in this order:

1) Functionality
2) Scalability/Performance
3) Maintainability

Simply listing these things in priority order brings a lot of clarity to development discussions, mostly because you just don’t sacrifice a higher priority aspect of the software to improve a lower priority aspect. As a performance engineer, I find that clarity focuses attention on figuring out how to accommodate required functionality as opposed to questioning it’s necessity. That having been said, if an organization is truly committed to delivering a quality product those who control the functionality aspect will consider the performance and maintainability ramifications of their decisions. Similarly, those of us involved in performance engineering need to consider the maintainability ramifications of our decisions.

I mention these things because I have often heard developers criticize elements of my organization’s performance engineering program as harming maintainability. In many cases, instead of a true conflict between priorities, this criticism is more about valuing a lower development priority over a higher one.