Posts tonen met het label introduction. Alle posts tonen
Posts tonen met het label introduction. Alle posts tonen

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!