首页 > 代码库 > golang性能监控初探
golang性能监控初探
最近在用golang写一个server。压力测试过程发现反应比较慢,但是由于中间的操作都是串行的,无法知道在哪个操作消耗了比较多时间。
一开始想到的是打log。但是单个请求又是很快的,于是想到如下方案
在调用每个函数的时候,统计该函数的时耗,然后利用channel把同一个函数调用发送到同一个地方,利用map进行累计统计(这里可以更近一步,比如统计每个worker甚至每个services的状态,包括最长请求时间,最短请求时间,平均消耗等等,如果加上runtime还可以记录其他的运行相关信息)。
一开始在思考是否有一个类似c++的static变量的东西,好在golang的闭包就支持有状态的行为,而且比static更进一步,闭包的每次调用都能得到一个新的局部变量实体,所以,并发的时耗,在不同的地方,调用就可以得到不同的结果。
直接上代码。
func preReportStatus(funcName string) func(reportType int, input chan<- *RequestProf) { var startTime = time.Now() var reportFunc = funcName a := func(reportType int, input chan<- *RequestProf) { consumeTime := int64(time.Now().Sub(startTime) / 1000) requestProf := &RequestProf{ apiName: reportFunc, consumeTime: consumeTime, invokeTimes: 1, successCount: 0, errorCount: 0, } if reportType == kSuccess { requestProf.successCount = 1 } else { requestProf.errorCount = 1 } input <- requestProf } return a}var requestProfChan = make(chan *RequestProf,500)var requestProfMap = make(map[string]*RequestProf)func funcA() error { report := preReportStatus("funcA") err := funcB() if err != nil { report(kFail, requestProfChan) return errors.New("funcA error.") } report(kSuccess, requestProfChan) return nil}
golang性能监控初探
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。