A while back, I read Six Thinking Hats by Edward de Bono. In this book, de Bono used the idea of ‘thinking hats’ to focus on a certain way of analyzing a subject or problem. The white hat is factual, red hat is emotional, black hat is critical, etc… It really is an insightful book and I highly recommend it. If you’d like to know more about the six hats check Wikipedia for a primer.
It occured to me that options to address system performance problems could be discovered using a similar technique. By focusing on certain types or categories of options, you leave fewer stones unturned in getting to a resolution or mitigating performance problems.20
In resolving issues, we need to generate options. However, often we immediately discard those options we deem unable or difficult to be changed. There are two different types of these constraints.
One is possibility, the other is feasibility.
The first is bound by reality. For example, try calling your network carrier to ask them to reduce your latency between New York and London. It is not possible with today’s knowledge and technology to speed up light.
The second constraint is feasibility. This is your realm of influence. Some options are technically plausible, but not feasible due to other constraints. Generally, it is beyond my realm of influence to change security policies or spend dollars not in my budget. But it is not impossible with the right justification or support.
When focusing on these categories, be sure to include all possible options. If you’re stuck, impossible options can serve as fodder for other generating other ideas. The terminology I use could be improved – but it works for me. The focus categories I’ve identified are:
Capacity – This is the option of going faster or wider. Examples of this include a faster or more processors, more memory, or additional bandwidth. This is often referred to as scaling vertically. Increasing capacity helps with issues due to lack of resources. It is often the most frequently examined focus when performance problems hit. If the CPU can process more instructions in a given period of time, often the work can be completed sooner.
Partioning – Splitting the load or set of work across multiple systems or dedicating resources to a given segment of work. This is often referred to as scaling horizontally. Partitioning can improve performance by distributing the work across multiple systems. A caveat of partitioning is that the work must be conducive to partitioning. A workload can be split and processed concurrently with other workloads. Applied to a database this would be data partitioning. This idea could also be applied as grid computing or load sharing across multiple web servers.
Demand – Often reducing the demand on a system is not considered. Many times, some work simply does not need to be done or can be done at a later time. Focus on the core function of the system, consider simply not doing other work, or perform the work at a different time. The idea of batch processing is a demand option. By holding non-time sensitive requests they can be performed during non-peak times.
Prioritization – Protect your core functionality. Ensure that all critical work get resources when needed, let other work wait or run slower. Network QoS is a perfect example of this option.
Tuning – How can you improve efficiency? Tuning is making sure the system doing the most amount for work for the resources it consumes. Proper indexing would be a tuning option. Adjusting TCP window size, or retransmit timers are tuning options.
Design – Design options include changing the way the work is performed. Some may argue that all of these categories may be design options. However, I consider design to be at an algorithmic or fundamental operation level. A design change would be converting to system to use MQ rather than FTP to transfer files.
System – This category includes system software upgrades, bug fixes or other ‘black box’ type options. New database drivers are system options.