sync.Pool的在web framework中的使用疑问

来源:1-16 辅导 + 案例分析 + 答疑

拧壶冲

2021-07-03 15:21:27

http://img.mukewang.com/climg/60e00e65094f2b0b14760742.jpg

在研究chi的源码,正好学习下sync.Pool的使用方法。

  1. 一个请求到来,到返回响应,我们整个生命周期内都是使用pool中创建的,context,但是我们79行,创建了,就马上把它给reset了呢?不是应该88行的serverHttp执行完了再执行,reset,再put回pool吗?

  2. 这样cache,我还是没有太理解为什么这样的方式可以减小GC的压力?只是缓存而已啊?pool的这种设计是如何达到减少GC的效果的?​

写回答

1回答

Xargin

2021-07-03

  1. 一个请求到来,到返回响应,我们整个生命周期内都是使用pool中创建的,context,但是我们79行,创建了,就马上把它给reset了呢?不是应该88行的serverHttp执行完了再执行,reset,再put回pool吗?

    1. 使用 pool 的时候,一定会有 reset 操作,但 reset 放在 Put 之前;或者 Get 之后,都是可以的,只要保证 reset 过就可以

  2. 这样cache,我还是没有太理解为什么这样的方式可以减小GC的压力?只是缓存而已啊?pool的这种设计是如何达到减少GC的效果的?

    1. 使用 pool 时,当请求的 qps 稳定后,对象都是从 pool 里拿的,并且不会生成新的对象,对象总数取决于于当前活跃的请求数。

    2. 不使用 pool 时,每个请求都会创建新的 object,这些 object 在请求结束后直接变成了垃圾,相比使用 pool 会不停地创建更多对象,这样 GC 要负责扫描对象(比使用 pool 创建的对象数量更多),同时要负责回收所有变成垃圾的对象(所有新创建的对象都变成了垃圾,要 sweep 的垃圾也比使用 pool 的时候多)。

这个结论可以通过 CPU 火焰图来验证的


0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程