maandag 14 november 2011

Performance Architecture Checklist

This checklist can be used to help you in your design for a scalable application. The idea is, you take performance into consideration while you are designing your architecture, not after done.


You will need to think carefully, which matters apply to you and how you will have to implement them.
This is not a silver bullet, but a mental exercise.

Deployment and Infrastructure

  • Use distributed architectures appropriately. Do not introduce distribution unnecessarily! 
  • Carefully select appropriate distributed communication mechanisms. 
  • Locate components that interact frequently within the same boundary or as close to each other as possible. 
  • Take infrastructure restrictions into account in your design 
  • Consider network bandwidth restriction 
  • Identify resource restrictions. 
  • Ensure your design does not prevent you from scaling up. 
  • Ensure your design does not prevent you from scaling out and it uses logical layers, does not unwittingly introduce affinity, and support load balancing!

Coupling and Cohesion

  • Ensure your design is loosely coupled.
  • Exhibit appropriate degrees of cohesion in your design and group together logically related entities, such as classes and methods.

Communication
  • Interface do not enforce chatty communication.
  • Ensure your application only makes remote calls where necessary. Impact is minimized by client-side validation, client-side caching, and batching of work.
  • Optimize remote data exchange.
  • Choose appropriate secure communications mechanisms.
  • Use message queues to decouple component parts of your system.
  • Mitigate the impact of long-running calls by using message queues, “fire-and-forget” approaches, and asynchronous method calls.

Concurrency

  • Watch out which types you use. Many basic types have locking behaviour. Example HashMap, instead when in doubt, use Concurrent(HashMap).
  • Carefully consider lock granularity. Synchronised(writes > reads) or locks (reads > writes).
  • Ensure your application acquires shared resources and locks late and releases them early to reduce contention.
  • Choose an appropriate transaction isolation level.
  • Ensure your application uses asynchronous execution for I/O bound tasks and not for CPU bound tasks.

Resource Management

  • Ensure your design supports and makes effective use of pooling.
  • Ensure your application acquires resources late and releases them early.

Caching

  • Use caching for data that is expensive to retrieve, compute, and render.
  • Cache appropriate data such as relatively static Web pages, specific items of output data, stored procedures parameters, and query results.
  • Do not use caching for data that is too volatile.
  • Select an appropriate cache location.
  • Select an appropriate cache expiration policy.

State management

  • Your design favors stateless components. Or, you considered the negative impact of scalability if you decided to use stateful components.
  • If you use Web services, you also use a message-based stateless programming model.
  • Make objects you want to store serializable.
  • Consider performance impact of what you put in your session.
  • Use statistics to help you, get your thread pool and sessions duration wright.

Data structures and Algorithms

  • Ensure your design uses appropriate data structures.
  • Use custom collections only where absolutely necessary.

Data Access

  • Pass data across the layers by using the most appropriate data format. Carefully consider the performance implications.
  • Use stored procedures for complex data access.
  • As rule: Don’t use loops, when accessing data with your ORM(example hibernate).
  • Only process the data that is required. (Less is more)
  • Where appropriate, provide data paging solution for large result sets.

Exception Handling

  • Do not use exceptions to control regular application flow.
  • example: if you control a Single Sign On system, when the user mistypes his password. This is a normal flow!
  • Structured exception handling is the preferred error handling mechanism. Do not rely on error codes.
  • Only catch exceptions for a specific reason and when it is required.

Monitoring

  • Implement monitoring in your application, that can be turned on and off. When turned of this should have zero impact.
  • Implement Application Monitoring. Showing you where time is being spend in your application
  • Implement User Performance Monitoring. This will let your see where the user is spending his time.
  • Allow tracing over multiple tiers.
  • Automatically monitor slow request.
  • Implement sampling of your data. This will lower the impact when you need to monitor your application.
  • Use the statistics for your monitoring, when you are thinking of making adjustments to your architecture.

Common Sense

Use it!

This checklist originated/(largely based) from the Microsoft best practices. Please continue reading there. It’s a very good site with lots of help full tips, while being only slightly outdated. This show that performance is not technology specific.

woensdag 9 november 2011

Performance Requirements?


Design for performance: Requirements

Before designing an architecture, we should know what we want. Our goal here is to include performance as part of the solution, not part of the problem.

The real problem for me in completing this document with my customer, is the customer didn’t think of response times while trying to solve his problems. That’s why I suggest always giving the user a couple of choices. Ask them what feels right, what feels acceptable? Not, want they want, because most of the time, they don’t know or it isn’t realistic. I will discuss this subject (Performance Psychology) later on, in on of my next blogs.

General


  • Response time(ms): It’s common to here to make a difference between writes and reads operations(get/post).
    • Average(ms): What do you expect?
    • Maximum response time(ms): What is acceptable?

Note: I normally split this up in, maximum time under normal circumstances and while the system is under heavy load.
  • Throughput(hourly of minutes): maximum amount of requests your system should be able to handle. Think of spikes.
  • Concurrent Users: How many users will be using the system at the same time.

User type

