主頁 >  其他 > Go性能調優-pprof

Go性能調優-pprof

2021-02-11 10:51:09 其他

在計算機性能除錯領域里,profiling 是指對應用程式的畫像,畫像就是應用程式使用 CPU 和記憶體的情況, Go語言是一個對性能特別看重的語言,因此語言中自帶了 profiling 的庫,這篇文章就要講解怎么在 golang 中做 profiling

Go性能優化

Go語言專案中的性能優化主要有以下幾個方面:

  • CPU profile:報告程式的 CPU 使用情況,按照一定頻率去采集應用程式在 CPU 和暫存器上面的資料
  • Memory Profile(Heap Profile):報告程式的記憶體使用情況
  • Block Profiling:報告 goroutines 不在運行狀態的情況,可以用來分析和查找死鎖等性能瓶頸
  • Goroutine Profiling:報告 goroutines 的使用情況,有哪些 goroutine,它們的呼叫關系是怎樣的

采集性能資料

Go語言內置了獲取程式的運行資料的工具,包括以下兩個標準庫:

  • runtime/pprof:采集工具型應用運行資料進行分析
  • net/http/pprof:采集服務型應用運行時資料進行分析

pprof開啟后,每隔一段時間(10ms)就會收集下當前的堆疊資訊,獲取各個函式占用的CPU以及記憶體資源;最后通過對這些采樣資料進行分析,形成一個性能分析報告,

注意,我們只應該在性能測驗的時候才在代碼中引入pprof,

工具型應用

如果你的應用程式是運行一段時間就結束退出型別,那么最好的辦法是在應用退出的時候把 profiling 的報告保存到檔案中,進行分析,對于這種情況,可以使用runtime/pprof庫, 首先在代碼中匯入runtime/pprof工具:

import "runtime/pprof"

CPU性能分析

開啟CPU性能分析:

pprof.StartCPUProfile(w io.Writer)

停止CPU性能分析:

pprof.StopCPUProfile()

應用執行結束后,就會生成一個檔案,保存了我們的 CPU profiling 資料,得到采樣資料之后,使用go tool pprof工具進行CPU性能分析,

記憶體性能優化

記錄程式的堆疊資訊

pprof.WriteHeapProfile(w io.Writer)

得到采樣資料之后,使用go tool pprof工具進行記憶體性能分析,

go tool pprof默認是使用-inuse_space進行統計,還可以使用-inuse-objects查看分配物件的數量,

服務型應用

如果你的應用程式是一直運行的,比如 web 應用,那么可以使用net/http/pprof庫,它能夠在提供 HTTP 服務進行分析,

如果使用了默認的http.DefaultServeMux(通常是代碼直接使用 http.ListenAndServe(“0.0.0.0:8000”, nil)),只需要在你的web server端代碼中按如下方式匯入net/http/pprof

import _ "net/http/pprof"

如果你使用自定義的 Mux,則需要手動注冊一些路由規則:

r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)

如果你使用的是gin框架,那么推薦使用github.com/gin-contrib/pprof,在代碼中通過以下命令注冊pprof相關路由,

pprof.Register(router)

不管哪種方式,你的 HTTP 服務都會多出/debug/pprof endpoint,訪問它會得到類似下面的內容:
pprof頁面
這個路徑下還有幾個子頁面:

  • /debug/pprof/profile:訪問這個鏈接會自動進行 CPU profiling,持續 30s,并生成一個檔案供下載
  • /debug/pprof/heap: Memory Profiling 的路徑,訪問這個鏈接會得到一個記憶體 Profiling 結果的檔案
  • /debug/pprof/block:block Profiling 的路徑
  • /debug/pprof/goroutines:運行的 goroutines 串列,以及呼叫關系 go tool pprof命令

不管是工具型應用還是服務型應用,我們使用相應的pprof庫獲取資料之后,下一步的都要對這些資料進行分析,我們可以使用go tool pprof命令列工具,

go tool pprof最簡單的使用方式為:

go tool pprof [binary] [source]

其中:

  • binary 是應用的二進制檔案,用來決議各種符號;
  • source 表示 profile 資料的來源,可以是本地的檔案,也可以是 http 地址,

注意事項: 獲取的 Profiling 資料是動態的,要想獲得有效的資料,請保證應用處于較大的負載(比如正在生成中運行的服務,或者通過其他工具模擬訪問壓力),否則如果應用處于空閑狀態,得到的結果可能沒有任何意義,

具體示例

首先我們來寫一段有問題的代碼:

package main

import (
	"flag"
	"fmt"
	"os"
	"runtime/pprof"
	"time"
)

// 一段有問題的代碼
func logicCode() {
	var c chan int
	for {
		select {
		case v := <-c:
			fmt.Printf("recv from chan, value:%v\n", v)
		default:
			//修正讓出CPU
			//time.Sleep(time.Millisecond)
		}
	}
}

