练习Go语言-HTTP压力测试.md
文章目录
- 步骤
- 服务端
- 客户端
2019年6月14日星期五补充错误信息.
2017年10月20日星期五 7:26
##设计
压力测试HTTP服务端。比如看看你的电脑能同时建立多少长连接。
算是我的第一个Go程序。
熬夜了。
主要运用了:
- 参数处理
- channel通讯
- 整合了CPU和内存统计代码
协程和通讯的事都让Go做了,我就是来验证它的性能的。
步骤
创建一个目录 tmp
先,不然服务器因为没有地方写诊断信息 会报错:
2019/06/14 16:38:56 open ./tmp/cpu.prof: The system cannot find the path specified.
解决方案:
mkdir tmp
该服务端 和 客户端 我在最近版本的GoLang已经测试.
用法是:
默认是5万连接.
- 运行服务端
看到提示: - 运行客户端
一段时间后. - 在服务端窗口 输入回车结束.
- 分析诊断文件
产生了 CPU 和 内存统计文件 在./tmp/
文件夹下:
怎么分析?诊断文件看这里: https://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html
主要是 CPU的不同函数上的信息,以及内存占用的信息.
想测试别的网站就: 把客户端的 网址改成该网站. 但注意可能搞坏…
服务端
servic.go
package mainimport ("fmt""io""log""net/http""os""runtime""runtime/pprof""strings"
)func helloHandler(w http.ResponseWriter, r *http.Request) {r.ParseForm() //解析参数if openLog {fmt.Println(r.Form)fmt.Println("path", r.URL.Path)fmt.Println("scheme", r.URL.Scheme)fmt.Println(r.Form["url_long"])}if openLog {for k, v := range r.Form {fmt.Println("key:", k)fmt.Println("val:", strings.Join(v, ""))}}io.WriteString(w, "Hello,Test Me!")fmt.Fprintf(w, "Hello!")My_Mem_Prof()/*不退出测试长连接性能*/chLongLink <- true<-chExitThreads
}var chExitThreads chan bool
var chLongLink = make(chan bool, 1000*100)func openService() {http.HandleFunc("/MyWeb", helloHandler)err := http.ListenAndServe(":8686", nil)if err != nil {log.Fatal("ListenAndServe:", err.Error())}
}const openLog bool = falsevar ch_sync chan boolfunc calc() {number := 0for {_, ok := <-chLongLinkif !ok {break}number++if (number % 100) == 0 {fmt.Println("now long link:", number)}}fmt.Println("All long link number is:", number)close(ch_sync)fmt.Println("End")
}
func My_Mem_Prof() {fm, err := os.OpenFile("./tmp/mem.out", os.O_RDWR|os.O_CREATE, 0644)if err != nil {log.Fatal(err)}pprof.WriteHeapProfile(fm)fm.Close()
}func My_Cpu_Prof() {f, err := os.OpenFile("./tmp/cpu.prof", os.O_RDWR|os.O_CREATE, 0644)if err != nil {log.Fatal(err)}defer f.Close()pprof.StartCPUProfile(f)defer pprof.StopCPUProfile()<-chExitThreadspprof.StopCPUProfile()fmt.Println("End CPU Prof")f.Close()close(chExitProf)
}var chExitProf chan boolfunc main() {/*初始化channel通知*/chExitThreads = make(chan bool)ch_sync = make(chan bool)chExitProf = make(chan bool)runtime.GOMAXPROCS(runtime.NumCPU() * 2)fmt.Println("CPU Number:", runtime.NumCPU())fmt.Println("Thread Number:", runtime.NumCPU()*2)go My_Cpu_Prof()exp := `Please visit: "http://localhost:8686/MyWeb"`/fmt.Println(exp)go calc()go openService()/*直到用户输入才开始退出协程*/input := make([]byte, 1024)os.Stdin.Read(input)close(chLongLink)<-ch_syncfmt.Println("OK")close(chExitThreads)<-chExitProf
}
客户端
client.go
// client.go
package mainimport ("flag""fmt""io/ioutil""net/http""runtime""time"
)func client(exit_ch chan int, webPath string) {var err errorresp, err := http.Get(webPath)if err != nil {// handle errorfmt.Println(err.Error())goto threadEnd}/*body*/_, err = ioutil.ReadAll(resp.Body)if err != nil {// handle errorfmt.Println(err.Error())goto threadEnd}defer resp.Body.Close()//fmt.Println(string(body))
threadEnd:exit_ch <- 1}func main() {var webPath stringflag.StringVar(&webPath, "webpath", http://localhost:8686/MyWeb", "Tested Web Path")test_time_work := flag.Int("time", 50000, "Test times")flag.Parse()fmt.Println(webPath)runtime.GOMAXPROCS(runtime.NumCPU() * 2)exit_ch := make(chan int)test_time := time.Now()for i := 0; i < *test_time_work; i++ {go client(exit_ch, webPath)}for i := 0; i < *test_time_work; i++ {<-exit_chfmt.Println("Success time!:", i+1)}test_time_end := time.Since(test_time)fmt.Println("End*******************")fmt.Println("CPU Number:", runtime.NumCPU())fmt.Println(test_time_end)
}
练习Go语言-HTTP压力测试.md相关推荐
- go/golang语言编写压力测试
go/golang语言编写压力测试 近期复习了一下go,发现go的压力测试是个好东西.记录一下怎么使用. 压力测试用来检测函数(方法)的性能,和编写单元功能测试的方法类似,此处不再赘述,但需要注意以下 ...
- 游戏服务器的压力测试应该如何进行
游戏服务器的压力测试应该如何进行?自己写机器人还是 LR 等工具? 1 条评论 分享 按投票排序按时间排序 14 个回答 5赞同 反对,不会显示你的姓名 李丹阳,会敲代码的喵.后端程序猿,爱PHP,爱 ...
- 【压测】压力测试ab的用法【原创】.md
简介 ab(Apache Bench)是Apache附带的压力测试软件,容易使用,功能完全能够满足我们的要求,安装apache时会自带该压力测试软件 参数说明 ab自带的参数说明: [root@xia ...
- Android APP压力测试(二) 之Monkey信息自动收集脚本
转载-原文地址: http://www.cnblogs.com/findyou/p/3936063.html Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 本文重点 ...
- 终极Web应用性能和压力测试工具Gor
什么是Gor 项目地址:https://github.com/buger/gor 官方描述 Gor is a simple http traffic replication tool written ...
- 使用JMeter压力测试
一. JMeter介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域.它可以用于测试静态 ...
- SoapUI实践:自动化测试、压力测试、持续集成
因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api.下面将研究的成果展示给大家,希望对需要的人有所帮助. SoapUI 是什么? SoapUI 是一个开源测试工具,通过 ...
- 开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试
前言 表面看来,JMeter与本系列课程似乎关系不大,但实际上在后面的很多场景中起着重要作用:如何获知修改了某些代码或者设置之后系统性能是提升了还是下降了呢?商业的压力测试工具LoadRunner确实 ...
- 测试tcp连接数工具_后端开发程序员不知道压力测试怎么能行
专注于Java领域优质技术,欢迎关注 作者: 温增闽 来自:杏仁技术站 杏仁后端工程师,专注高并发和分布式编程,Golang爱好者. 压力测试必知必会 压力测试是后端程序员的必备技能,很多工作场景都需 ...
- 使用 JMeter 进行压力测试
一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率:预估系统的承载能力,使我们能根据其做出一些应对措施.所以压力测 ...
最新文章
- hana::detail::variadic::foldl1用法的测试程序
- 测试MongoDB的自动分片
- 跨语言RPC框架Thrift详解
- Python基础七(函数)
- python第三方库-基础
- Kamailio 简介
- 【clickhouse】Too many parts . Merges are processing significantly slower than inserts
- 初学WEB前端的建议,你不看给别人可惜了!
- 为了更准确的验证码而奋斗-云大urp教务系统大作战(1.5)
- 巨头争云存储祭免费旗 或重演视频业消耗战
- OSChina 周一乱弹 —— 这片城市都会属于你,而你属于我
- UNIX/Linux的传奇历史
- python m3u8_python 实践应用(一)解析M3U8
- 企业邮箱如何免费申请注册?
- EMV(一):初步了解EMV和EMV的分层结构
- 玩烂vue之vue练手项目
- 最生动的数据分析师技能图谱
- RabbitMQ 学习笔记
- Scoop包管理工具
- [***Model mj_objectArrayWithKeyValuesArray:]: unrecognized selector sent to class 0x10ace5df0