Whether you are using the Internet Information Server for Internet or intranet publishing, the goal is to obtain the maximum performance from it. The starting point is to tune the base platform (Windows NT Server). Depending on your IIS implementation, however, you may need to tune other components as well. If you are using SQL Server to store your IIS logs or to use as dynamic WWW pages, you will need to tune SQL Server, for example. In this chapter, you will learn how to tune Windows NT Server first, and then the Internet Information Server, using some Performance Monitor examples. Along the way, you will see a few programs I wrote to illustrate the type of bottlenecks you might encounter.
Keep in mind while reading this chapter that the IIS basically provides the same services as a file server. It consumes processor cycles as an application server, and it provides shared resources (files, WWW pages, and so on) to network clients. You can think of the Internet as a large WAN connected to your internal network. The methodologies you use to tune for optimum IIS performance are the same as you would apply to any application or file server.
Performance tuning is based on finding your bottleneck (the item causing a performance limitation) and then doing something to correct the situation. The primary goal with performance tuning is to provide adequate system performance. And this basically falls into four categories: the processor, memory, disk subsystem, and network. If these components are performing well, your users generally will not complain to you about system performance. This section explores each of these areas and provides sample Performance Monitor workspaces to illustrate the process of finding bottlenecks in these areas.
One thing to consider about performance bottlenecks is that when you find and solve one bottleneck, it always exposes another bottleneck. Now look at an example that illustrates this point.
Suppose that you have a server with a 100 MHz Pentium processor, 32 MB of main memory, a really fast pair of EIDE disk drives, an EIDE disk controller, and a 16-bit network adapter. Your primary concern is providing a fast user response time for shared files and SQL Server access. Where do you think the performance bottleneck would be? The processor? Memory? The disk subsystem? The network adapter? Based on my experience, it would turn out to be the disk subsystem. This would be caused by the EIDE controller. This controller would use the standard ATDISK driver provided with Windows NT Server. And this driver can support only one pending I/O request at a time. It's not really the fault of the driver, though. Instead, it is the hardware it supports. Almost all IDE (and EIDE) disk controllers use programmed I/O (or PIO). A PIO controller uses the processor to move data from the disk, through the disk controller, and then to system memory. This requires a high percentage of processor time and limits the device to one I/O request at a time.
The solution here is to replace the EIDE disks and controller with SCSI disk drives and a SCSI controller that supports direct memory access (DMA). A controller that supports DMA moves data from the disk to system memory without processor intervention. Although even here, you need to exercise good judgment. Don't choose an 8-bit or 16-bit SCSI controller if you have a 32-bit expansion bus. Both these require copying data from the disk drive to memory below 1 MB for an 8-bit controller, and below 16 MB for a 16-bit controller. This data then must be copied to the application or system buffer above 16 MB if you have more than 16 MB installed in your system. This coping of data is referred to as double buffering, and it can severely hamper system performance.
Instead, choose a 32-bit SCSI controller. The basic idea is to choose a disk controller with the largest I/O bus that your expansion bus supports for the fastest data-transfer rate. Now that you have increased the performance of your I/O subsystem, however, and performance does increase compared to the base system, another performance bottleneck may be exposed. This most likely will be the processor. SQL Server can be very processor intensive. Adding an additional Pentium processor and dedicating this processor to SQL Server will increase SQL Server performance. After this occurs, you'll probably find that replacing your network adapter with a 32-bit network adapter and adding additional memory can increase performance even more. And this can go on and onliterally, forever. Eventually, you have to draw the line based on your budget and acceptable performance requirements.
Finding processor bottlenecks on your server is not an easy task, but it is possible. The starting point is to use the performance counters included in Processor.PMW, which can be found on my web site http://www.nt-guru.com/windows nt/performance or in my other books, Microsoft BackOffice Administrator's Survival Guide and Internet Information Server for Windows NT Unleashed. This workspace file includes processor chart, alert, and report view settings. Table 7.1 lists these object counters.
Object |
Counter |
Instance |
Parent |
Description |
|
System |
% Total Processor Time |
N/A |
N/A |
Percentage of processor time currently in use on your system. The basic formula for calculation is ((% CPU in Use on CPU 0) + (% CPU in Use on CPU 1) ... + (% CPU in Use on CPU x)) / Total number of CPUs. |
|
System |
System Calls/sec |
N/A |
N/A |
Number of system service calls executed per second. If this value is lower than the number of interrupts/sec, this indicates that a hardware adapter is generating excessive interrupts. |
|
System |
Context Switches/sec |
N/A |
N/A |
Frequency of switches between executing threads. A high value indicates that a program's use of critical sections or semaphores should have a higher priority to achieve a higher throughput and less task switching. |
|
System |
Processor Queue Length |
N/A |
N/A |
Number of threads waiting in the processor queue for processor cycles. A consistent value of 2 or higher indicates a processor bottleneck. This value always is 0 unless at least one thread is being monitored. |
|
System |
Interrupts/sec |
Per Processor |
N/A |
Number of interrupts the system is servicing. |
|
Thread |
% Processor Time |
Per Processor |
Idle |
Percentage of processor time the thread is using. |
The first step in finding a processor bottleneck is to obtain a baseline chart to familiarize yourself with your system in an idle state (see Figure 7.1). Then you should use the same counters to obtain a baseline in a normal working state.
Figure 7.1. Using Performance Monitor to isolate processor bottlenecks.
The next step is to use these counters on an active system. Examine the % Total Processor Time counter. If this value is consistently more than 90 percent, you have a processor bottleneck. You then must examine each process in the system to see which one is using more of the processor than it should. If you have too many processes to view in a chart, you can use the report view. To select these processes, choose Edit|Add to Chart and select Process as the object type. Then select % Processor Time for the counter. Next, select each application listed in the Instance field. The process that has the highest peak generally is your performance bottleneck. Now take a look at this process in a little more detail by looking at a sample performance hog.
In a multithreaded environment, such as Windows NT Server, a processor shares CPU cycles among multiple threads. Each of these threads can be running or waiting for execution. If you have an application that is waiting for user input or for a disk I/O request, for example, while it is waiting, it is not scheduled for execution. So other threads that can perform work execute instead. This is based on the application design, however, and in this regard, not all applications are created equal. Many applications have been ported from a different application environment, and might not make efficient use of the Win32 APIs. If you ported an MS-DOS application to a Win32 console application, for example, you might have left programming constructs that constantly polls for user input, increments a counter in a loop, or performs a similar function. Listing 7.1 provides an example of this process.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
unsigned long uMaxNumber,x;
char chUserInput;
for(x=0;x=4294967295;x++)
{
uMaxNumber=x;
}
printf("Counter = %d", uMaxNumber);
chUserInput=getchar();
return (0);
}
When this application executes, it uses between 80 and 98 percent of the processor, as shown in Figure 7.2. This is the definition of a processor-intensive application. Notice that I have the Process object selected for the BadExample application (or instance). This is the same object counter you will use (but, of course, you will use different process instances) to determine what percentage of the processor your applications are using and which process is the bottleneck.
Figure 7.2. An example of a processor-intensive application displayed with Performance Monitor.
The executable for this application is available at my web site at http://www.nt-guru.com/windows nt/performance (or in Microsoft BackOffice Administrator's Survival Guide and Internet Information Server for Windows NT Unleashed). You might want to try out this application on your system. On a uniprocessor system, this little code snippet uses most of your available processor cycles, but on a multiprocessor system, the other processors remain available to process other application requests. If you have a multiprocessor system, try this application and add the Processor %Total Processor Time counter for each processor to your chart. One of these processors shows 80 to 98 percent use, whereas the other processors continue to function normally.
To see how a multithreaded, processor-intensive application affects performance on a multiprocessor system, take a look at a multithreaded version of the application. It spawns three threads and equally distributes the load among them, as Figure 7.3 shows. Of course, my system is only a uniprocessor machine, so the load per thread is between 30 and 33 percent. If you have three or more processors, however, three of these processors should show 80 to 90 percent processor use. Notice in this example that the Thread object has been chosen (one for each thread of execution) as the item to display. This is the object counter you use to determine which thread of a process is using more of your processor than you want and is the bottleneck.
Figure 7.3. A multithreaded example of a processor-intensive application displayed with Performance Monitor.
So after you isolate a performance-intensive application, what can you do about it? You can do several things, depending on your resources and the application. This breaks down into two categories.
If you have access to the source code, you can do the following:
If you do not have access to the source code, you can try the following:
If you do nothing else to your system, adding additional memory almost always increases system performance. This is because Windows NT Server uses this memory instead of virtual memory and decreases paging. Memory also needs to be used by the Cache Manager to cache all data accesses. This includes remote (network) or local resource access. The other Microsoft BackOffice components also can benefit from this increased memory. SQL Server, for example, can use some of this memory for its data cache, its procedure cache, and the temporary database.
Just like finding processor bottlenecks, you have to start with the big picture and then narrow down the search to a specific application to find the memory resource hog. A good starting point is to use the performance counters listed in Table 7.2 to see whether you have a problem. If you find a problem, you can use the Process memory-related counters to see which application is the resource hog. This section provides an example so that you can see how this operation works.
Object |
Counter |
Instance |
Description |
|
Memory |
Pages/sec |
N/A |
Number of pages read from or written to disk to resolve memory references to pages that were not in physical memory at the time. |
|
Memory |
Available Bytes |
N/A |
Amount of free virtual memory. |
|
Memory |
Committed Bytes |
N/A |
Amount of memory that has been committed to use by the operating system, as opposed to memory that has been merely reserved for use by the operating system. |
|
Memory |
Page Faults/sec |
N/A |
Number of virtual memory page faults that occurred on the system because the physical page was not in the process's working set or main memory. A page might not need to be read from disk if the page is available on the standby list or is in use by another process that shares the page and has it in its working set. |
|
Memory |
Cache Faults/sec |
N/A |
Number of page faults that occur in the Cache Manager in reference to a memory page that is not in the cache. |
|
Paging File |
% Usage |
Per Page File |
Amount of use of a specific page file. |
|
Paging File |
% Usage Peak |
Per Page File |
Maximum use of a specific page file. |
The first step in isolating the memory bottleneck is to load the Memory.PMW workspace file into the Performance Monitor. This workspace includes basic counters for the chart, alert, and report views. Once more, you want to obtain a baseline for an inactive system, and then one for your normally active system. If you have a memory-intensive process, your chart will look similar to that shown in Figure 7.4. This particular chart is based on a log file (Memory.LOG) that I captured while running the MemHog.EXE program. The same basic object counter activity is displayed in real time for a memory-intensive application as well, however.
Figure 7.4. An example of a system-wide memory shortage displayed with the Performance Monitor.
Note the behavior of these counters as items to watch. The behavior displayed in the chart in Figure 7.4 is an indication of memory-related problems. Specifically, you should note the following behavior:
The example shown in Figure 7.4 illustrates a general system-wide, memory-related problem. But in the real world, you need to find the specific cause of the problem. You can do this by using the Performance Monitor. Instead of looking at system-wide object counters, you want to narrow the search to the Process object counters to find the process that is using your system memory (see Figure 7.5).
Figure 7.5. Using Performance Monitor to isolate a memory-intensive application.
Doesn't this look quite similar to the display shown in Figure 7.4? Notice the same basic peaks for Memory Page Faults/sec as for ProcessPage Faults/sec. If you directly overlay the Memory Page Faults/sec counter with the Process Page Faults/sec counter, however, you will notice that the Memory counter is a bit higher than the Process counter. This is because the Memory counter is a system-wide counter and includes other paging activity from other processes. Table 7.3 lists the corresponding system-to-process counters to help you in your analysis.
Object |
Counter |
Process Counter |
|
Memory |
Page Faults/sec |
Page Faults/sec |
|
Memory |
Available Bytes |
Virtual Bytes |
|
Memory |
Committed Bytes |
Private Bytes |
|
Paging File |
Usage |
Page File Bytes |
|
Paging File |
Usage Peak |
Page File Bytes Peak |
Of course, I knew which process was the problem, so my chart only includes the MemHog application. In order to find a real-world application problem, you should select all the Process instances except for the system processes, unless you are looking for a system process memory leak. A couple of other Process object counters you may find useful in your diagnosis of a memory-intensive application follow:
Finding disk bottlenecks is easier than finding processor or memory bottlenecks because these performance degradations are readily apparent. There are really only four performance counters to monitor for bottlenecks:
When I perform disk diagnostics, I break my Performance Monitor charts into two different settings. I use the first three counters in the preceding list plus the Memory Pages/sec counter from the LogicalDisk object to determine the performance on a drive letter basis. Then I use the same counters from the PhysicalDisk object to determine my hardware disk performance. If you look on my web site at http://www.nt-guru.com/windows nt/performance (or in Microsoft BackOffice Administrator's Survival Guide and Internet Information Server for Windows NT Unleashed)., you will find the LogicalDisk.PMW and PhysicalDisk.PMW Performance Monitor workspace files. These files include basic chart, alert, and report examples for you to use as a starting point.
If you want to see these examples in action, run two copies of the Performance Monitor and load LogicalDisk.PMW into one copy and PhysicalDisk.PMW into the other. Then run the DiskHog.EXE program. This program takes one command-line argument: the drive letter to write its data file tofor example, DiskHog H:. The default if no drive letter is specified is drive C. This program writes up to 1,000 1 MB blocks of data to the file (DumpFile.DAT), which can total almost 1 GB. The purpose of this program is two-fold. First, you can use it to demonstrate disk activity on logical drives, as shown in Figure 7.6, and disk activity on physical drives, as shown in Figure 7.7. Second, you can use it to test your alert conditions for low disk space. When the program finishes writing the data file, it informs you of how much data was written and prompts you to press a key to continue. At this point, it deletes the data file it created.
Figure 7.6. An example of a disk-intensive application displayed with Performance Monitor on logical drives.
Figure 7.7. An example of a disk-intensive application displayed with Performance Monitor on physical drives.
If you find a bottleneck, you can take several actions in addition to those mentioned at the beginning of this section:
Most of the network performance tuning options are provided by the graphical interface tools, such as the Control Panel applets and the hardware alternatives. You might want to try using the Registry Editor and Registry keys, however, which include some other mechanisms for configuring the Windows NT Services. Keep in mind that altering any of the Registry keys may prevent a Windows NT service from automatically tuning itself for maximum performance. I have included another example Performance Monitor workspace file on my web site at http://www.nt-guru.com/windows nt/performance called Network.pmw (also available in Microsoft BackOffice Administrator's Survival Guide and Internet Information Server for Windows NT Unleashed); this includes a chart, alert, and report view to help you in your network diagnostics (see Figure 7.8).
Figure 7.8. Using Performance Monitor to isolate network bottlenecks.
The performance object counters included in the chart and alert views are provided to give you a means to monitor how busy your server is and to determine basic network utilization. Table 7.4 lists the object counters I consider to be important for performing these tasks..
Object |
Counter |
Instance |
Description |
|
Network the Interface |
Current Bandwidth |
Per Interface |
An estimated value of current network use in bits per second. |
|
Network Segment |
Network Utilization |
Per Adapter |
An estimated value of the percentage of the network bandwidth currently in use on the network segment. |
|
Server |
Pool Nonpaged Failures |
N/A |
Number of times that allocations from the nonpaged memory pool has failed. |
|
Server |
Pool Paged Failures |
N/A |
Number of times that allocations from the paged memory pool have failed. |
|
Server |
Work Item Shortages |
N/A |
Number of times that a work item could not be allocated. This counter can indicate that the InitWorkItems and MaxWorkItems parameters for the LanMan Server service need to be increased. |
|
Server |
Logons Total |
N/A |
This number is a total count since the computer was last rebooted of all interactive logons, remote logons, service logons, and failed logons. |
|
Server |
Logons/sec |
N/A |
Rate at which all interactive logons, remote logons, service logons, and failed logons are occurring. |
|
Server Work Queues |
Work |
Per Processor Item Shortages |
Indicates the number of failed work item allocations. A number greater than 1 is an indication that the MaxWorkItem parameter should be increased. |
|
Server Work Queues |
Queue Length |
Per Processor |
Indicates the current number of requests currently waiting in the server queue. A consistent number greater than 4 indicates that a faster processor could improve performance. |
|
Redirector |
Current Commands |
N/A |
Indicates the number of outstanding network requests waiting to be serviced. If this number is greater than the number of network adapters installed in the computer, a network bottleneck is present. Adding an additional network adapter may increase performance. |
|
Redirector |
Network Errors/sec |
N/A |
Indicates that serious network errors have occurred. These errors generally are logged in the system event log, so you should look there for further information. If an error occurs, you should take immediate notice and attempt to resolve the situation. |
Depending on the size and activity of your Internet Information Server installation, you might run into a few performance-related problems. Before you try to configure the IIS services for better performance, however, you should try using the Performance Monitor to look at processor, memory, disk, or network bottlenecks as described in the previous sections. Only after you have done the best you can to solve those problems should you move on to optimizing your IIS services. The good news is that you can use several IIS counters to determine just how heavy a load your IIS server is carrying, as well as counters to scrutinize each service.
You should start your performance tuning with the general IIS counters, as described in Table 7.5, to get a basic look at how well your IIS server is performing. To determine how well a specific service is performing, you can use the counters in Table 7.6 for your WWW Publishing Service, Table 7.7 for your FTP Publishing Service, and Table 7.8 for your Gopher Publishing Service. You should pay particular attention to the global cache counters mentioned in Table 7.5, because the size of this cache may be changed by modifying the Registry key
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\MemoryCacheSize
The default is to allocate 3 MB (3145728 bytes), and the legal values range from 0 (which disables caching entirely) to FFFFFFFF (or 4 GB). If you are encountering large number of cache flushes, misses, or have a poor hit ratio, increasing this value may improve performance. You should be careful, however, to make sure that you only use physical memory that is not required by the base operating system or SQL Server. Otherwise, you might impact these systems and cause poor IIS performance.
Object |
Counter |
Description |
|
Internet Information Services Global |
Cache Flushes |
Specifies how often a cached memory region expired due to changes in IIS files or a directory tree. |
|
Internet Information Services Global |
Cache Hits |
Specifies how often a reference to a file, directory tree, or IIS specific object was found in the cache. |
|
Internet Information Services Global |
Cache Hits % |
Specifies the hit ratio of all cache requests. |
|
Internet Information Services Global |
Cache Misses |
Specifies how often a reference to a file, directory tree, or IIS specific object was not found in the cache. |
|
Internet Information Services Global |
Cache Size |
Specifies the size of the shared memory cache. |
|
Internet Information Services Global |
Cache Used |
Specifies the total number of bytes in use (file handles, IIS specific objects, and so on) in the cache. |
|
Internet Information Services Global |
Cached File Handles |
Total number of file handles contained within the cache. |
|
Internet Information Services Global |
Current Blocked Async I/O Requests |
Total number of current current asynchronous I/O requests blocked by the bandwidth throttle. |
|
Internet Information Services Global |
Directory Listings |
Specifies the total number of directory listings contained within the cache. |
|
Internet Information Services Global |
Measured Asnyc I/O Bandwidth usage |
Specifies the total amount of asynchronous I/O bandwidth average over a minute. |
|
Internet Information Services Global |
Objects |
Specifies the total number of objects (file handle objects, directory listing objects, and so on) contained within the cache. |
|
Internet Information Services Global |
Total Allowed Async I/O Requests |
Total number of asynchronous I/O requests admissible by the bandwidth throttle. |
|
Internet Information Services Global |
Total Blocked Async I/O Requests |
Total number of asynchronous I/O requests blocked by the bandwidth throttle. |
|
Internet Information Services Global |
Total Rejected Async I/O Requests |
Total number of asynchronous I/O requests rejected by the bandwidth throttle. |
Object |
Counter |
Description |
|
HTTP Service |
Bytes Received/sec |
Specifies the rate (in bytes/sec) at which the HTTP server is receiving data. |
|
HTTP Service |
Bytes Sent/sec |
Specifies the rate (in bytes/sec) at which the HTTP server is transmitting data. |
|
HTTP Service |
Bytes Total/sec |
Specifies the total amount of data being transmitted or received by the HTTP server in bytes per second. |
|
HTTP Service |
CGI Requests |
Specifies the number of common gateway interface requests received by the HTTP server. |
|
HTTP Service |
Connection Attempts |
Specifies the total number of attempts made to connect to the HTTP server. |
|
HTTP Service |
Connections/sec |
Specifies the number of connections to the HTTP server per second. |
|
HTTP Service |
Current Anonymous Users |
Specifies how many anonymous users currently are connected to the HTTP server. |
|
HTTP Service |
Current CGI Requests |
Specifies how many CGI requests currently are being processed by the HTTP server. |
|
HTTP Service |
Current Connections |
Specifies the current number of connections to the HTTP server. |
|
HTTP Service |
Current ISAPI Extension Requests |
Specifies the current number of ISAPI requests being processed by the server. |
|
HTTP Service |
Current NonAnonymous Users |
Specifies the total number of users currently connected to the HTTP server using a domain user account. |
|
HTTP Service |
File Received |
Specifies the total number of files received by the HTTP server. |
|
HTTP Service |
File Sent |
Specifies the total number of files transmitted by the HTTP server. |
|
HTTP Service |
File Total |
Specifies the sum of the total number of files transmitted and received. |
|
HTTP Service |
Get Requests |
Specifies the total number of HTTP requests using the GET method. |
|
HTTP Service |
Head Requests |
Specifies the total number of HTTP requests using the HEAD method. |
|
HTTP Service |
ISAPI Extension Requests |
Specifies the total number of ISAPI requests being processed by the server. |
|
HTTP Service |
Logon Requests |
Specifies the total number of logon attempts that have been made by the HTTP server. |
|
HTTP Service |
Maximum Number of Anonymous Users |
Specifies the maximum number of simultaneous connected anonymous users. |
|
HTTP Service |
Maximum CGI Requests |
Specifies the maximum number of simultaneous CGI requests processed by the HTTP server. |
|
HTTP Service |
Maximum Connection |
Specifies the maximum number of simultaneous connections to the HTTP server. |
|
HTTP Service |
Maximum ISAPI Extension Requests |
Specifies the maximum number of simultaneous ISAPI requests processed by the HTTP server. |
|
HTTP Service |
Maximum NonAnonymous Users |
Specifies the maximum number of simultaneous connected users using a domain user account. |
|
HTTP Service |
Not Found Errors |
Specifies the total number of requests that failed due to a missing document. |
|
HTTP Service |
Other Requested Methods |
Specifies the total number of HTTP requests that do not use the GET, HEAD, or POST method. This can include PUT, DELETE, LINK, or other methods. |
|
HTTP Service |
Post Requests |
Specifies the total number of HTTP requests using the POST method. |
|
HTTP Service |
Total Anonymous Users |
Specifies the total number of anonymous users that have ever connected to the HTTP server. |
|
HTTP Service |
Total NonAnonymous Users |
Specifies the total number of users that have ever connected to the HTTP server using a domain user account. |
Object |
Counter |
Description |
|
FTP Server |
Bytes Received/sec |
Specifies the rate (in bytes/sec) at which the FTP server is receiving data. |
|
FTP Server |
Bytes Sent/sec |
Specifies the rate (in bytes/sec) at which the FTP server is transmitting data. |
|
FTP Server |
Bytes Total/sec |
Specifies the total amount of data being transmitted or received by the FTP server in bytes per second. |
|
FTP Server |
Current Anonymous Users |
Specifies how many anonymous users currently are connected to the FTP server. |
|
FTP Server |
Current Connections |
Specifies the current number of connections to the FTP server. |
|
FTP Server |
Current NonAnonymous Users |
Specifies the total number of users currently connected to the FTP server using a domain user account. |
|
FTP Server |
File Received |
Specifies the total number of files received by the FTP server. |
|
FTP Server |
File Sent |
Specifies the total number of files transmitted by the FTP server. |
|
FTP Server |
File Total |
Specifies the sum of the total number of files transmitted and received. |
|
FTP Server |
Logon Requests |
Specifies the total number of logon attempts that have been made by the FTP server. |
|
FTP Server |
Maximum Anonymous Users |
Specifies the maximum number of simultaneous connected anonymous users. |
|
FTP Server |
Maximum Connections |
Specifies the maximum number of simultaneous connections to the FTP server. |
|
FTP Server |
Maximum NonAnonymous Users |
Specifies the maximum number of simultaneous connected users using a domain user account. |
|
FTP Server |
Total Anonymous Users |
Specifies the total number of anonymous users that have ever connected to the FTP server. |
|
FTP Server |
Total NonAnonymous Users |
Specifies the total number of users that have ever connected to the FTP server using a domain user account. |
Object |
Counter |
Description |
|
Gopher Service |
Aborted Connections |
Specifies the total number of connections that failed due to errors or over limit requests made to the Gopher server. |
|
Gopher Service |
Bytes Received/sec |
Specifies the rate (in bytes/sec) at which the Gopher server is receiving data. |
|
Gopher Service |
Bytes Sent/sec |
Specifies the rate (in bytes/sec) at which the Gopher server is transmitting data. |
|
Gopher Service |
Bytes Total/sec |
Specifies the total amount of data being transmitted or received by the Gopher server in bytes per second. |
|
Gopher Service |
Connection Attempts |
Specifies the total number of attempts made to connect to the Gopher server. |
|
Gopher Service |
Connections in Error |
Specifies the number of errors that occurred while being processed by the Gopher server. |
|
Gopher Service |
Current Anonymous Users |
Specifies how many anonymous users currently are connected to the Gopher server. |
|
Gopher Service |
Current Connections |
Specifies the current number of connections to the Gopher server. |
|
Gopher Service |
Current NonAnonymous Users |
Specifies the total number of users currently connected to the Gopher server using a domain user account. |
|
Gopher Service |
Directory Listing Sent |
Specifies the total number of directory listings transmitted by the Gopher server. |
|
Gopher Service |
File Sent |
Specifies the total number of files transmitted by the Gopher server. |
|
Gopher Service |
File Total |
Specifies the sum of the total number of files transmitted and received. |
|
Gopher Service |
Gopher Plus Requests |
Specifies the total number of Gopher Plus requests received by the Gopher server. |
|
Gopher Service |
Logon Requests |
Specifies the total number of logon attempts that have been made by the Gopher server. |
|
Gopher Service |
Maximum Anonymous Users |
Specifies the maximum number of simultaneous connected anonymous users. |
|
Gopher Service |
Maximum NonAnonymous Users |
Specifies the maximum number of simultaneous connected users using a domain user account. |
|
Gopher Service |
Maximum Connections |
Specifies the maximum number of simultaneous connected users to the Gopher server. |
|
Gopher Service |
Searches Sent |
Specifies the total number of searches performed by the Gopher server. |
|
Gopher Service |
Total Anonymous Users |
Specifies the total number of anonymous users that have ever connected to the Gopher server. |
|
Gopher Service |
Total NonAnonymous Users |
Specifies the total number of users that have ever connected to the Gopher server using a domain user account. |
In this chapter, you looked at how to optimize your server using example performance monitor charts, alerts, reports, and workspace files. These files were used with sample programs to illustrate how to find processor, memory, disk, and network bottlenecks. You also looked at the performance counters you can use to determine how well your IIS server is performing.
In the next chapter, you will begin to use your new IIS to its fullest extentby publishing on the World Wide Web with Microsoft Office and Microsoft FrontPage.