Tron 節點 性能壓測

文章目錄

  • 一、代碼說明
    • 1.1 主要功能
    • 1.2 代碼示例
    • 1.3 代碼解釋
    • 1.4 執行流程
  • 二、結果分析
  • 三、參數解釋
    • 3.1 numWorkers 和 numRequests 說明
    • 3.2 使用場景
  • 四、注意事項

最近搭建了一個TRON節點,同事不相信我的自建節點比官方更靠譜,咱們給他使用golang寫一個壓測腳本,測試一下。

本文檔詳細介紹了一個基于 Go 的并發 HTTP 請求工具,幫助你對 Tron 節點進行壓力測試。本文檔將從代碼簡介、環境配置、編譯運行以及結果分析等方面進行詳細說明。

一、代碼說明

該工具通過并發多個 HTTP 請求,對 Tron 節點的處理能力進行壓力測試。每個請求都會記錄響應時間,并將結果輸出。

1.1 主要功能

  • 發送并發 HTTP 請求到指定 Tron 節點。
  • 記錄每個請求的響應時間和狀態。
  • 支持配置請求超時時間、并發 worker 數量和每個 worker 發送的請求數量。

1.2 代碼示例

package mainimport ("bytes""fmt""io/ioutil""net/http""sync""time"
)// worker 函數執行 HTTP 請求并記錄響應時間
func worker(id int, wg *sync.WaitGroup, url string, payload string, results chan<- string, numRequests int, timeout time.Duration) {defer wg.Done()client := &http.Client{Timeout: timeout,}for i := 0; i < numRequests; i++ {req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(payload)))if err != nil {results <- fmt.Sprintf("Worker %d: error creating request: %v", id, err)return}req.Header.Set("Content-Type", "application/json")start := time.Now()resp, err := client.Do(req)duration := time.Since(start)if err != nil {results <- fmt.Sprintf("Worker %d: error making request: %v", id, err)return}defer resp.Body.Close()if resp.StatusCode != http.StatusOK {body, _ := ioutil.ReadAll(resp.Body)results <- fmt.Sprintf("Worker %d: received non-OK status: %s, response body: %s", id, resp.Status, string(body))return}body, err := ioutil.ReadAll(resp.Body)if err != nil {results <- fmt.Sprintf("Worker %d: error reading response body: %v", id, err)return}results <- fmt.Sprintf("Worker %d: success in %v, response: %s", id, duration, string(body))}
}func main() {// Tron 節點的 URLurl := "http://節點地址:8090/wallet/getnowblock"// 替換為你的實際賬戶地址accountAddress := "your-account-address"payload := fmt.Sprintf(`{"address":"%s"}`, accountAddress)// 并發請求的 worker 數量numWorkers := 200// 每個 worker 發送的請求數量numRequests := 1// HTTP 請求的超時時間timeout := 3 * time.Secondvar wg sync.WaitGroupresults := make(chan string, numWorkers*numRequests)// 啟動 workerfor i := 0; i < numWorkers; i++ {wg.Add(1)go worker(i, &wg, url, payload, results, numRequests, timeout)}// 等待所有 worker 完成wg.Wait()close(results)// 輸出結果for result := range results {fmt.Println(result)}
}

1.3 代碼解釋

package mainimport ("bytes""fmt""io/ioutil""net/http""sync""time"
)

導入包

  • bytes:用于處理字節緩沖區,構造 HTTP 請求的 body。
  • fmt:用于格式化輸入輸出。
  • ioutil:提供 I/O 實用函數,讀取 HTTP 響應的 body。
  • net/http:用于發送 HTTP 請求。
  • sync:提供同步原語,例如 WaitGroup。
  • time:用于處理時間和定時器。
func worker(id int, wg *sync.WaitGroup, url string, payload string, results chan<- string, numRequests int, timeout time.Duration) {defer wg.Done()
  1. 參數:
  • id:worker 的 ID,用于標識日志中的具體 worker。
  • wg:WaitGroup,用于等待所有 worker 完成。
  • url:HTTP 請求的目標 URL。
  • payload:請求體數據。
  • results:用于存儲結果的通道。
  • numRequests:每個 worker 發送的請求數量。
  • timeout:每個 HTTP 請求的超時時間。
  1. defer wg.Done():確保函數結束時調用 wg.Done(),通知 WaitGroup 當前 worker 已完成。
	client := &http.Client{Timeout: timeout,}

創建 HTTP 客戶端

  • 創建一個帶有超時設置的 HTTP 客戶端。
	for i := 0; i < numRequests; i++ {req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(payload)))if err != nil {results <- fmt.Sprintf("Worker %d:error creating request: %v", id, err)return}req.Header.Set("Content-Type","application/json")

發送 HTTP 請求

  • 循環發送 numRequests 個請求。
  • 使用 http.NewRequest 創建新的 POST 請求。
  • 設置請求頭 Content-Type 為 application/json。
