你會如何優化應用程序的性能?

openkk 13年前發布 | 9K 次閱讀 性能優化

StackExchange 是構建在 ASP.NET 和 SQL Server 基礎之上的項目。最近, Sam SaffronMarc Gravell 分別撰寫了博客,其中講述了他們發現和解決性能問題的經驗,在該過程中最終追蹤到了 .NET GC GEN-2對象。大家可以從他們的博文中吸取很多關于優化生產環境中應用程序性能的經驗。

問題是由自定義標簽引擎引起的,它會在內存中存放大型對象列表。這兩篇博文都值得一讀,而 Sam 的文章則更詳細地講述了如何診斷問題。其中主要的應對方法包括:

  • 使用分析器。你可以使用類似于 MVC-MiniProfiler 的工具來分析方法調用,使用類似于.NET Memory Profiler 或者 Redgate ANTS Memory profiler 之類的內存分析器來跟蹤內存使用情況。
  • 如果可以的話,要擁有可查詢的日志——StackExchange 團隊有后臺執行的進程,它會解析原始的日志,并把它插入到大型的、專門的 SQL Server 實例中。如果無法查詢日志,那么你就無法繪制出統計圖并查看趨勢或者模式。
  • 理解 GC 是如何工作的——.NET 中的垃圾回收器支持三代對象(GEN 0 到 GEN 2),而存放時間最長的數據會使用 GEN-2。GEN-2的掃描頻率最低,執行的成本最高,甚至可能會堵塞其它線程。Sam 建議閱讀 Rico 的《Garbage Collector Basics and Performance Hints》一文以獲得更多細節。

最后,團隊采取了多項優化措施,包括針對應用程序的特定部分,從對象數組切換到索引數組,從類切換到結構體等。第一項措施是一種很常用的模式,這樣數組就只針對主要的不可變列表的索引;而第二項并不常用,Sam 建議只在有超過50萬個對象以上才使用它,這樣在達到第二代垃圾回收器標準的時候就會很快釋放內存。

StackExchange 團隊對性能問題非常關注——比方說,你可以看到 StackOverflow 在三個不同的等級上使用 caching,從而提升反應時間,減少服務器的負載。

在 InfoQ 上和 MSDN 上都有很多關于性能和可伸縮性的資源可供參考,包括這篇 Rob Howard 撰寫的文章。最后,引用 Sam 的話:“做很少的工作總是要比做更多工作消耗的資源少。”

你在擴展 ASP.NET 應用程序的時候,也有發現和解決瓶頸問題的類似經驗和大家分享嗎?

查看英文原文:How Do You Tune Your Application For Performance?

      來自: InfoQ

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!