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.mzph.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 …