start := time.Now()
resp, err := client.Do(req)
duration := time.Since(start)

記錄請求時間

  • 記錄請求開始時間。
  • 發送請求并接收響應。
  • 計算請求的總持續時間。
		if err != nil {results <- fmt.Sprintf("Worker %d: error making request: %v", id, err)return}defer resp.Body.Close()

處理請求錯誤和響應

  • 如果請求錯誤,記錄錯誤信息并返回。
  • 確保在函數結束時關閉響應體。
		if resp.StatusCode != http.StatusOK {body, _ := ioutil.ReadAll(resp.Body)results <- fmt.Sprintf("Worker %d: received non-OK status: %s, response body: %s", id, resp.Status, string(body))return}

檢查響應狀態碼

  • 檢查響應狀態碼是否為 200 (OK)。
  • 如果不是 200,讀取響應體并記錄錯誤信息。
		body, err := ioutil.ReadAll(resp.Body)if err != nil {results <- fmt.Sprintf("Worker %d: error reading response body: %v", id, err)return}

讀取響應體

  • 讀取響應體,如果讀取錯誤,記錄錯誤信息。
		results <- fmt.Sprintf("Worker %d: success in %v, response: %s", id, duration, string(body))}
}

記錄成功請求

  • 將成功請求的結果、持續時間和響應體發送到結果通道。
func main() {// Tron 節點的 URLurl := "http://tron節點地址:8090/wallet/getnowblock"// 替換為你的實際賬戶地址accountAddress := "your-account-address"payload := fmt.Sprintf(`{"address":"%s"}`, accountAddress)

main 函數

  • 定義 Tron 節點的 URL 和請求體數據。
// 并發請求的 worker 數量
numWorkers := 200
// 每個 worker 發送的請求數量
numRequests := 1
// HTTP 請求的超時時間
timeout := 3 * time.Second

配置參數

  • numWorkers:并發 worker 的數量。
  • numRequests:每個 worker 發送的請求數量。
  • timeout:HTTP 請求的超時時間。
var wg sync.WaitGroup
results := make(chan string,numWorkers*numRequests)

初始化 WaitGroup 和結果通道

  • 創建一個 WaitGroup,用于同步所有 worker。
  • 創建一個結果通道,用于存儲每個請求的結果。
	// 啟動 workerfor i := 0; i < numWorkers; i++ {wg.Add(1)go worker(i, &wg, url, payload, results, numRequests, timeout)}

啟動并發 worker

  • 啟動 numWorkers 個并發 worker,每個 worker 在獨立的 goroutine 中運行。
	// 等待所有 worker 完成wg.Wait()close(results)

等待所有 worker 完成

  • 使用 wg.Wait() 等待所有 worker 完成。
  • 關閉結果通道,表示所有結果已經寫入完成。
	// 輸出結果for result := range results {fmt.Println(result)}
}
  • 輸出結果
    迭代結果通道,打印每個請求的結果。

1.4 執行流程

  • 初始化和配置:導入必要的包并定義 worker 函數和 main 函數中的參數。
  • 創建并啟動 worker:在 main 函數中,根據配置啟動并發的 worker。
  • 發送請求:每個 worker 根據 numRequests 發送指定數量的請求。
  • 處理響應:每個請求記錄開始時間、發送請求、接收響應并記錄結束時間。處理請求的錯誤和響應狀態碼,并讀取響應體。
  • 記錄結果:將每個請求的結果、持續時間和響應體發送到結果通道。
  • 等待完成:等待所有 worker 完成,并關閉結果通道。
  • 輸出結果:迭代結果通道,打印每個請求的結果。

二、結果分析

程序的輸出包括每個請求的響應時間和響應內容。以下是輸出示例:

Worker 0: success in 150ms, response: {...}
Worker 1: success in 145ms, response: {...}
Worker 2: received non-OK status: 500 Internal Server Error, response body: {...}
...
Average request duration: 147ms

輸出說明

  • Worker X: success in Yms, response: {…}:表示 worker X 成功發送了請求,響應時間為 Y 毫秒,響應內容為 {…}。
  • Worker X: received non-OK status: …:表示 worker X 收到了非 200 狀態碼的響應,響應內容顯示在 {…} 中。
  • Average request duration: …:表示所有請求的平均響應時間。

三、參數解釋

3.1 numWorkers 和 numRequests 說明

numWorkers

  • 定義:numWorkers 代表并發執行的 worker 數量。
  • 作用:控制并發請求的數量。每個 worker 是一個獨立的 goroutine,它會發送 HTTP 請求到指定的 URL。
  • 作用機制:當程序運行時,會啟動 numWorkers 個并發的 goroutine,每個 goroutine 都會執行 worker 函數。

