Difference between revisions of "The Blob"

From CloudScale
Jump to: navigation, search
(Problem)
(Problem)
Line 24: Line 24:
 
For example, if the Controller wants to open the valve, it must get the current status from the valve
 
For example, if the Controller wants to open the valve, it must get the current status from the valve
 
first and tell the valve to open. See the code below:
 
first and tell the valve to open. See the code below:
void openValve() {
+
''void openValve() {
 
status currentStatus;
 
status currentStatus;
 
currentStatus = theValve->getStatus();
 
currentStatus = theValve->getStatus();
 
if (currentStatus != open)
 
if (currentStatus != open)
 
theValve->open();
 
theValve->open();
}
+
}''
 
In the case when the valve is closed, it costs two messages to open the valve including one
 
In the case when the valve is closed, it costs two messages to open the valve including one
 
unnecessary message. This could potentially lead to unnecessary message traffic, which hinders
 
unnecessary message. This could potentially lead to unnecessary message traffic, which hinders

Revision as of 13:08, 5 November 2013

Contents

The Blob

Also Known As

The god class

Example

assume we have a process controller program. There are Controller and Valve Class as Figure 3.1 shows. This example is from [1].

Context

Systems with concurrency and mostly those that access a database.

Problem

this problem occurs when one class performs most of the system work relegating other classes to minor, supporting roles. As in the example, the Controller does all the system work, openValve and closeValve. The Valve simply reports its status (open or closed) and answers the Controller’s invocation, open and close respectively. The Controller requests information, make decisions and orders the Valve to open or close. For example, if the Controller wants to open the valve, it must get the current status from the valve first and tell the valve to open. See the code below: void openValve() { status currentStatus; currentStatus = theValve->getStatus(); if (currentStatus != open) theValve->open(); } In the case when the valve is closed, it costs two messages to open the valve including one unnecessary message. This could potentially lead to unnecessary message traffic, which hinders scalability.

Detection

Since a One Lane Bridge is a typical scalability problem, we look at the performance behaviour with respect to an increasing level of concurrency. To detect this antipattern, we define a series of experiments observing the end-to-end response time while increasing the number of users for each experiment. The strategy increases the number of users until

  1. a resource is fully utilized (i.e., its utilization is larger than 90%),
  2. response times increase more than 10 times, or
  3. the maximum number of potential concurrent users is reached.

In order to distinguish an OLB from a Bottleneck Resource, we additionally measure resource utilization during each experiment. The following figure illustrates the measurement results for three different scenarios: i) the system under test (SUT) contains an OLB, ii) the SUT contains no problem, and iii) the SUT contains a bottleneck resource (BR). The graphs on the left hand side show the average response times with respect to the number of users. The graphs on the right hand side show the corresponding mean CPU utilization.

OLB.png

If the SUT contains an OLB, its critical passive resource leads to strongly increasing response times for an increasing number of users. Additionally, CPU utilization is low since the throughput is limited by the passive resource. If the CPU is a Bottleneck Resource (BR), response times increase and CPU utilization is high. Thus, we do not assume an OLB to be present. Finally, if no performance problem occurs, response times and CPU utilization increase only moderately.

Solution

In vehicular traffic, the one-lane bridge problem can be resolved by constructing multiple lanes, constructing additional bridges, or rerouting traffic. In the realm of software systems we have similar solutions:

  • Increasing the number of threads (or processes) that can simultaneously access the resource. In our example above, this can be achieved for example by using multiple tables that can be consolidated later.
  • Reducing the holding time, by limiting the time every process needs to hold the resource, either by removing code from the holding-block that does not need a lock on the resource, or reducing the service time of the resource.

See also

Traffic Jam

References

  1. A. Wert, J. Happe, and L. Happe, Supporting Swift Reaction: Automatically Uncovering Performance Problems by Systematic Experiments, in Proceedings or the International Conference on Software Engineering (ICSE), 2013.
  2. C. Smith and L. Williams, Software Performance Antipatterns, in Proceedings of WOSP. ACM, 2000, pp. 127–136.