12.成为 Go 优化专家

  1. 1.重写和优化如何抉择?肯定不是上来就重写把,最近重写同事代码,本来是做拆库拆表的优化来着
  2. 2.fmt.Sprintf(“%s”, v) 会比 %v 好点吗?和字符串拼接比呢?
  3. 3._pad的那个优化,是不是针对多个线程需要更新一个结构体内不同的字段有效,如果一个线程同时更新整个结构体,是不是就没啥意义了?
  4. 4.系统中在文件导入模型,或者模型导出文件时候会不同结构体间赋值,这样对对内存好像有压力,有什么解决方法么?
  5. 5.一般是第三方接口出现问题,怎么保护自己的服务?请老师推荐具体可落地的方案。
  6. 6.做benchmark时,那些io如何模拟呢?使用mock?
  7. 7.api压测发现cpu抖动,一会60%一会90%多,是因为压测流量来时建立大量socket连接消耗cpu?之后交由I/O处理比如数据库读写?想问下api压测流程哪些消耗cpu的(socket连接什么的),哪些流程看iops、内存等。
  8. 8.[工具推荐]websockt方面的有没有好的压测工具推荐?比如建立websocket连接维度的压测,再比如基于已经建立的websocket连接做数据维度的压测。
  9. 9.问个简单的问题,有没有什么书或文章,讲pprof文件的,生成的图不太会看。
  10. 10.sync.pool为啥会导致CPU上升?
  11. 11.老师确实无法make太大的slice,https://github.com/golang/go/issues/38673
  12. 12.一个连接一读一写,一个连接又读又写有啥区别
  13. 13.goroutine初始栈空间2kb,最大好像1GB?它现在以及未来只占栈内存吗?都在栈上的话GC从来不回收Goroutine?好像之前讲过都存在某个obj里。
  14. 14.项目之前发生过大量的goroutine gopark导致OOm进而被Linux Kernel kill的情况,8GB RAM,栈初始值2KB,2KB10001000*4=8GB,是不是最多四百万goroutine?为什么当时我们看PProf好像几千万个Goroutine了,怎么能超过了这个RAM容量限制?
  15. 15.bytes.buffer 和 strings.Builder怎么选型?
  16. 16.线上项目decimal的处理profile和alloc都比较大,有对它的使用建议吗?
  17. 17.所谓的压测工具没去了解过,怎么能契合项目的业务逻辑去做QPS或TPS压测呢?压测工具怎么针对gRPC做压测能具体指点下吗?
  18. 18.LMAX Disruptor老师能简单讲解下吗?Go有相关成功实践吗?
  19. 19.多大QPS/TPS在业内算比较可以了?虽然一般只要符合司内业务需求就好

1.重写和优化如何抉择?肯定不是上来就重写把,最近重写同事代码,本来是做拆库拆表的优化来着

  • 能优化尽量优化
  • 重写还需要兼顾需求开发,双线作战很难的

2.fmt.Sprintf(“%s”, v) 会比 %v 好点吗?和字符串拼接比呢?

  • benchmark 一下就知道

3._pad的那个优化,是不是针对多个线程需要更新一个结构体内不同的字段有效,如果一个线程同时更新整个结构体,是不是就没啥意义了?

  • 是的,这个优化主要是针对一个结构体或者数组内的元素被多线程更新才有的问题

4.系统中在文件导入模型,或者模型导出文件时候会不同结构体间赋值,这样对对内存好像有压力,有什么解决方法么?

  • 机器学习的场景么?不是,电子表格
  • 得针对你的场景做具体分析了。。。。

5.一般是第三方接口出现问题,怎么保护自己的服务?请老师推荐具体可落地的方案。

  • 对外部调用必须有超时
  • 超时,一般在大公司有 SLA 承诺,按承诺设超时就行
  • 熔断

6.做benchmark时,那些io如何模拟呢?使用mock?

  • time.Sleep
  • 不要做 mock,直接做压测更好~

7.api压测发现cpu抖动,一会60%一会90%多,是因为压测流量来时建立大量socket连接消耗cpu?之后交由I/O处理比如数据库读写?想问下api压测流程哪些消耗cpu的(socket连接什么的),哪些流程看iops、内存等。

  • holmes 工具,在 CPU 使用非常高的时候 dump cpu profile
  • io 方面的应该你们公司内部监控系统能看到
  • rss 在监控系统里,Go prometheus client
  • pprof

8.[工具推荐]websockt方面的有没有好的压测工具推荐?比如建立websocket连接维度的压测,再比如基于已经建立的websocket连接做数据维度的压测。

  • Google 一下
  • 好多也有自研的,建几万条连接,按一定的包大小模拟真实场景

9.问个简单的问题,有没有什么书或文章,讲pprof文件的,生成的图不太会看。

10.sync.pool为啥会导致CPU上升?

  • atomic 操作
  • 无锁算法

11.老师确实无法make太大的slice,https://github.com/golang/go/issues/38673

12.一个连接一读一写,一个连接又读又写有啥区别

  • tcp reader goroutine/ writer goroutine ===> http 标准库应该就是这样的

13.goroutine初始栈空间2kb,最大好像1GB?它现在以及未来只占栈内存吗?都在栈上的话GC从来不回收Goroutine?好像之前讲过都存在某个obj里。

  • goroutine 主要就是栈内存 ===> stack_inuse_bytes

14.项目之前发生过大量的goroutine gopark导致OOm进而被Linux Kernel kill的情况,8GB RAM,栈初始值2KB,2KB10001000*4=8GB,是不是最多四百万goroutine?为什么当时我们看PProf好像几千万个Goroutine了,怎么能超过了这个RAM容量限制?

  • swap
  • 感觉这个我也不太确定。。。

15.bytes.buffer 和 strings.Builder怎么选型?

  • 默认情况下,哪个 API 好用,用哪个
  • 需要优化,做 benchmark 改就行了

16.线上项目decimal的处理profile和alloc都比较大,有对它的使用建议吗?

  • 没代码不太好分析。。。

17.所谓的压测工具没去了解过,怎么能契合项目的业务逻辑去做QPS或TPS压测呢?压测工具怎么针对gRPC做压测能具体指点下吗?

  • 单接口压测
    • 固定 qps 压测 ====> 性能目标 4000 不崩,那至少能压到 6000,这时候找工具来做 API 压测就行
    • 极限 qps 压测
  • 复杂服务必须要指望全链路压测

18.LMAX Disruptor老师能简单讲解下吗?Go有相关成功实践吗?

  • ringbuffer atomic 无锁算法

19.多大QPS/TPS在业内算比较可以了?虽然一般只要符合司内业务需求就好

  • 做媒体和静态内容,ugc,qps 很高
  • o2o、生活服务这种 qps 不高
  • 内部的后端系统有一些有读写放大的,qps 很高,有些几十万的都有

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com

×

喜欢就点赞,疼爱就打赏