Using HTTP Compression for Faster Downloads

Applies To: Windows Server 2003, Windows Server 2003 with SP1

If your Web sites use large amounts of bandwidth or if you want to use bandwidth more effectively, consider enabling HTTP compression, which provides faster transmission times between IIS and compression-enabled browsers regardless of whether your content is served from local storage or a UNC resource. If your network bandwidth is restricted, HTTP compression can be beneficial unless your processor usage is already very high.

IIS provides the following compression options:

  • Static files only.

  • Dynamic application responses only.

  • Both static files and dynamic application responses.

Dynamic processing can affect CPU resources because IIS does not cache compressed versions of dynamic output. If compression is enabled for dynamic responses and IIS receives a request for a file that contains dynamic content, the response that IIS sends is compressed every time it is requested. Because dynamic compression consumes considerable CPU time and memory resources, use it only on servers that have slow network connections but CPU time to spare.

Compressed static responses can be cached and therefore do not affect CPU resources like dynamic responses do.

How HTTP Compression Works

When IIS receives a request, it checks whether the browser that sent the request is compression-enabled. (Recent versions of Microsoft® Internet Explorer and most other browsers typically send the following header if they are compression-enabled: Accept-Encoding: gzip, deflate.) IIS then determines whether the request is for a static file or for dynamic content.

If the content of the file is static, IIS checks whether the file has previously been requested and is already stored in a compressed format in the temporary compression directory. If a compressed version of the requested file is not found, IIS sends an uncompressed version of the requested file to the client browser while a background thread compresses the requested file. The newly compressed file is then stored in the compression directory, and subsequent requests for that file are serviced directly from the compression directory. In other words, an uncompressed version of the file is returned to the client unless a compressed version of the file already exists in the compression directory.

If the file contains dynamic content, IIS compresses the response as it is generated and sends the compressed response to the browser. No copy of the file is cached by the Web server.

The performance cost of compressing a static file is modest and is typically incurred only once, because the file is then stored in the temporary compression directory. The cost of compressing dynamically generated files is somewhat higher because the files are not cached and must be regenerated with each request. The cost of expanding the file at the browser is minimal. Compressed files download faster, which makes them particularly beneficial to the performance of any browser that uses a network connection with restricted bandwidth (a modem connection, for example).

When you enable HTTP compression, compressed files are given a default expiration date of Jan. 1, 1997. This expiration date prevents proxy servers from serving cached copies of compressed files to browsers that are not compression-enabled. This expiration date also forces browsers to return to the server for a fresh copy of the file when the user makes a new request instead of displaying a cached copy of the file. When you enable HTTP compression, the default settings for the HcExpiresHeader, HcCacheControlHeader, and HcSendCacheHeaders metabase properties ensure that older clients and proxy servers do not attempt to cache compressed files. Before you change these settings, see Metabase Property Reference for information about these and related metabase properties.

Determining Whether HTTP Compression Will Improve Performance

If your server generates a large volume of dynamic content, consider whether the additional processing cost of HTTP compression is one that you can reasonably afford. If the % Processor Time counter is already 80 percent or higher, enabling HTTP compression is not recommended.

To evaluate how much of your processor is typically being used, follow these steps:

  1. Establish a baseline for your processor usage by using System Monitor to log the following counters over several days. If you use Performance Logs and Alerts, you can log the data to a database and then query the data, examining the results in detail.

    • Processor\% Processor Time. This counter has a total instance and a separate instance for each processor in the system. If your server has more than one processor, you need to watch the individual processors as well as the total to discover any imbalance in the workload.

    • Network Interface\Bytes Sent/sec. Counters for the Network Interface performance object display the rate at which bytes are transmitted over a TCP/IP connection by monitoring the counters on the network adapter. For information about additional counters to monitor for this object, see Table 6.8.

  2. Enable compression, and continue to log the values for these counters for an extended period — preferably for several days — so you have a good basis for comparison.

    Collect a broad sample to determine how compression affects various aspects of performance. Conduct the following tests:

    • Enable static compression only, dynamic compressions only, and both.

    • Change the list of files that you use for compression testing for both static and dynamic content.

    • Vary the compression level. Try this on all content types.

  3. Compare the data from monitoring with and without compression, and with different types of compression, different compression levels, and different files.

Important

If you see signs of blocking or bottlenecking during the preceding testing, promptly stop the test. A significant drop in the value of either counter indicates that performance with compression enabled has decreased relative to performance without compression enabled.

Choosing Compression Options

When you configure HTTP compression by using IIS Manager, IIS 6.0 automatically applies the default settings shown in Table 6.12. You can configure custom settings for each compression option by editing the metabase or alternatively — in the case of the compression directory — by using IIS Manager.

Table 6.12 Default Settings When HTTP Compression Is Enabled

Compression Options File Type Default Configuration Configuration Method

File types compressed

Static

.txt, .htm, and .html

Metabase

 

Dynamic

.exe, .dll, and .asp

Metabase