numRequests

  • 定義:numRequests 代表每個 worker 需要發送的請求數量。
  • 作用:控制每個 worker 發送的請求總數。一個 worker 會在一個循環中發送多個請求,直到達到numRequests 的數量。
  • 作用機制:每個 worker 啟動后,會在一個循環中發送 numRequests 個 HTTP 請求。

兩個參數的關系

  • 并發度:numWorkers 決定了程序的并發度。更多的 workers 意味著更多的并發請求。
  • 總請求數:總的請求數由 numWorkers 和 numRequests 的乘積決定。總請求數 = numWorkers × numRequests。

關系示例

numWorkers = 200
numRequests = 10

那么:

  • 將啟動 200 個并發的 worker。
  • 每個 worker 發送 10 個請求。
  • 總請求數為 200 × 10 = 2000 個請求。

3.2 使用場景

高并發測試

  • 增大 numWorkers 可以增加并發請求的數量,用于測試服務器在高并發情況下的表現。
  • 適用于需要模擬大量用戶同時訪問服務器的場景。

高負載測試

  • 增大 numRequests 可以增加每個 worker 發送的請求總數,用于測試服務器在高負載情況下的表現。
  • 適用于需要模擬少量用戶頻繁訪問服務器的場景。

可以調整 numWorkers 和 numRequests 來模擬不同的壓力場景。

  • 如需模擬高并發但請求數少的情況,可以增加 numWorkers 并減少 numRequests。
  • 如需模擬低并發但請求數多的情況,可以減少 numWorkers 并增加 numRequests。

通過合理配置 numWorkers 和 numRequests,可以有效地測試服務器在不同負載和并發條件下的性能表現。

四、注意事項

  • 請確保 Tron節點可以處理大量并發請求,以避免節點過載。

  • 調整超時時間以適應你的網絡環境,避免因網絡延遲導致的不必要錯誤。

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

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

相關文章

如何成為一個專業的AI產品經理?

可以找專業的老師帶。 可以找專業的內容學。 可以多遇挫折并快速學習&#xff0c;屢敗屢戰&#xff0c;筆者本人從業AI十年有余&#xff0c;吃了不少苦&#xff0c;有過很多或成功或失敗的經歷。 成為一個專業的AI產品經理需要一系列專業知識和技能的積累&#xff0c;以及在…

axios - 簡 單 的 請 求 模 板

