Tron 节点 性能压测

最近搭建了一个TRON节点,同事不相信我的自建节点比官方更靠谱,咱们给他使用golang写一个压测脚本,测试一下。 本文档详细介绍了一个基于 Go 的并发 HTTP 请求工具,帮助你对 Tron 节点进行压力测试。本文档将从代码简介、环境配置、编译运行以及结果分析等方面进行详细说明。

最近搭建了一个TRON节点,同事不相信我的自建节点比官方更靠谱,咱们给他使用golang写一个压测脚本,测试一下。

本文档详细介绍了一个基于 Go 的并发 HTTP 请求工具,帮助你对 Tron 节点进行压力测试。本文档将从代码简介、环境配置、编译运行以及结果分析等方面进行详细说明。

一、代码说明

该工具通过并发多个 HTTP 请求,对 Tron 节点的处理能力进行压力测试。每个请求都会记录响应时间,并将结果输出。

1.1 主要功能

  • 发送并发 HTTP 请求到指定 Tron 节点。
  • 记录每个请求的响应时间和状态。
  • 支持配置请求超时时间、并发 worker 数量和每个 worker 发送的请求数量。

1.2 代码示例

package main

import (
    "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 节点的 URL
    url := "http://节点地址:8090/wallet/getnowblock"
    // 替换为你的实际账户地址
    accountAddress := "your-account-address"
    payload := fmt.Sprintf(`{"address":"%s"}`, accountAddress)

    // 并发请求的 worker 数量
    numWorkers := 200
    // 每个 worker 发送的请求数量
    numRequests := 1
    // HTTP 请求的超时时间
    timeout := 3 * time.Second

    var wg sync.WaitGroup
    results := make(chan string, numWorkers*numRequests)

    // 启动 worker
    for 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 main

import (
    "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 请求的超时时间。
  2. 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...

剩余50%的内容订阅专栏后可查看

  • 原创
  • 学分: 0
  • 分类: 公链
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
该文章收录于 Web3
0 订阅 14 篇文章

0 条评论

请先 登录 后评论
杰哥的技术杂货铺
杰哥的技术杂货铺
0x6e60...2aa2
江湖只有他的大名,没有他的介绍。