func main() {
	var isCPUPprof bool
	var isMemPprof bool

	flag.BoolVar(&isCPUPprof, "cpu", false, "turn cpu pprof on")
	flag.BoolVar(&isMemPprof, "mem", false, "turn mem pprof on")
	flag.Parse()

	if isCPUPprof {
		f1, err := os.Create("./cpu.pprof")
		if err != nil {
			fmt.Printf("create cpu pprof failed, err:%v\n", err)
			return
		}
		_ = pprof.StartCPUProfile(f1)
		defer func() {
			pprof.StopCPUProfile()
			_ = f1.Close()
		}()
	}
	for i := 0; i < 6; i++ {
		go logicCode()
	}
	time.Sleep(10 * time.Second)
	if isMemPprof {
		f2, err := os.Create("./mem.pprof")
		if err != nil {
			fmt.Printf("create mem pprof failed, err:%v\n", err)
			return
		}
		defer func() {
			_ = pprof.WriteHeapProfile(f2)
			_ = f2.Close()
		}()
	}
}

通過flag我們可以在命令列控制是否開啟CPU和Mem的性能分析, 將上面的代碼保存并編譯成runtime_pprof可執行檔案,執行時加上-cpu命令列引數如下:

./runtime_pprof -cpu

等待30秒后會在當前目錄下生成一個cpu.pprof檔案,

命令列互動界面

我們使用go工具鏈里的pprof來分析一下,

go tool pprof cpu.pprof

執行上面的代碼會進入互動界面如下:

runtime_pprof $ go tool pprof cpu.pprof
Type: cpu
Time: Jun 28, 2019 at 11:28am (CST)
Duration: 20.13s, Total samples = 1.91mins (568.60%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)  

我們可以在互動界面輸入top3來查看程式中占用CPU前3位的函式:

(pprof) top3
Showing nodes accounting for 100.37s, 87.68% of 114.47s total
Dropped 17 nodes (cum <= 0.57s)
Showing top 3 nodes out of 4
      flat  flat%   sum%        cum   cum%
    42.52s 37.15% 37.15%     91.73s 80.13%  runtime.selectnbrecv
    35.21s 30.76% 67.90%     39.49s 34.50%  runtime.chanrecv
    22.64s 19.78% 87.68%    114.37s 99.91%  main.logicCode

其中:

  • flat:當前函式占用CPU的耗時
  • flat::當前函式占用CPU的耗時百分比
  • sun%:函式占用CPU的耗時累計百分比
  • cum:當前函式加上呼叫當前函式的函式占用CPU的總耗時
  • cum%:當前函式加上呼叫當前函式的函式占用CPU的總耗時百分比
  • 最后一列:函式名稱

在大多數的情況下,我們可以通過分析這五列得出一個應用程式的運行情況,并對程式進行優化,

我們還可以使用list 函式名命令查看具體的函式分析,例如執行list logicCode查看我們撰寫的函式的詳細分析,

(pprof) list logicCode
Total: 1.91mins
ROUTINE ================ main.logicCode in .../runtime_pprof/main.go
    22.64s   1.91mins (flat, cum) 99.91% of Total
         .          .     12:func logicCode() {
         .          .     13:   var c chan int
         .          .     14:   for {
         .          .     15:           select {
         .          .     16:           case v := <-c:
    22.64s   1.91mins     17:                   fmt.Printf("recv from chan, value:%v\n", v)
         .          .     18:           default:
         .          .     19:
         .          .     20:           }
         .          .     21:   }
         .          .     22:}

通過分析發現大部分CPU資源被17行占用,我們分析出select陳述句中的default沒有內容會導致上面的case v:=<-c:一直執行,我們在default分支添加一行time.Sleep(time.Second)即可,

圖形化

或者可以直接輸入web,通過svg圖的方式查看程式中詳細的CPU占用情況, 想要查看圖形化的界面首先需要安裝graphviz圖形化工具,

Mac:

brew install graphviz

Windows: 下載graphviz 將graphviz安裝目錄下的bin檔案夾添加到Path環境變數中, 在終端輸入dot -version查看是否安裝成功,
CPU占比圖

關于圖形的說明: 每個框代表一個函式,理論上框的越大表示占用的CPU資源越多, 方框之間的線條代表函式之間的呼叫關系, 線條上的數字表示函式呼叫的次數, 方框中的第一行數字表示當前函式占用CPU的百分比,第二行數字表示當前函式累計占用CPU的百分比,

除了分析CPU性能資料,pprof也支持分析記憶體性能資料,比如,使用下面的命令分析http服務的heap性能資料,查看當前程式的記憶體占用以及熱點記憶體物件使用的情況,

# 查看記憶體占用資料
go tool pprof -inuse_space http://127.0.0.1:8080/debug/pprof/heap
go tool pprof -inuse_objects http://127.0.0.1:8080/debug/pprof/heap
# 查看臨時記憶體分配資料
go tool pprof -alloc_space http://127.0.0.1:8080/debug/pprof/heap
go tool pprof -alloc_objects http://127.0.0.1:8080/debug/pprof/heap