import {message } from ant-design-vue import axios from axios import {useUserStore } from @/store/modules/user import router from @/routerconst instance = axios.create({baseURL: http://192.168.110.171:5201,timeout: 5000, })* 請求攔截器 insta

切換Ubuntu開機的主題

要將Ubuntu系統的啟動畫面&#xff08;即開機時的顯示界面&#xff09;從Lubuntu切換回原生的Ubuntu界面&#xff0c;可以按照以下步驟操作&#xff1a; 1. 安裝原生Ubuntu的plymouth主題 首先&#xff0c;確保你已經安裝了原生Ubuntu的plymouth主題。打開終端并運行以下命令…

基于Matlab卷積神經網絡(CNN)人臉識別系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 人臉識別技術作為計算機視覺領域的一個重要分支&#xff0c;已經廣泛應用于安全監控、身份驗證…

Python基礎知識歸納總結

目錄 一、線性表 總結 二、棧 三、隊列 四、哈希表 五、字符串 六、正則表達式 綜合示例 一、線性表 線性表&#xff08;通常用列表表示&#xff09;是一種按線性順序存儲元素的數據結構。 插入元素 (append, insert) 刪除元素 (remove, pop) 查找元素 (index) 更新…

FreeRTOS學習——FreeRTOS隊列(下)之隊列創建

本篇文章記錄我學習FreeRTOS隊列創建的知識。主要分享隊列創建需要使用的初始化函數、隊列復位函數。 需要進一步了解FreeRTOS隊列的相關知識&#xff0c;讀者可以參考以下文章&#xff1a; FreeRTOS學習——FreeRTOS隊列&#xff08;上&#xff09;_freertos 單元素隊列-CSDN博…

Spring、SpringMVC、SpringBoot 三者之間是什么關系

Spring、SpringMVC、SpringBoot 是三個獨立的框架&#xff0c;它們之間的關系是: 1. Spring是一個Java的輕量級應用框架&#xff0c;提供了基于IoC和AOP的支持&#xff0c;用于構建企業級應用。Spring有多 個模塊&#xff0c;包括 Spring Core、Spring Context、Spring JDBC、…

高質量油封選擇的重要性

在現代工業和機械系統中&#xff0c;油封的作用至關重要。它們不僅防止潤滑劑泄漏&#xff0c;還阻止污染物進入系統&#xff0c;從而保障設備的正常運行。選擇高質量的油封對于保證設備性能、延長使用壽命和降低維護成本至關重要。本文將從多個角度探討選擇高質量油封的重要性…

【hackmyvm】Slowman靶機

文章目錄 主機探測端口探測FTP匿名登錄 目錄探測hydra爆破mysql爆破zip------fcrackzip爆破密碼-----john提權 主機探測 ┌──(root?kali)-[/home/kali] └─# fping -ag 192.168.9.1/24 2>/dev/null 192.168.9.221 主機192.168.9.224 靶機端口探測 ┌──(roo…

送變電乙級資質申請攻略:關鍵步驟與注意事項

關鍵步驟&#xff1a; 工商注冊與資本核實&#xff1a; 確保企業已正式注冊&#xff0c;且注冊資金不少于100萬元人民幣&#xff0c;同時準備企業法人營業執照等相關證明文件。 人員配置與注冊&#xff1a; 根據資質要求&#xff0c;配置齊全合理的專業技術人員&#xff0c;包括…

【教程】Linux 安裝 kkFileView 文檔在線預覽項目 及優化

【教程】Linux 安裝 kkFileView 文檔在線預覽項目 官網 kkFileView - 在線文件預覽 (keking.cn) 安裝包 可以直接下載成品 也可以下載source 源碼 自己編譯 kkFileView 發行版 - Gitee.com 打開IDEA 然后先clear 再install 然后在 file-online-preview\server\target 目錄…

Nginx R31 doc-09-Serving Static Content 靜態內容

提供靜態內容 配置 NGINX 和 NGINX Plus 以提供靜態內容&#xff0c;使用類型特定的根目錄&#xff0c;檢查文件存在性&#xff0c;并進行性能優化。 本節介紹如何配置 NGINX 和 NGINX Plus 以提供靜態內容&#xff0c;如何定義搜索請求文件的路徑&#xff0c;如何設置索引文…

WordPress插件Disable WP REST API,可根據是否登錄來禁用REST API

前面跟大家分享了代碼版禁用WordPress REST API的方法&#xff08;詳見『WordPress4.7以上版本如何禁用JSON REST API&#xff1f;』&#xff09;&#xff0c;不過有些站長不太敢折騰自己的網站代碼&#xff0c;那么建議試試這款Disable WP REST API&#xff0c;它可以&#xf…

小結5:朗讀練習第二段

五、朗讀練習2 2024-5-6始&#xff0c;5-14終&#xff0c;5-15寫。 我漸漸體會到一些朗讀的樂趣。但我還要考研&#xff0c;要寫作業、期末考試。如果是在大一該多好。我可以就這樣一天一天的寫下去&#xff0c;慢慢地有一些自己的作品&#xff0c;還能錄視頻發到b站上。 上一篇…

通過修改物理內存實現跨進程內存讀寫

習一下利用修改物理內存來跨進程內存讀寫 系統&#xff1a;win10 21h1 x64 編譯環境: vs2022 詳情見附錄 基礎 虛擬地址轉物理地址 虛擬地址也稱線性地址&#xff0c;一個線性地址進程的DirBase地址可以轉換成物理地址。先來看線性地址的含義 在x64體系中只實現了48位的virtu…

刀片式服務器的主要組件有哪些?

刀片式服務器是專門為特殊應用行業跟高密度計算環境設計的&#xff0c;是高可用高密度低成本的服務器平臺&#xff0c;刀片服務器這個名稱主要是根據產品的形狀&#xff0c;刀片式服務器的組成單元外形扁平&#xff0c;就像刀片一樣&#xff0c;整體設計的比較緊湊&#xff0c;…

C#和C++有什么區別?

C#和C都是廣泛使用的編程語言&#xff0c;但它們在設計理念、應用場景和語法上有許多顯著的區別。以下是一些關鍵區別的詳細介紹&#xff1a; 1. 設計理念和目的 C&#xff1a; 設計目的&#xff1a;C是一種面向系統編程和應用程序開發的語言&#xff0c;具有高效性和靈活性…

電工杯b題

雖然這次休息不打&#xff0c;但是看了一下&#xff0c;我比較傾向于機器學習灌水&#xff08;doge

刷題之從前序遍歷與中序遍歷序列構造二叉樹(leetcode)

從前序遍歷與中序遍歷序列構造二叉樹 前序遍歷&#xff1a;中左右 中序遍歷&#xff1a;左中右 前序遍歷的第一個數必定為根節點&#xff0c;再到中序遍歷中找到該數&#xff0c;數的左邊是左子樹&#xff0c;右邊是右子樹&#xff0c;進行遞歸即可。 #include<vector>…

Juniper查看并調整策略順序

1.查看安全策略 >show security policies 順序就是按照顯示出來的順序&#xff0c;與Index無關&#xff0c;從上到下匹配 2. 調整防火墻策略 #insert security policies from-zone CAMERAS to-zone INTERNET policy CAMERAS-to-NTP before policy CAMERAS-to-INTERNET …