- Table of Contents
- Copyright
- About the Lead Authors
- About the Contributing Authors
- Acknowledgments
- Tell Us What You Think!
- Introduction
- I. Red Hat Linux Installation and User Services
- Chapter 1. Introduction to Red Hat Linux
- Chapter 2. Installation of Your Red Hat System
- Chapter 3. LILO and Other Boot Managers
- Chapter 4. Configuring the X Window System, Version 11
- Chapter 5. Window Managers
- Chapter 6. Connecting to the Internet
- Chapter 7. IRC, ICQ, and Chat Clients
- Chapter 8. Using Multimedia and Graphics Clients
- II. Configuring Services
- Chapter 9. System Startup and Shutdown
- Chapter 10. SMTP and Protocols
- Chapter 11. FTP
- Chapter 12. Apache Server
- Chapter 13. Internet News
- Chapter 14. Domain Name Service and Dynamic Host Configuration Protocol
- Chapter 15. NIS: Network Information Service
- Chapter 16. NFS: Network Filesystem
- Chapter 17. Samba
- III. System Administration and Management
- Chapter 18. Linux Filesystems, Disks, and Other Devices
- Chapter 19. Printing with Linux
- Chapter 20. TCP/IP Network Management
- Chapter 21. Linux System Administration
- Working as root
- Performing System Maintenance
- Managing Software with RPM
- Using Gnome-RPM
- Managing Users and Groups with linuxconf
- Managing Users and Groups from the Command Line
- Setting Disk Quotas with linuxconf
- Creating Special Accounts with linuxconf
- Analyzing Performance
- Understanding Your Security Responsibilities
- Getting Help
- Summary
- Chapter 22. Backup and Restore
- Chapter 23. System Security
- IV. Red Hat Development and Productivity
- Chapter 24. Linux C/C++ Programming Tools
- Chapter 25. Shell Scripting
- Chapter 26. Automating Tasks
- Chapter 27. Configuring and Building Kernels
- Chapter 28. Emulators, Tools, and Window Clients
- V. Appendixes
- A. The Linux Documentation Project
- B. Top Linux Commands and Utilities
- C. The GNU General Public License
- D. Red Hat Linux RPM Package Listings
Analyzing Performance
Performance analysis is the process of identifying performance bottlenecks in your system. It involves a number of steps. The first step is to look at the big picture: Is the problem CPU- or I/O-related? If it is a CPU problem, what is the load average? You should probably check what processes are running and what is causing the problem. If it is an I/O problem, is it paging or normal disk I/O? If it is paging, increasing memory might help. You can also try to isolate the program or the user causing the problem. If it is a disk problem, is the disk activity balanced? If you have only one disk, you might want to install a second.
The next section looks at several tools that you can use to determine the answers to the preceding questions.
Determining CPU Usage with vmstat
CPU usage is the first test on the list. There are many different ways to obtain a snapshot of the current CPU usage. The one I focus on here is vmstat. The vmstat command gives you several pieces of data, including CPU usage. The syntax for the command is
vmstat interval [count]
interval is the number of seconds between reports, and count is the total number of reports to give. If the count is not included, vmstat will run continuously until you stop it with Ctrl+C or kill the process.
Here is an example of the output from vmstat:
[scooby@cartoons]$ vmstat 5 5 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 1104 1412 10032 36228 0 0 10 8 31 15 7 4 24 0 0 0 1104 1736 10032 36228 0 0 0 3 111 18 1 1 99 0 0 0 1104 1816 10032 36228 0 0 0 1 115 23 2 2 96 0 1 0 1104 1148 10096 36268 8 0 7 4 191 141 4 6 91 0 0 0 1104 1868 9812 35676 6 0 2 10 148 39 25 4 70
The first line of the CPU Usage report displays the average values for each statistic since boot time. It should be ignored. For determining CPU used, you are interested in the last three columns, as indicated by the cpu heading. The column names are us, sy, and id (see Table 21.2).
Table 21.2. vmstat Fields For CPU Usage
| CPU | Description |
| us | Percentage of CPU cycles spent on performing user tasks. |
| sy | Percentage of CPU cycles spent as system tasks. These tasks include waiting on I/O, performing general operating system functions, and so on. |
| id | Percentage of CPU cycles not used. This is the amount of time the system was idle. |
A high CPU time (or low idle time) is not necessarily indicative of an overall CPU problem. It could be that a number of batch jobs running just need to be rearranged. To determine whether the system actually has a CPU problem, it is important to monitor the CPU percentages for a significant period of time. If the percentages are high over an extended time, then the system definitely has a problem.
Next, look at a different section of the vmstat output. If the problem is not CPU-related, check whether it is a problem with paging or normal disk I/O. To determine whether it is a memory problem, look at the headings memory and swap:
[scooby@cartoons]$ vmstat 5 5 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 1 0 0 1096 1848 4580 37524 0 0 9 8 8 17 7 3 29 1 0 0 1096 1424 4580 37980 0 0 92 10 125 24 94 4 3 2 0 0 1096 864 4536 38408 0 0 112 31 146 42 93 2 5 2 0 0 1096 732 4360 38480 10 0 98 7 146 48 97 3 1
Included in the vmstat output is a "snapshot" table detailing the status of your system's memory (see Table 21.3).
Table 21.3. vmstat Fields for Memory and Swap Usage
| Memory & Swap | Description |
| swpd | The amount of virtual memory used (KB) |
| free | The amount of idle memory (KB) |
| buff | The amount of memory used as buffers (KB) |
| cache | The amount of memory left in the cache (KB) |
| si | The amount of memory swapped in from disk (KB/s) |
| so | The amount of memory swapped to disk (KB/s) |
The most important of these fields is the swap in column. This column shows paging that has previously been swapped out, even if it was done before the vmstat command was issued.
The io section is used to determine whether the problem is with blocks sent in or out of the device:
[scooby@cartoons]$ vmstat 5 5 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 1 0 0 1096 1848 4580 37524 0 0 9 8 8 17 7 3 29 1 0 0 1096 1424 4580 37980 0 0 92 10 125 24 94 4 3 2 0 0 1096 864 4536 38408 0 0 112 31 146 42 93 2 5 2 0 0 1096 732 4360 38480 10 0 98 7 146 48 97 3 1
The io section is described in Table 21.4.
Table 21.4. vmstat Fields for IO
| IO | Description |
| bi | The blocks sent to a block device (blocks/s) |
| bo | The blocks received from a block device (blocks/s) |
| cs | The number of context switches per second |
These fields run from several to several hundred (maybe even several thousand). If you are having a lot of in and out block transfers, the problem is probably here. Keep in mind, however, that a single reading is not indicative of the system as a whole; it's just a snapshot of the system at that time. Processes can exist in three states: runtime, uninterrupted sleep, and swapped out (see Table 21.5).
Table 21.5. vmstat Fields for Processor Usage
| Processes | Description |
| r | The number of processes waiting for runtime |
| b | The number of processes in uninterrupted sleep |
| w | The number of processes swapped out but otherwise able to run |
The number of processes waiting for runtime is a good indication that there is a problem. The more processes waiting, the slower the system. More than likely, you won't look at vmstat unless you already know there is a bottleneck somewhere, so the r field doesn't give you much vital information.
Using top to Identify Problems
The top command provides another tool for identifying problems with a Linux system. The top command displays the top CPU processes. More specifically, top provides an ongoing look at processor activity in real time. It displays a listing of the most CPU-intensive tasks on the system and can provide an interactive interface for manipulating processes. The default is to update every five seconds. The following is an example of the output from top:
1:36am up 16 days, 7:50, 3 users, load average: 1.41, 1.44, 1.21 60 processes: 58 sleeping, 2 running, 0 zombie, 0 stopped CPU states: 89.0% user, 8.5% system, 92.4% nice, 3.9% idle Mem: 63420K av, 62892K used, 528K free, 32756K shrd, 6828K buff Swap: 33228K av, 1096K used, 32132K free 38052K cached PID USER PRI NI SIZE RSS SHARE STATE LIB %CPU %MEM TIME COMMAND
Table 21.6 explains the values output when using the top command.
Table 21.6. top Fields
| Field | Description |
| up | The time the system has been up and the three load averages for the system. The load averages are the average number of processes ready to run during the last 1, 5, and 15 minutes. This line is just like the output of uptime. |
| processes | The total number of processes running at the time of the last update. This is also broken down into the number of tasks that are running, sleeping, stopped, and zombied. |
| CPU states | The percentage of CPU time in user mode, system mode, niced tasks, and idle. (Niced tasks are only those whose nice value is negative.) Time spent in niced tasks is also counted in system and user time, so the total is more than 100 percent. |
| Mem | Statistics on memory usage, including total available memory, free memory, used memory, shared memory, and memory used for buffers. |
| Swap | Statistics on swap space, including total swap space, available swap space, and used swap space. This and Mem are just like the output of free. |
| PID | The process ID of each task. |
| USER | The username of the task's owner. |
| PRI | The priority of the task. |
| NI | The nice value of the task. Negative nice values are lower priority. |
| SIZE | The size of the task's code plus data, plus stack space, in kilobytes. |
| RSS | The total amount of physical memory used by the task, in kilobytes. |
| SHARE | The amount of shared memory used by the task. |
| STATE | The state of the task, either S for sleeping, D for uninterrupted sleep, R for running, Z for zombied, or T for stopped or traced. |
| TIME | Total CPU time the task has used since it started. If cumulative mode is on, this also includes the CPU time used by the process's children that have died. You can set cumulative mode with the S command-line option or toggle it with the interactive command S. |
| %CPU | The task's share of the CPU time since the last screen update, expressed as a percentage of total CPU time. |
| %MEM | The task's share of the physical memory. |
| COMMAND | The task's command name, which is truncated if tasks have only the name of the program in parentheses (for example, (getty)). |
As you can probably tell from the server used to obtain the previously displayed top data, there are no current bottlenecks in the system.
Using free to Show Available Memory
free is another good command for showing the amount of used and free memory:
[scooby@cartoons]$ free
total used free shared buffers cached
Mem: 63420 61668 1752 23676 13360 32084
-/+ buffers: 16224 47196
Swap: 33228 1096 32132
Table 21.7 describes the values returned when using the free command.
Table 21.7. free Fields
| Field | Description |
| Mem | Shows the physical memory. |
| total | Shows the amount of physical memory not used by the kernel, which is usually about a megabyte. |
| used | Shows the amount of memory used. |
| free | Shows the amount of free memory. |
| shared | Shows the amount of memory shared by several processes. |
| buffers | Shows the current size of the disk buffer cache. |
| cached | Shows how much memory has been cached off to disk. |
| Swap | Shows similar information for the swapped spaces. If this line is all zeros, your swap space is not activated. |
To activate a swap space, use the swapon command. The swapon command tells the kernel that the swap space can be used. The location of the swap space is given as the argument passed to the command. The following example shows starting a temporary swap file:
[root@cartoons]# swapon /temporary_swap partition
To automatically use swap spaces, list them in the /etc/fstab file. The following example lists two swap files for /etc/fstab:
/dev/hda8 none swap sw 0 0 /swapfile none swap sw 0 0
To remove a swap space, use the swapoff command. Usually, this is necessary only when using a temporary swap space.
Using renice to Alter Process Priorities
The renice command is used to alter the priority of running processes.
By default in Red Hat Linux, the nice value is 0. The range of this is –20 to 20. The lower the value, the faster the process runs. The following example shows how you display the nice value by using the nice command. My shell is running at the default value of 0. To check this another way, I issue the ps -l command. The NI column shows the nice value:
[scooby@scooby]$ nice 0 [scooby@cartoons]$ ps -l FLAGS UID PID PPID PRI NI SIZE RSS WCHAN STA TTY TIME COMMAND 100 759 3138 3137 0 0 1172 636 force_sig S p0 0:00 -bash 100000 759 3307 3138 12 0 956 336 R p0 0:00 ps -l
I can change the nice value by using the renice command. The syntax of the command follows:
renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]
In the following example, the shell's nice value is changed to a value of 5. This means that any process with a lower value will have priority on the system:
[scooby@cartoons]$ renice 5 3138 3138: old priority 0, new priority 5 [scooby@cartoons]$ nice 5 [scooby@cartoons]$ ps -l FLAGS UID PID PPID PRI NI SIZE RSS WCHAN STA TTY TIME COMMAND 100 759 3138 3137 5 5 1172 636 force_sig S N p0 0:00 -bash 100000 759 3319 3138 14 5 968 368 R N p0 0:00 ps -l
The owner of the process and root have the ability to change the nice value to a higher value. Unfortunately, the reverse is not true:
[scooby@cartoons]$ renice -5 3138 renice: 3138: setpriority: Permission denied
Only root has the ability to lower a nice value. This means that even though I set my shell to a nice value of 5, I cannot lower it even to the default value.
The renice command is a wonderful way of increasing the apparent speed of the system for certain processes. This is a trade-off, however, because the processes that are raised will now run slower.
One other command that may help as you are trying to troubleshoot your system is the lsof command. The lsof command lists open files. The output includes information about the type of file, the device using the file, its node, and its name.
For more info, see the man pages for these commands.
Understanding Your Security Responsibilities | Next Section

Account Sign In
View your cart