開發高性能ASP.NET應用

本文是“.NET Conf China 2022”上我的一個分享,這里更細化的分享出來。

分享分為四個部分:

  1. 制定指示

  2. 設計應用

  3. 正確測試

  4. 性能優化

高性能:不一定是架構出來的,但一定是優化出來的。

  • 制定指標-收集

    首先把項目中的熱路徑API和核心API找出來,然后分析每個API是CPU密集型的,還是內存密集型的,以供在后面測試參考或對API的判斷。

  • 制定指標-制定

    TPS=并發線程*1000/ART,這是TPS和平均響應時間的公式。這里的表格相對完整,作為開發的性能測試,有時也可以只要求響應時間和TPS。或要求TPS和P95,P99。有時成功率很敏感,不管發性能怎么樣,成功率必須100%,這是根據業務的類型要求的,特別是和錢有關的請求,要求都比較高。

    某API指標

    指標名稱

    指標值

    業務指標

    TPS(2C2G)

    2000

    響應時間

    ART

    10

    P95

    12

    P99

    15

    成功率

    100%

    并發線程

    20

    穩定性指標

    壓力持續時間

    >=8h

    壓力閾值

    CPU <80%,TPS≈2000

    內存泄露

    TPS波動

    <5%

    應用資源(2C2G)

    ?MEM

    <2G

    CPU最大使用率

    <90%

    DB資源(8C8G)

    ?MEM

    <8G

    CPU最大使用率

    <90%

    緩存(1C1G)

    MEM

    <80%

    CPU最大使用率

    <90%

  • 設計應用-通用設計

    開發人員要了解通用狀態下的設備情況,比如CPU的緩存,內存,硬盤之間的關系,比如速度是在依次減少,成本在降低。還要了解各種網絡協速度,I/O的速度,以及使用各種數據庫的速度通常的閾值是什么樣的。

762e1f158e6b6697641758c0f5ac08e4.png

提升性能的兩個法寶:用緩存和用Queue,緩存可以讓使用數據速度更快,Queue可以分隔復雜業務,讓吞吐量更高,合理有效的使用兩種技術可以很大的提升性能。

  • 設計應用-.NET體系

  • 使用異步:Demo

//同步方法
app.MapGet("/sync", () =>
{using (var con = new MySqlConnection(connectionString)){var result = con.Query<int>("select sleep(6)");Console.WriteLine($"sync:{DateTime.Now}");return result;}
});
//異步方法,沒有CancellationToken 
app.MapGet("/async", async () =>
{using (var con = new MySqlConnection(connectionString)){var result = await con.QueryAsync<int>("select sleep(6)");Console.WriteLine($"sync:{DateTime.Now}");return result;}
});
//異步,有CancellationToken 
app.MapGet("/asyncwithtoken", async (CancellationToken token) =>
{using (var con = new MySqlConnection(connectionString)){var result = await con.QueryAsync<int>(new CommandDefinition("select sleep(6)", cancellationToken: token));Console.WriteLine($"sync:{DateTime.Now}");return result;}
});

通過postman請求三個api,然后取消,會發現前兩個api始終會執行完成,并輸出時間;第三個會在取消后停止響應。

58fcce56ae5e58649eea1b97c6aec1e7.png

正確使用異步,可以有效地提升服務端的資源使用狀況。

  • 謹防阻塞:

記一次性能故障排查

桂素偉,公眾號:桂跡記一次性能故障排查

  • 大集合化整為零:用最正確的集合來處理數據,不要在集中存放大量數據,這樣不管對內存或之后的運算,造成負擔。同時要從業務層次評估計集合的最大上限。?

  • 避免在Host生成文件

再記一次Memory?Leak分析

桂素偉,公眾號:桂跡再記一次Memory Leak分析

  • 復雜方法要比對:

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
using PerformanceDemo;
using System.Collections.Generic;
using System.Xml.Linq;var summary = BenchmarkRunner.Run(typeof(CustomTypeTest));public class CustomTypeTest
{ [Benchmark][Arguments(2000)]public Dictionary<string, SBook> GetBook1(int count){var sbookDic = new Dictionary<string, SBook>();for (var i = 0; i <= count; i++){sbookDic.Add($"張{i}豐", new SBook(){Id = i,Name = "C#從入門到精通",Author = $"張{i}豐",Title = "C#1.0",Description = "這是一本書"});}return sbookDic;}[Benchmark][Arguments(2000)]public Dictionary<string, Book> GetBook2(int count){var bookDic = new Dictionary<string, Book>();for (var i = 0; i <= count; i++){bookDic.Add($"張{i}豐", new Book(){Id = i,Name = "C#從入門到精通",Author = $"張{i}豐",Title = "C#1.0",Description = "這是一本書"});}return bookDic;}[Benchmark][Arguments(2000)]public List<Book> GetBook3(int count){var bookList = new List<Book>();for (var i = 0; i <= count; i++){bookList.Add(new Book{Id = i,Name = "C#從入門到精通",Author = $"張{i}豐",Title = "C#1.0",Description = "這是一本書"});}return bookList;}[Benchmark][Arguments(2000)]public List<SBook> GetBook4(int count){var sbookList = new List<SBook>();for (var i = 0; i <= count; i++){sbookList.Add(new SBook{Id = i,Name = "C#從入門到精通",Author = $"張{i}豐",Title = "C#1.0",Description = "這是一本書"});}return sbookList;}
}
public class Book
{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public string Title { get; set; }public string Author { get; set; }
}
public struct SBook
{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public string Title { get; set; }public string Author { get; set; }
}