Depending on the type of user using the system, these will vary enormously.
Interactive(Human)? Is a person using the system?
Synchronous  or As-synchronous: The “micro”second the user can continue working, is the time you should measure.
Batch/Scheduled(Machine)? Is an application using your application? Define your time window and don’t forget, you are not alone! Other batch jobs of application can be running at the same time.

Scope


Define these previous requirements for the entire application and for specific business cases.

Application requirements

The application requirements are good defaults. These requirements will also help you decide what kind of hardware you will need.

Business requirements

Performing Business logic is key, so performance should play a part in here as well.

Eligible Business cases:
  • Frequently used scenarios
  • Performance-intensive scenarios
  • Business-critical scenarios
  • Scenarios of special interest


For business cases add the following requirement:

Task driven (Usability/Performance)

Task completion: How much time would the person need to accomplish the task?
Task feedback loop: How fast can we give the user feedback about his task?
This may not sound like a performance criteria, but here you can gain the most time. By smart interface design, you can solve problems faster(performance) and better.

Technical

Resource cost: CPU, file access, network, data access....
You will have limitations, either from your own system(hardware), or an other systems you are working with.
Volatile data: Decide how volatile the data(ready to change) is. 

  • Very Volatile(data changes often): Make the data you need as small as possible. 
  • Not Volatile(data doesn't change often): Caching maybe? It’s not a must, but think about it.

Most data lays somewhere in between, so always be careful, how much data you need(less is more).

Scalable: This is closely related to the resource cost. You should watch out for bottlenecks here. Ask yourself the question: In case my application grows, where will it have the most impact? Can we handle this additional load, or can we scale it(example: more hardware)? This question will be handled in my next blog post. (Scalable Architecture)

Would you like to know more:


http://www.testingreflections.com/node/view/4432

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/doc_perf_reqs.htm
http://www.perftestplus.com/resources/requirements_with_compuware.pdf


Remember: Performance is a part of solving the problem, it doesn’t stand alone!

These are my two cents. In case you have something to add, or even better, something to take away(perfect design). Do tell!  

vrijdag 4 november 2011

Start towards Perfomance

Patience is a virtue, but I can’t wait to get my job done. My friend said to me:"Fast, Good, Cheap, pick any 2". Where I replied: How Fast are we talking about?

In Top Gear, people are always talking about the feelings you get when see a car. When you drive it. The feeling of speed is one that stands out for me. Why? A car is made too bring you from point A to point B, as fast possible and as comfortable as possible and now also as cheap as possible. A business website has similar goals, they want the customer to find they way through their site and in too their bank account.

Design for performance is more than tuning, it’s providing a highway from point A to point B, in a tuned up the luxe sport car, where you can feel the wind through your hair. Good usability and good performance should go hand in hand.

This is not done over night, building an application that can handle speed and success takes time and proper testing, so don’t crash when you shave a corner. Structured Load and Stress testing reduces risk of this happening.

There is an other way... What if there were no traffic jam’s, ever? Wouldn’t that safe you more time than a pimped up super car? I know what you are thinking, I would rather have the pimped up super car. But for just a minute, be honest with yourself. If you never had traffic jams, wouldn’t you be happier? Just a little? Think of time you’ll safe. For cars this sounds like science fiction, but for applications it can work. Welcome in the world of Application Performance Management. Here we can intervene proactive, so no accidents in production.

So please join me in this series of blogs, discovering ways how performance improves your day to day job and how easily to accomplish it. Feedback is welcome. I will try to answer your questions to the best of my abilities, when I talk about that subject.


As a personal challenge, I will be updating this blog weekly. Until I get tired of it or I find something more interesting.

woensdag 2 november 2011

Performance Should Be Free


Performance Should Be FREE! Version 2!
Today I hope to add another free tool to your utility belt. To help you resolve your bottlenecks in production faster than before.

AppDynamics Lite version 2. This free profiler/monitor uses your “Business Logic” to visualize the performance problems.  Discover why your search- of checkout-“transaction” is slow.





Once you installed AppDynamics will automatically start detecting your business transactions. If something spikes your interest, you can right click the transaction and ask it to collect samples aka snapshot. These snapshots contain stack traces with method execution times. For example.
com.sample.domain.Cart.checkout(300 ms)
Also external calls, like webservices and SQL statements are collected.


New in version 2, is the trending of MBeans through JMX. This might not get you excited, but you can also add alerting, so receive a mail if a monitored value goes above certain base line.
Now you know if something is going wrong and you can take snapshots (manually) while it’s happening.



Pro’s
  •          Easy to install
  •           Easy to use
  •           Easy to understand
  •      Overhead < 2%

Con’s
  •           It’s limited: Max data retention of 2 hours
  •           Only 30 transactions
  •           It’s not perfect. Use it as your first line, but also consider using other tools like JVisualVM & MAT.

Upgrade? Why?
-          Less work! Snapshots are taken atomically.
-          Jumping from tier to tier. Business transaction can run over multiple tiers, now you can follow them and find out, which tier is causing the problem.

Advice
Try it! It will help you find what you are looking about 80 % of the time.
When your application matures it’s about 90%. (Personal opinion)

Watch the movie!
Install:
New version: