前言該文的前置篇為:
https://www.cnblogs.com/aoximin/p/16839830.html
本文介紹性能排查 。
正文上一節是出現錯誤了 , 如何去排查具體問題 。
這一節介紹一下性能排查 。
還是上文的例子作為演示:https://buggyambfiles.blob.core.windows.net/bin/buggyamb_v1.1.zip
項目地址:https://github.com/ahmetmithat/buggyamb
本文實驗的還是lldb 和 sos 。
對比一下cpu 情況 。
實驗實施條件:
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/201625C29-0.png)
文章插圖
請求前:
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/20162513K-1.png)
文章插圖
點擊請求后:
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/201625F48-2.png)
文章插圖
這樣對比還是很大的哈 。
那么我們來看下啥子情況吧 。
查看進程名:
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/20162525Z-3.png)
文章插圖
那么當cpu 高的時候進行抓取 , 一般抓取兩個 , 兩個間隔10秒左右 。
為什么抓取兩個呢? 因為好對比作用 , 更好定位 , 這個多實驗實驗就清楚了 。
抓取命令:
/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.30/createdump 108232 -f /tmp/coredump.manual.1.%d/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.30/createdump 108232 -f /tmp/coredump.manual.2.%d兩個命令間隔10秒 。我們知道這個createdump 是 dotcore runtime 自帶的 。
那么怎么知道他的位置呢?
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/201625DF-4.png)
文章插圖
這樣可以查找到位置 。
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/201625O46-5.png)
文章插圖
可以看到10秒后內存升高了 。
那么就可以上一章的內容了 , 進入lldb 。
lldb --core coredump.manual.1.108232
然后查看線程:
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/2016251943-6.png)
文章插圖
看這個線程 , 發現和其他GC mode 不一樣 。
那么就有一個東西需要科普了 , 分別是cooperative 和 preemptive 。
如果線程的 GC 模式設置為 “搶占” , 則表示 GC 可以隨時掛起此線程 。相比之下 , 協作模式意味著 GC 必須等待線程切換到搶占模式 , 然后才能掛起它 。當線程運行托管代碼時 , 它處于協作模式 。這句話什么意思呢? 就是說這個線程在占用cpu的意思 。那么cpu 高就應該看這個東西了 。setthread 14 然后切到這個線程 。這里就不解釋了 , 都是上一章的東西 。
然后調用一下clrstack 。
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/2016251562-7.png)
文章插圖
然后來看一下干了什么?
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/20162515E-8.png)
文章插圖
感覺是在做字符串拼接啊 。
那么這個時候是會造成cpu高和內存高的 , 那么要證明自己的猜想 。
使用dso 查看一下 。
Displays all managed objects found within the bounds of the current stack.![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/2016254348-9.png)
文章插圖
看下這個string , 為什么看這個呢?因為這個string , 和System.Data.DataRow 比較近 , 這個可以學習匯編可能跟容易理解 。
![重新整理 .net core 實踐篇 ———— linux上性能排查 [外篇]](http://shimg.jingyanzongjie.com/230727/2016254296-10.png)
文章插圖
查看了一下這個倒是有100m 。
讀取一下內存 , 看下里面是什么?
經驗總結擴展閱讀
- oppo手機如何快速整理桌面 oppo怎樣快速整理桌面
- 在 .NET 7上使用 WASM 和 WASI
- 重新整理 .net core 實踐篇 ———— linux上排查問題實用工具 [外篇]
- .NET 7 中 LINQ 的瘋狂性能提升
- 兩種 .Net Core 3.0 對 MongoDB 的多條件查詢操作
- 螃蟹涼了可以重新加熱嗎
- 螃蟹斷掉的腿,還能重新長出來嗎?
- .NET性能優化-復用StringBuilder
- .net 溫故知新:【8】.NET 中的配置從xml轉向json
- 哪些星座男生視妻如命
