1) The freely downloadable Patterns & Practices guide Improving .NET Application Performance and Scalability has exhaustive info and is a kind of .NET bible. The guide is still relevant eventhough it has not been updated since it was first published in 2004.
2) Key points from the MSDN magazine article "Scaling Strategies for ASP.NET Applications":
- Specialize- break your application into smaller pieces in order to isolate the problem. Know where your slowest bits are
- Optimize the code before throwing more hardware at it. Test to measure improvements
- Implement load balancing - add servers, duplicate the application across them
- Eliminate affinity for effective distribution
- Minimize Payload by 1) turning on compression 2) reducing ViewState 3) using AJAX (discriminately) to make initial render times faster and reduce perceived size of the payload by spreading it out over time
- Implement caching - ASP.NET supports three forms of caching: page caching (also known as output caching), partial-page caching, and programmatic (also known as data) caching.
- Partition databases into readers and writers. The reader databases are read-only; they receive their data from the writer databases via replication. All data queries go to the reader databases, which are optimized for reading data as fast as possible. All data write requests are sent to the writer databases, which are partitioned and tuned to write efficiently.
Scaling up and scaling out are both viable solutions, depending on what problem you're trying to solve, and what resources (financial, software, and otherwise) you have at hand.
...scaling out is only frictionless when you use open source software. Otherwise, you're in a bit of a conundrum: scaling up means paying less for licenses and a lot more for hardware, while scaling out means paying less for the hardware, and a whole lot more for licenses.
Also see:
Approaching ASP.NET Application Performance and Scalability Improvement
SQL Server Performance Audit Checklist