The unbalanced system in Figure 2 would benefit noticeably if you were to upgrade component f to the performance level of g . Thus you derive only a partial return on your investment in the upgrade. System bottlenecks can be moved, but other components take their place. Upgrade all lower-performance components for a full return on investment. But in reality, 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. It's important to keep in mind that all systems have a bottleneck somewhere. So your goal, as shown in the examples above, is to match the performance capabilities of your system's components in such a way that no single component is hampering the performance of any other component. This sublety plays havoc with all kinds of performance analysis projects, including benchmarks.