Compression schemes

Static

Both gzip and deflate

Metabase

 

Dynamic

Both gzip and deflate

Metabase

Compression level

Static

10

Metabase

 

Dynamic

0

Metabase

Compression directory

Static

Size: 95 MB

Location1: %Windir%\IIS Temporary Compressed Files

Metabase or IIS Manager

 

Dynamic

No directory2

N.A.

1 The compression directory must reside on an NTFS file system volume.

2 When dynamic files are compressed, they are not cached.

If the default HTTP compression configuration does not meet the needs of your organization, you can make the following changes to the configuration:

  • Specify additional file types to compress. Edit the HcFileExtensions metabase property (for static files) and the HcScriptFileExtensions metabase property (for dynamic files) to apply compression to additional file types. Add only compressible files types to your compression scheme because trying to compress an already compressed file — such as .jpg, .mp3, or .zip files — wastes processing time.

  • Enable or disable the gzip or deflate compression scheme. When you use IIS Manager to enable compression, IIS enables both compression schemes (gzip and deflate), so that IIS can apply whichever compression scheme the client requests. You can edit the metabase to specify that only a particular compression scheme is used. If you disable the only compression scheme that a client supports, the server replies with an uncompressed file.

    Note

    Disabling either the gzip or deflate compression schemes can have unintended consequences, such as not compressing responses to a particular browser. For maximum compatibility, it is recommended that you leave both compression schemes enabled.

  • Change the level of compression for static or dynamic files. Compression levels range from 0 through 10. Higher compression levels produce smaller compressed files but use more CPU and memory. Lower compression levels produce slightly larger compressed files, but with less impact on CPU and memory usage. To configure a compression level other than 10 for static files and other than zero for dynamic files, edit the HcOnDemandCompLevel and HcDynamicCompressionLevel metabase properties.

    For dynamic compression, increasing the compression level can significantly increase CPU usage. The default compression level of zero uses the least amount of CPU resources and can increase performance if network bandwidth is adequate. Raise the dynamic compression level above zero only if you need more network bandwidth and have sufficient CPU capacity to handle the extra load.

  • Change the location or size of the compression directory. To change the location and size of the compression directory for static files, edit the HcCompressionDirectory, HcDoDiskSpaceLimiting, and HcMaxDiskSpaceUsage metabase properties.

Compression Strategies

When the CPU of your server is not heavily loaded, the simplest compression strategy is to enable static and dynamic compression for all of the sites and site elements (directories and files) on the server. This is known as global HTTP compression. However, when the CPU load of your server is high, you might not want to enable compression for all of the sites and site elements on the server.

Depending on CPU usage, there are two strategies for fine tuning which sites and site elements are compressed:

  • Enable compression globally, and then disable compression selectively for specific sites or site elements.

  • Leave global compression disabled, and then enable compression selectively for specific sites or site elements.

Enabling Global HTTP Compression

When you enable HTTP compression by using IIS Manager, IIS applies compression according to the default settings shown in Table 6.12. With the exception of the location and size of the compression directory, you cannot change the default settings by using IIS Manager. Instead, you must edit the metabase to change the default settings.

Important

After enabling HTTP compression (either by using IIS Manager or by editing the metabase), you must restart IIS for the change to take effect. For more information about enabling global HTTP compression by using IIS Manager and through Adsutil.vbs, see Enabling HTTP Compression.

Configuring HTTP Compression for Individual Sites and Site Elements

All of the compression configurations discussed so far are located under W3SVC/Filters/Compression in the metabase and are used to apply global HTTP compression, which is applied by using IIS Manager or by using one of the metabase properties that are used for global compression (beginning with Hc). IIS 6.0 offers two new metabase properties, DoStaticCompression and DoDynamicCompression(beginning with Do), which can be used to enable or disable compression at the individual site and site element levels. Use these two new properties to apply compression to individual namespaces. Hence, you can enable global compression by using IIS Manager or the Hc global properties and then disable one of the Do properties (or vice versa) to obtain compression at a specific location in the IIS metabase.

For more information about enabling compression for individual Sites and Site elements, see Enabling HTTP Compression.

Specifying File Types and Compression Schemes by Editing the Metabase

After enabling HTTP compression, you can use the Adsutil.vbs command-line utility (located in the systemroot\Inetpub\AdminScripts folder) to edit the metabase, specifying which static or dynamic file types to compress and which compression scheme to apply.

Using Adsutil.vbs, you can customize HTTP compression in the following ways:

  • Apply the gzip or deflate compression scheme, or both. To apply both schemes, you must execute a separate set command for each compression scheme.

  • Customize the file types to which both static and dynamic compression are applied. You must execute a separate set command for each compression type. If you use IIS Manager to enable compression and you then use Adsutil.vbs to specify specific static or dynamic file types, you replace any default values that were applied by IIS Manager.

Note

