记 Go 的一次profile

最近在搞p2p的调度,需要做一个tcp的双向代理。最开始只能到20w连接,10w的qps,现在做到了60w 连接,40w qps都没问题。cpu 用了16核,一共24核。

大部分会选择pprof的 web 模式,其他方式可以参看其他博客。操作方式如下:

首先,引入相关包

import (
    "net/http"
    _ "net/http/pprof"
)
然后,启动web程序

go func() {
       http.ListenAndServe(fmt.Sprintf(":%d", config.Main.MonitorPort), nil)
    }()
这样就可以使用pprof提供的profile功能了,功能列表如下:

也可以使用curl 查看:

那些框住的就是浏览器显示的链接,如显示堆栈是 http://192.168.110.127:8601/debug/pprof/heap?debug=1

但是很多情况下,服务端的端口是有防火墙的,所以需要另外一种使用方式,go tool pprof 方式。

go tool pprof http://localhost:6060/debug/pprof/profile   # 30-second CPU profile
go tool pprof http://localhost:6060/debug/pprof/heap      # heap profile
go tool pprof http://localhost:6060/debug/pprof/block     # goroutine blocking profile

CPU的调试,可以用svg > 1.svg 保存到svg文件,然后用浏览器打开,如:


可以使用 top N,和 list function 进行查询哪个函数的哪一行耗费cpu高,特别的,需要源文件,没有源文件是不能list 的

前三列的分别是,这一行的运行的采样值,这一行的调用函数的采样值,行号。也可以使用disasm function,用汇编替代源代码进行显示。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Volume Profile指标是一种用来显示市场交易量分布情况的技术指标。它通过将市场交易量按价格分段,然后计算每个价格段内的成交量,从而在图表上形成一个垂直的分布图,以便更好地了解市场的趋势和交易活动。 以下是一个示例的Volume Profile指标的代码: ``` //@version=4 study("Volume Profile", overlay=true) // 设置参数 res = input(title="Resolution", type=input.string, defval="D", options=["D", "W", "M", "60", "240", "1440"]) rangeLow = input(title="Range Low", type=input.float, defval=0.0, minval=0.0, maxval=100000.0) rangeHigh = input(title="Range High", type=input.float, defval=100000.0, minval=0.0, maxval=100000.0) showVol = input(title="Show Volume Bars?", type=input.bool, defval=true) // 计算参数 resSeconds = res == "D" ? 86400 : res == "W" ? 604800 : res == "M" ? 2592000 : res == "60" ? 60 : 240 rangeWidth = rangeHigh - rangeLow bars = ceil((time - time[1]) / resSeconds) // 计算成交量 var float vp[] = array.new_float(round(rangeWidth)) for i = 0 to bars - 1 if low[i] >= rangeLow and high[i] <= rangeHigh vpIndex = round(((high[i] + low[i]) / 2 - rangeLow) / rangeWidth * array.size(vp)) vpValue = volume[i] array.set(vp, vpIndex, array.get(vp, vpIndex) + vpValue) // 绘制成交量 var float maxVol = 0.0 for i = 0 to array.size(vp) - 1 maxVol := max(maxVol, array.get(vp, i)) if array.get(vp, i) > 0 and showVol barIndex = (i / array.size(vp)) * rangeWidth + rangeLow barWidth = rangeWidth / array.size(vp) barHeight = array.get(vp, i) / maxVol barColor = barIndex < close ? color.green : color.red barTop = barHeight > 0 and barHeight <= 1 ? barHeight : 1 barBottom = barHeight < 0 and barHeight >= -1 ? -barHeight : 0 plot(barIndex, barTop, style=plot.style_columns, color=barColor, title="Volume Profile") plot(barIndex, barBottom, style=plot.style_columns, color=barColor, title="Volume Profile") ``` 该指标的参数包括: - Resolution:数据的时间分辨率,可以是日线、周线、月线或分钟线。 - Range Low:Volume Profile显示的最低价格范围。 - Range High:Volume Profile显示的最高价格范围。 - Show Volume Bars:是否在图表上显示成交量条。 代码中使用了一个名为vp的数组来存储每个价格段的成交量,然后在循环中计算该数组。计算完毕后,将使用plot函数绘制成交量条,并根据价格是否上涨或下跌来选择颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值