| Preface | p. xi |
| Preliminary Considerations | |
| The Quick and the Dead | p. 3 |
| Questions for the Browser Side | p. 3 |
| Questions for the Server Side | p. 11 |
| Key Recommendations | p. 18 |
| Web Site Architecture | p. 19 |
| Trade-offs | p. 19 |
| Elements | p. 24 |
| Example Web Site Architectures | p. 28 |
| Trends | p. 31 |
| Sample Configurations | p. 32 |
| Key Recommendations | p. 34 |
| Capacity Planning | p. 35 |
| Do the Math | p. 35 |
| ... But Trust Your Eyes More than the Math | p. 36 |
| Questions to Ask | p. 37 |
| How Much Bandwidth Do You Need? | p. 45 |
| How Fast a Server Do You Need? | p. 48 |
| How Much Memory Do You Need? | p. 50 |
| Key Recommendations | p. 52 |
| Performance Monitoring | p. 53 |
| Parameters of Performance | p. 53 |
| Latency and Throughput | p. 53 |
| Utilization | p. 59 |
| Efficiency | p. 59 |
| Monitoring Web Performance Using Perl | p. 63 |
| Automatically Generating Monitoring Scripts Using Sprocket | p. 69 |
| Using a Relational Database to Store and Retrieve Your Monitoring Data | p. 75 |
| Monitoring Machine Utilization with rstat | p. 76 |
| Monitoring Per-Process Statistics | p. 84 |
| Generating Graphs from ps Data | p. 87 |
| Monitoring Other Things | p. 90 |
| Making a System Dashboard Web Page | p. 96 |
| Key Recommendations | p. 99 |
| Load Testing | p. 100 |
| Load Test Preparation | p. 100 |
| Trade-offs with Load Testing Tools | p. 102 |
| Writing Your Own Load Testing Tools | p. 102 |
| Benchmark Specifications and Benchmark Tests | p. 110 |
| Other Resources | p. 114 |
| Key Recommendations | p. 115 |
| Performance Analysis | p. 116 |
| Using analysis.cgi to Find a Bottleneck | p. 116 |
| Snooping HTTP with Sprocket | p. 118 |
| Look at Connections | p. 120 |
| Log File Analysis | p. 120 |
| Hits per Second | p. 125 |
| A Few More Tips | p. 131 |
| Key Recommendations | p. 132 |
| Reliability | p. 133 |
| Typical Failures | p. 133 |
| Dependencies | p. 141 |
| Smoothing Outages | p. 142 |
| Key Recommendations | p. 142 |
| Security | p. 143 |
| HTTPS and SSL | p. 143 |
| Firewalls | p. 146 |
| Bastion Hosts | p. 147 |
| Chroot | p. 147 |
| Key Recomendation | p. 147 |
| Case Studies | p. 148 |
| Database Table Growing Without Limit | p. 148 |
| Reverse DNS Lookups Slows Logging | p. 148 |
| Kinked Cable | p. 151 |
| Database Connection Pool Growth Limits Performance | p. 153 |
| Key Recommendation | p. 155 |
| Principles and Patterns | p. 156 |
| Principles of Performance Tuning | p. 156 |
| Patterns of Performance Improvement | p. 165 |
| Key Recommendations | p. 167 |
| Tuning in Depth | |
| Browsers | p. 171 |
| How Browsers Work | p. 171 |
| Types of Browsers | p. 175 |
| The Perfect Browser | p. 179 |
| Browser Speed | p. 179 |
| Browser Tuning Tips | p. 180 |
| Non-Browser Web Clients | p. 185 |
| Key Recommendations | p. 187 |
| Client Operating System | p. 188 |
| Microsoft Windows | p. 188 |
| Macintosh | p. 191 |
| Unix | p. 193 |
| Key Recommendations | p. 194 |
| Client Hardware | p. 195 |
| CPU | p. 195 |
| RAM | p. 197 |
| Cache | p. 198 |
| Bus | p. 198 |
| Disk | p. 199 |
| Video | p. 200 |
| BIOS | p. 202 |
| Key Recommendations | p. 204 |
| Lines and Terminators | p. 205 |
| Forwarding and Latency | p. 205 |
| Your Modem, the Information Driveway | p. 206 |
| ISDN | p. 211 |
| Cable Modems | p. 212 |
| xDSL | p. 213 |
| Higher Capacity Lines | p. 213 |
| Intranets | p. 215 |
| Network Modeling Tools | p. 223 |
| The Internet | p. 223 |
| PTTs | p. 231 |
| Key Recommendations | p. 232 |
| Network Protocols | p. 233 |
| Power and Protocols | p. 233 |
| Factors Affecting Network Protocol Performance | p. 235 |
| The Protocols of the Web | p. 236 |
| Key Recommendations | p. 263 |
| Server Hardware | p. 264 |
| Box on a Wire | p. 264 |
| Good I/O | p. 265 |
| Multiple Busses | p. 265 |
| Fast Disks | p. 265 |
| Lots of Memory | p. 265 |
| Scalability | p. 266 |
| Network Interface Card | p. 266 |
| Bus | p. 267 |
| Memory | p. 268 |
| RAM Characteristics | p. 268 |
| CPU | p. 269 |
| Symmetric Multiprocessing (SMP) | p. 272 |
| Disk Activity and PID | p. 290 |
| Key Recommendations | p. 290 |
| Server Operating System | p. 291 |
| Unix and the Origin of the Web | p. 291 |
| Unix Flavors | p. 292 |
| System Calls Versus Library Calls | p. 295 |
| Processes and the Kernel | p. 295 |
| The Filesystem | p. 304 |
| The Windowing System | p. 311 |
| Versions and Patches | p. 312 |
| Configurable OS Parameters | p. 312 |
| Unix OS Monitoring Tools | p. 316 |
| System Call Tracers | p. 320 |
| Network Snooping Tools | p. 321 |
| How Many Connections Can My Server Handle? | p. 323 |
| How Many Processes Can My Server Handle? | p. 324 |
| How Quickly Can My Server Fork New Processes? | p. 325 |
| Unix Versus NT as the Web Server OS | p. 326 |
| The Exokernel | p. 328 |
| Key Recommendations | p. 328 |
| Server Software | p. 329 |
| The Evolution of Web Servers | p. 329 |
| System Calls Made by a Web Server | p. 331 |
| How Servers Fail | p. 333 |
| Configuring Apache and Netscape Web Servers | p. 334 |
| Other Servers | p. 343 |
| Missing Features | p. 345 |
| Proxy Servers | p. 345 |
| Hierarchical Caches | p. 346 |
| Key Recommendations | p. 346 |
| Content | p. 347 |
| Size Matters | p. 347 |
| As Good As It Gets | p. 348 |
| Caching and Differences | p. 348 |
| HTML and Compression | p. 348 |
| Performance Tips for HTML Authors | p. 350 |
| The Document Object Model | p. 354 |
| Graphics | p. 354 |
| Audio | p. 356 |
| Video | p. 357 |
| Key Recommendations | p. 358 |
| Custom Applications | p. 359 |
| Programmers | p. 359 |
| CGI Programs | p. 359 |
| CGI Internals and Performance Problems | p. 360 |
| General CGI Tips | p. 361 |
| CGI Language-Specific Optimization Tips | p. 371 |
| Daemonize It | p. 375 |
| CGI Database Access Performance | p. 376 |
| Logging | p. 376 |
| NSAPI and ISAPI | p. 377 |
| DOM | p. 377 |
| JSP, ASP, PHP | p. 377 |
| Key Recommendations | p. 377 |
| Java | p. 378 |
| Java Will Never Be Good Enough for GUI Applications | p. 378 |
| Java Is Good Enough for the Server Side | p. 378 |
| Performance Problems Intrinsic to Java | p. 379 |
| Coding Tips | p. 383 |
| Compilers | p. 395 |
| Profile Your Code | p. 396 |
| Decompilers | p. 397 |
| OS-Level Profiling Tools | p. 397 |
| JITs | p. 397 |
| Static Compilers | p. 398 |
| Virtual Machines | p. 399 |
| Runtime Options | p. 400 |
| Java Chips | p. 402 |
| Java Benchmarks | p. 402 |
| Web Sites with Java Performance Info | p. 403 |
| Key Recommendations | p. 403 |
| Databases | p. 404 |
| Do You Really Need a Relational Database? | p. 405 |
| Performance Tips | p. 406 |
| How Many Connections Can Your Database Handle? | p. 409 |
| When the Database Is Overloaded | p. 410 |
| Analysis | p. 411 |
| Key Recommendations | p. 411 |
| Web Performance Product Lists and Reviews | p. 412 |
| Index | p. 425 |
| Table of Contents provided by Syndetics. All Rights Reserved. |