火焰圖

火焰圖(Flame Graph)是 Bredan Gregg 創建的一種性能分析圖表,因為它的樣子近似 🔥而得名,上面的 profiling 結果也轉換成火焰圖,如果對火焰圖比較了解可以手動來操作,不過這里我們要介紹一個工具:go-torch,這是 uber 開源的一個工具,可以直接讀取 golang profiling 資料,并生成一個火焰圖的 svg 檔案,

新版的Go內置pprof已內置火焰圖插件, 網上大多數教程是獨立安裝

新版只需運行一下命令

go tool pprof -http=:8080 cpu.pprof
Serving web UI on http://localhost:8080

打開瀏覽器訪問: http://localhost:8080
點擊上方選單,切換視圖
切換視圖
火焰圖

gin框架使用

main.go

package main

import (
	"fmt"
	"github.com/DeanThompson/ginpprof"
	"github.com/gin-gonic/gin"
	"io"
	"os"
	"pprof/controllers"
)

func main() {
	gin.DisableConsoleColor() //關閉顏色
	//gin.SetMode(gin.DebugMode)
	gin.SetMode(gin.ReleaseMode)

	logfile, err := os.OpenFile("logs/gin_http.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
	if err != nil {
		fmt.Println("Could not create log file")
	}

	gin.DefaultWriter = io.MultiWriter(logfile)
	r := gin.Default()
	//r.Use(middlewares.Cors())

	Group := r.Group("user")
	{
		Group.GET("/reg", controllers.Reg)
	}

	ginpprof.Wrap(r)
	// ginpprof also plays well with *gin.RouterGroup
	// group := router.Group("/debug/pprof")
	// ginpprof.WrapGroup(group)

	_ = r.Run(":8880")
}

controllers/user.go

package controllers

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func Reg(context *gin.Context) {
	uid := context.DefaultQuery("uid", "0")

	context.JSON(http.StatusOK, gin.H{
		"code": 1,
		"msg":  "Success",
		"data": uid,
	})
}

壓測工具wrk

推薦使用https://github.com/wg/wrk 或 https://github.com/adjust/go-wrk, 或者使用apache的ab進行壓測

啟動分析程式:

go tool pprof -http=:8080 http://localhost:8880/debug/pprof/profile
Fetching profile over HTTP from http://localhost:8880/debug/pprof/profile
Saved profile in C:\Users\soul\pprof\pprof.samples.cpu.004.pb.gz
Serving web UI on http://localhost:8080

啟動wrk進行壓測:

go-wrk -n 10000 http://localhost:8880/user/reg?uid=10000

我這里使用ab進行壓測:

ab -n100000 -c 200 http://localhost:8880/user/reg?uid=10000
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8880

Document Path:          /user/reg?uid=10000
Document Length:        41 bytes

Concurrency Level:      200
Time taken for tests:   40.115 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      16400000 bytes
HTML transferred:       4100000 bytes
Requests per second:    2492.85 [#/sec] (mean)
Time per request:       80.229 [ms] (mean)
Time per request:       0.401 [ms] (mean, across all concurrent requests)
Transfer rate:          399.25 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       3
Processing:    12   80   5.5     79     123
Waiting:        2   58  15.2     59     121
Total:         12   80   5.5     79     123

Percentage of the requests served within a certain time (ms)
  50%     79
  66%     81
  75%     82
  80%     84
  90%     86
  95%     88
  98%     92
  99%     94
 100%    123 (longest request)

30秒之后會自動打開瀏覽器:http://localhost:8080
gin
查看火焰圖
gin火焰圖

火焰圖的y軸表示cpu呼叫方法的先后,x軸表示在每個采樣呼叫時間內,方法所占的時間百分比,越寬代表占據cpu時間越多,通過火焰圖我們就可以更清楚的找出耗時長的函式呼叫,然后不斷的修正代碼,重新采樣,不斷優化,

pprof與性能測驗結合

go test命令有兩個引數和 pprof 相關,它們分別指定生成的 CPUMemory profiling 保存的檔案:

  • -cpuprofile:cpu profiling 資料要保存的檔案地址
  • -memprofile:memory profiling 資料要報文的檔案地址

我們還可以選擇將pprof與性能測驗相結合,比如:

比如下面執行測驗的同時,也會執行 CPU profiling,并把結果保存在 cpu.prof 檔案中:

go test -bench . -cpuprofile=cpu.prof

比如下面執行測驗的同時,也會執行 Mem profiling,并把結果保存在 cpu.prof 檔案中:

go test -bench . -memprofile=./mem.prof

需要注意的是,Profiling 一般和性能測驗一起使用,這個原因在前文也提到過,只有應用在負載高的情況下 Profiling 才有意義,

參考文章:https://www.liwenzhou.com/posts/Go/performance_optimisation/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258651.html

標籤:AI

上一篇:種子度量值

下一篇:Go語言學習技術路線圖2021發布了!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more