For compression to be performed, the HcDoStaticCompression metabase property must be set to true (for static compression) and the HcDoDynamicCompression metabase property must be set to true (for dynamic compression). You can set these by using IIS Manager or Adsutil.vbs. For instructions, see the procedures in the preceding section.

The following syntax enables compression at the W3SVC level (which means it is applied to all Web sites and virtual directories on the Web server):

cscript.exe adsutil.vbs set W3svc/Filters/Compression/{GZIP|DEFLATE}/
{HcFileExtensions "StaticFileType" ...}|{HcScriptFileExtensions "DynamicFileType" ...}

You must restart the WWW service before any changes take effect. For information about restarting a service, see Common IIS 6.0 Administrative Tasks. Table 6.13describes the parameters for customizing file types and compression schemes.

Table 6.13 Parameters for Setting Compression Schemes and File Types for HTTP Compression

Parameter Description
GZIP|DEFLATE
        </code></pre></td>

Specifies which compression scheme (either gzip or deflate) to apply to the specified file types. To enable both compression schemes, you must run this command once for each compression scheme. For maximum compatibility, leave both compression schemes enabled.

HcFileExtensions
"StaticFileType" ... 

Specifies which static file types to apply the compression scheme to — for example, .txt, .js, .css, .doc, or .xls files. To specify a file type, enclose the file name extension (without the leading period) in quotation marks. Separate multiple file types with a space. This parameter cannot be executed together with the HcScriptFileExtensions "DynamicFileType" parameter.

HcScriptFileExtensions
"DynamicFileType" ...

Specifies which dynamic file types to apply the compression scheme to — for example, .exe, .dll, or .asp files. To specify a file type, enclose the file name extension (without the leading period) in quotation marks. Separate multiple file types with a space. This parameter cannot be executed together with theHcFileExtensions "StaticFileType" parameter.

Important   Setting the HcScriptFileExtensions parameter to an empty string can adversely affect your servers performance. If this parameter is empty, all dynamic responses are sent compressed. In addition, any static file type not specified in HcFileExtensions is dynamically compressed and therefore not cached.

For example, the following command uses a deflate compression scheme to apply static compression at the W3SVC level to text files (.txt) and cascading style sheets (.css):

cscript.exe adsutil.vbs set w3svc/Filters/Compression/DEFLATE/HcFileExtensions "txt" "css"

Specifying the Location and Size of the Compression Directory for Static Compression

Three metabase properties enable you to change the location of the default directory for static compression and to limit its size.

Changing the location of the compression directory

The HcCompressionDirectory metabase property specifies the folder where compressed versions of static files are temporarily cached. By default, the compression directory is at %Windir%\IIS Temporary Compressed Files.

Due to a number of differences between NTFS and FAT volumes — such as differences in time stamping and access control mechanisms, and the efficiency with which NTFS handles directories that contain large numbers of files — the compression directory must reside on an uncompressed and unshared NTFS volume. In addition, the access control lists (ACLs) for the folder must include Full Control access to the identity of the application pool or to the IIS_WPG group. If a requested file resides on an NTFS volume and the compression directory is on a FAT volume, IIS does not perform HTTP compression on that file.

Setting a size limit for the compression directory

In addition, you can configure the HcDoDiskSpaceLimiting and HcMaxDiskSpaceUsage metabase properties to limit the amount of disk space that all files in the compression directory can occupy. HcDoDiskSpaceLimiting enables disk space limiting. If it is set to true, IIS limits compressed files to no more than the number of bytes specified by HcMaxDiskSpaceUsage. After the limit is reached, compressed files are removed from the compression directory on a least recently used basis. If HcDoDiskSpaceLimiting is set to false, no disk space limit is enforced for the compression directory.

HcDoDiskSpaceLimiting is relevant only if you have set the property HcDoOnDemandCompression to true. For more information about these metabase properties, see Metabase Property Reference.

Important

Limiting the use of disk space has a significant impact on performance because additional overhead is required to check for the limit. Use this feature only when you lack adequate disk space to cache all content files on your Web server.

Disabling HTTP Compression for Requests That Come Through Certain Proxy Servers

Certain HTTP proxy servers, including some advertised as HTTP 1.1–compliant, do not handle the caching of compressed objects correctly. The HcNoCompressionForProxies metabase property allows you to disable the HTTP 1.1 response for compression requests that come through proxy servers.

In addition, you can use the HcNoCompressionForHttp10 metabase property to disable compression for requests that contain an HTTP 1.0 version number. HTTP 1.0, as described in RFC 1945, Hypertext Transfer Protocol — HTTP/1.0, provides a minimal level of support for certain types of compression. However, some confusion exists concerning HTTP 1.0 compression, especially with regard to proxy servers. To minimize the chance of inappropriately returning a compressed file to a client that cannot decompress it, you can use the HcNoCompressionForHttp10 metabase property to disable compression in questionable scenarios.

For more information about the many metabase properties that you can set when configuring HTTP 1.1 compression, including a complete list of all the properties you can set, see IIsCompressionSchemes (ADSI) in the IIS 6.0 SDK.