下面是比較結果:

28ec49fdbbb03dab584922b701c4a249.png

  • 讓每個API輕巧快速

  • 有一顆追求性能的心——關注.NET版本

    關于在開發層次的性能注意事項有很多,這是根據不同的項目,使用不同的類庫決定的,上面只是我性能化化中的幾個代表性場景。

  • 設計應用-發布

配置:GC方式 工作站方式,服務器方式:CPU使用率比內存更重要,服務器GC性能更好;內存利用率較高而 CPU 使用率相對較低,工作站 GC 性能更高。

發布方式:默認和R2R首次請求時間和體積不同


普通模式

R2R模式

AOT模式

大小

29.8 MB

62.2 MB

19.5M

首次請求用時

360ms

90ms

20ms

  • 正確測試

  • 測性能的正確姿勢

盡量與生產環境一致

要有監控,通過監控數據對比發現問題

不要打滿資源:CPU<90%,內存少于最大值

讓子彈多飛會兒,觀察內存是有什么不一樣

  • 遇到問題借助工具

dotnet-dump

dotnet-counters

  • 前人經驗也很寶貴

https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/

  • 性能優化

  • 減少響應時間:

優化&簡化流程

優化調用鏈路上的函數

把關系數據庫操作轉成緩存操作

用BenchmarkDotNet

  • 提升TPS:

優先降低性能測中的較高資源

讓應用性能是線性的,可以輕松地通過擴容來提升TPS

經過上面的分享,可以得出:

高性能:一定是架構出來的,但一定是優化出來的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ethereum-EIPs

What is an EIP? Ethereum Improvement Proposal 以太坊改進建議的文檔 這個文檔向Ethereum社區提供信息&#xff0c;為Ethereum、Ethereum的進程、環境描述一個新特征&#xff0c;該EIP應當為該特征提供一個基本的技術描述和原理原理。該EIP作者有責任在社區和不同意見的文檔…

Django08-1:模型層(ORM)--聚合查詢/分組查詢/F與Q查詢/開啟事務/常用字段及參數/自定義字段/數據庫查詢優化

聚合查詢 單獨使用時&#xff0c;用aggregate 1.只要是跟數據庫相關的模塊 基本都在django.db.models里面 如果沒有應該在django.db里面 2. 聚合查詢通常配合分組使用 from django.db.models import Avg, Sum, Max, Min, Count# 1.所有書的平均價格 resmodels.Book.objects.…

記事本狀態欄不會自動_如何在記事本中同時啟用狀態欄和自動換行

記事本狀態欄不會自動The status bar in Windows’ Notepad displays the current line number and column number of the cursor location. However, if you find that the Status Bar option on the View menu is grayed out, it may be because you have Word Wrap enabled…

洛谷P2587 [ZJOI2008] 泡泡堂

題目傳送門 分析&#xff1a;一道策略游戲題&#xff0c;要求最大期望得分和最小期望得分。首先分析最大&#xff0c;很顯然是可以用一種類似于田忌賽馬的思維來做&#xff0c;將兩隊的實力按照從大到小&#xff08;其實從小到大也可以&#xff09;排序&#xff0c;然后就按照順…

極端高溫導致澳大利亞斷網

&#xfeff;西澳大利亞首府珀斯因惡劣天氣出現了網絡連接問題&#xff0c; 網絡故障不是由于暴風雨或閃電引起的&#xff0c;而是極端高溫。本周一是珀斯有記錄以來第六熱的天&#xff0c;當天最高溫度達到了44.4℃。因為創紀錄的高溫&#xff0c;澳大利亞寬帶 服務商iiNet在當…

推薦一款采用 .NET 編寫的 反編譯到源碼工具 Reko

今天給大家介紹的是一款名叫Reko的開源反編譯工具&#xff0c;該工具采用C#開發&#xff0c;廣大研究人員可利用Reko來對機器碼進行反編譯處理。我們知道.NET 7 有了NativeAOT 的支持&#xff0c;采用NativeAOT 編譯的.NET程序 無法通過ILSpy 之類的傳統工具得到源碼&#xff0…

并行傳輸數據和串行傳輸數據_為什么串行數據傳輸比并行數據傳輸快?

并行傳輸數據和串行傳輸數據SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why wouldn’t the parallel transmission be faster? SATA硬盤驅動…

