It is important to be aware of logical and virtual resources as well as real resources. Threads can be
blocked by a lack of logical resources just as for a lack of real resources, and expanding the underlying
real resource does not necessarily ensure that additional logical resources will be created. For example,
the NFS server daemon, or nfsd daemon on the server is required to handle each pending NFS remote
I/O request. The number of nfsd daemons therefore limits the number of NFS I/O operations that can be
in progress simultaneously. When a shortage of nfsd daemons exists, system instrumentation might
indicate that various real resources, like the CPU, are used only slightly. You might have the false
impression that your system is under-used and slow, when in fact you have a shortage of nfsd daemons
which constrains the rest of the resources. A nfsd daemon uses processor cycles and memory, but you
cannot fix this problem simply by adding real memory or upgrading to a faster CPU. The solution is to
create more of the logical resource, the nfsd daemons.
Logical resources and bottlenecks can be created inadvertently during application development. A method
of passing data or controlling a device may, in effect, create a logical resource. When such resources are
created by accident, there are generally no tools to monitor their use and no interface to control their
allocation. Their existence may not be appreciated until a specific performance problem highlights their
importance.
Minimizing critical-resource requirements
Consider minimizing the workload’s critical-resource requirements at three levels, as discussed below.
Using the appropriate resource
The decision to use one resource over another should be done consciously and with specific goals in
mind. An example of a resource choice during application development would be a trade-off of increased
memory consumption for reduced CPU consumption. A common system configuration decision that
demonstrates resource choice is whether to place files locally on an individual workstation or remotely on
a server.
Reducing the requirement for the critical resource
For locally developed applications, the programs can be reviewed for ways to perform the same function
more efficiently or to remove unnecessary function. At a system-management level, low-priority workloads
that are contending for the critical resource can be moved to other systems, run at other times, or
controlled with the Workload Manager.
Structuring for parallel use of resources
Because workloads require multiple system resources to run, take advantage of the fact that the resources
are separate and can be consumed in parallel. For example, the operating system read-ahead algorithm
detects the fact that a program is accessing a file sequentially and schedules additional sequential reads
to be done in parallel with the application’s processing of the previous data. Parallelism applies to system
management as well. For example, if an application accesses two or more files at the same time, adding
an additional disk drive might improve the disk-I/O rate if the files that are accessed at the same time are
placed on different drives.
Resource allocation priorities
The operating system provides a number of ways to prioritize activities. Some, such as disk pacing, are
set at the system level. Others, such as process priority, can be set by individual users to reflect the
importance they attach to a specific task.
Repeating the tuning steps
A truism of performance analysis is that there is always a next bottleneck. Reducing the use of one
resource means that another resource limits throughput or response time. Suppose, for example, we have
a system in which the utilization levels are as follows:
CPU: 90% Disk: 70% Memory 60%
10 Performance Management Guide