Each component’s performance characteristics can have an effect on the system’s performance as a whole. Bottlenecks can be created by a great number of subcomponents and component interactions. Protocols create bottlenecks. Specific software functionality creates bottlenecks. In fact, every part and process of a system is a potential bottleneck. However, it’s important to keep in mind that only one bottleneck—the system’s weakest point—can exist at one time.
Another point to remember is that all systems have a weak point somewhere. Your goal is to match the performance capabilities of your system’s components in such a way that no single component hampers the performance of any other component. The following figure shows a well-designed system with matched components.
Figure 4-1 A Well-Designed System
Note that all components in a well-designed system are within the same range of performance. But in this case, a less than optimum component is cost effective. The components are so closely matched that upgrading the lower-end component a would not increase performance enough to make it worth the cost.
The next figure shows a poorly designed system with an inefficient mix of low-performance and high-performance components.
Figure 4-2 A Poorly Designed System
In this system, components f and g have performance characteristics that are considerably inferior to components h, i, and j. With component f as the bottleneck, components h, i, j, and even g are constrained by f so that they run much more slowly than their designs would otherwise permit. In this system, the bottleneck is significantly hampering the system’s performance.
This is a poorly designed system because the high-performance components aren’t able to perform anywhere near their full potential. In fact, because of the high-performance characteristics of h, i, and j, this system might have cost more than the well designed system. But it cannot perform as well because of the greater disparity between its low- and high-performance components.
The next figure shows an unbalanced system. This system would benefit noticeably if you were to upgrade component f to the performance level of g. But if you were to upgrade f to a performance level beyond g, all additional performance characteristics in f would be lost because the bottleneck would move to component g.
Figure 4-3 Unbalanced System
Thus you derive only a partial return on your investment in the upgrade. To accomplish more than moving the bottleneck, both components must be upgraded to the level of h before a full return on investment in h, i, and j can be reached.
It is useless to test any single component of a system to its fullest capacity without allowing for the possibility that another component is actually bottlenecking system performance. You can upgrade system components, but you won’t see any significant improvement until you isolate the system bottleneck, assess its relationship to the performance characteristics of the entire system, and take appropriate action.
Bottleneck isolation is critical if you’re building high-performance systems. You need to know how and where your system is bottlenecking. Moreover, you need to know how tightly that bottleneck is coupled with the performance characteristics of the rest of the system. If the poorly performing component is in a different performance category than the other components, you might obtain a greater return on investment by making the necessary upgrades to move the bottleneck to the highest possible performance level.
This discussion is taken from Performance Analysis: Isolating the Real Bottleneck in a System, in the January 1996 AppNotes®.