得到某月的天數

Calendar timeCalendar.getInstance(); time.clear(); time.set(Calendar.YEAR,2018);//year年 time.set(Calendar.MONTH,1);//Calendar對象默認一月為0,month月 int daytime.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數 System.out.pri…

Django09:圖書管理系統筆記/choices用法/ MTV與MVC模型/多對多三種創建方式

圖書管理系統筆記 redirect括號內可以直接寫url 也可以直接寫別名 但如果別名需要參數&#xff0c;必須使用reverse解析。 choices用法 使用場景&#xff1a;能列舉完全的數據 #使用方法&#xff1a;xxx_choice #1. get.xxx_display #2. 如果超出范圍&#xff0c;則顯示原…

業務處理速度變慢?且看IT如何成為救世主

在日常生活的方方面面&#xff0c;我們似乎都在期待著一種即時的便利。比如&#xff0c;用手機購物、訂餐、繳費、預約掛號等等。而在企業中&#xff0c;時間與效率可不是一種休閑福利&#xff0c;而是一項重要的商業功能。我們有理由期待&#xff0c;當今史無前例的數字革命正…

微軟讓卡塔爾世界杯踏入元宇宙

遵守前一篇公眾號文章里的承諾&#xff0c;昨天盆盆在視頻號里錄制了一段5分鐘左右的短視頻&#xff0c;講了江森自控和微軟Azure&#xff0c;如何幫助卡塔爾世界杯打造基于元宇宙的數字體育館。Part.1歡迎掃碼關注我的視頻號(每天更新元宇宙、云計算和數字化的短視頻)。Part.2…

洛谷——P1305 新二叉樹(新建二叉樹以及遍歷)

題目描述輸入一串二叉樹&#xff0c;用遍歷前序打出。 輸入輸出格式輸入格式&#xff1a; 第一行為二叉樹的節點數n。(n \leq 26n≤26) 后面n行&#xff0c;每一個字母為節點&#xff0c;后兩個字母分別為其左右兒子。 空節點用*表示 輸出格式&#xff1a; 前序排列的二叉樹 輸…

插槽1單通道插槽2雙通道_相機雙存儲卡插槽有什么大不了的?

插槽1單通道插槽2雙通道If you paid any attention to the launch of Canon and Nikon’s first full frame mirrorless cameras—the EOS R, Z6, and Z7— you’d have noticed that some people were pretty unhappy that they only came with a single card slot—an SD slo…

python 垃圾回收詳解

原文&#xff1a;https://zhuanlan.zhihu.com/p/31150408 總綱策略和垃圾回收系統工作內容引用計數詳解標記-清除分代收集循環引用編程應用-常見方法ex 過程詳解使用建議觸發機制參考文獻Python垃圾回收機制--完美講解&#xff08;Python vs Ruby&#xff09;Python垃圾回收機制…

Django10:Ajax介紹/發送數據/SweetAlert

Ajax 異步提交 局部刷新 發送方式 1. 瀏覽器輸入url&#xff0c;按enter get 2.a標簽href屬性 get 3.form表單 get/post 4. ajax get/post ajax 不是編程語言&#xf…

物聯網數據終端演進之道

智能手機的普及在最近幾年掀起了一股取代企業數據終端的風潮&#xff0c;但正如筆者在一年前便提到過 的&#xff0c;“智能手機難以在企業級應用中得以普及”&#xff0c;這種觀點最好的佐證便是時至今日&#xff0c;由于安全性與管理合規的需要&#xff0c;個人計算機用于企業…

mac 不能連接wi-fi_如何阻止Mac自動連接到Wi-Fi網絡

mac 不能連接wi-fiYour Mac automatically reconnects to Wi-Fi networks you’ve previously connected to. Starting with macOS High Sierra, you can now tell your Mac not to automatically connect to certain Wi-FI networks. Your Mac will remember the Wi-Fi networ…

“玩轉課堂”基本構想

1、項目背景隨著互聯網科技的高速發展&#xff0c;人們的生活、學習和工作中的許多事情都可以借助互聯網來完成&#xff0c;并且反響良好。作為學生&#xff0c;我們切身體會到&#xff0c;能夠使用網絡平臺來進行學習可以節約時間、并且十分方便&#xff1b;而在老師的角度&am…

SQLServer之分離數據庫

分離數據庫注意事項 要求具有 db_owner 固定數據庫角色中的成員資格。 可以分離數據庫的數據和事務日志文件&#xff0c;然后將它們重新附加到同一或其他 SQL Server實例。 如果要將數據庫更改到同一計算機的不同 SQL Server 實例或要移動數據庫&#xff0c;分離和附加數據庫會…

django11:自動序列化/批量插入數據/分頁器

自動序列化 借助serializers幫你自動完成序列化 from app01 import models from django.core import serializers def ab_se(request):user_queryset models.Userinfo.objects.all()#原始方法user_list []for user_obj in user_queryset:user_list.append({username:user_o…