Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Невидимые ошибки Go-разработчика – Артём Картасов

Невидимые ошибки Go-разработчика – Артём Картасов

GopherCon Russia

March 28, 2020
Tweet

More Decks by GopherCon Russia

Other Decks in Programming

Transcript

  1. Обо мне • инженер в Postgres.ai • контрибьютор в open-source

    • ментор и наставник образовательных проектов по разработке на Go 2
  2. Зачем этот доклад и для кого? • поделиться опытом •

    рассмотреть распространенные ошибки • развеять мифы 3
  3. В чём особенность ошибок? • не видны на первый взгляд

    • тесты успешно проходят • проявляются с течением времени 9
  4. В чём особенность ошибок? • не видны на первый взгляд

    • тесты успешно проходят • проявляются с течением времени • проявляются на больших масштабах 10
  5. Масштаб имеет значение Утилизация CPU в одной из точек присутствия

    Cloudflare 11 https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/
  6. А что же будет ? 14 ************* ********* ********** *******

    ************** ********* * ******** ********* ********
  7. Профилирование. Vegeta echo "GET http://localhost:6060" | vegeta attack -rate 250

    -duration=30s | vegeta report Requests [total, rate, throughput] 7500, 250.03, 250.00 Duration [total, attack, wait] 30.000460044s, 29.995965447s, 4.494597ms Latencies [mean, 50, 95, 99, max] 4.50337ms, 4.51515ms, 4.912763ms, 5.463ms, 28.8979ms Bytes In [total, mean] 37500, 5.00 Bytes Out [total, mean] 0, 0.00 Success [ratio] 100.00% Status Codes [code:count] 200:7500 Error Set: 27 https://github.com/tsenart/vegeta
  8. Неоптимальные аллокации. Итоги • используйте знания о данных • профилирование

    * • continuous profiling ** ◦ https://github.com/profefe/profefe ◦ https://github.com/segmentio/pprof-server ◦ https://github.com/conprof/conprof 38 * если есть сомнения ** если сомнений нет
  9. Незакрытые ресурсы • file, err := os.Open("file.go") • response, err

    := http.Get("https://example.com/") • rows, err := db.Query(query) • ticker := time.NewTicker(duration) 43
  10. Незакрытые ресурсы. Как не забыть? • бдительность ◦ code review

    ◦ linters ◦ finalizers • мониторинг 49 https://medium.com/a-journey-with-go/go-finalizers-786df8e17687
  11. Незакрытые ресурсы. Как не забыть? • бдительность ◦ code review

    ◦ linters ◦ finalizers • мониторинг 52 https://crawshaw.io/blog/tragedy-of-finalizers
  12. Незакрытые ресурсы. Как не забыть? • бдительность ◦ code review

    ◦ linters ◦ finalizers • мониторинг ◦ https://github.com/prometheus/prometheus ◦ https://github.com/google/gops 53
  13. Как ускорить? • IO-bound • concurrency is not parallelism 61

    https://twitter.com/olivier_poitrey/status/779953044066676737
  14. Почему очень много горутин не хорошо? • открытые сетевые соединения

    * • перерасход памяти • замедление сборки мусора 65
  15. Блокировка горутин • получение из пустого канала • получение из

    nil-канала • отправка в полный канал • отправка в nil-канал 82
  16. Обнаружение утекающих горутин • пакет runtime: ◦ runtime.NumGoroutine() ◦ debug.Stack()

    ◦ pprof ▪ pprof.Lookup("goroutine") ▪ net/http/pprof/ • метрики ◦ https://prometheus.io/ 87
  17. Обнаружение утекающих горутин • пакет runtime: ◦ runtime.NumGoroutine() ◦ debug.Stack()

    ◦ pprof ▪ pprof.Lookup("goroutine") ▪ net/http/pprof/ • метрики ◦ https://prometheus.io/ • обнаружение при тестировании: ◦ https://github.com/uber-go/goleak ◦ https://github.com/fortytw2/leaktest 88
  18. Утекающие горутины. Выводы • иметь контроль над goroutine ◦ https://golang.org/pkg/context/

    • следить за запущенными goroutine ◦ runtime ◦ github.com/prometheus/client_golang/prometheus/promhttp 93
  19. Утекающие горутины. Выводы • иметь контроль над goroutine ◦ https://golang.org/pkg/context/

    • следить за запущенными goroutine ◦ runtime ◦ github.com/prometheus/client_golang/prometheus/promhttp • тестировать во время разработки ◦ github.com/fortytw2/leaktest ◦ github.com/uber-go/goleak 94
  20. 96

  21. Итоги • Go не такой простой, как кажется • проверять

    как можно ближе к реальным профилям нагрузки ◦ мелочей не бывает* 98
  22. Итоги • Go не такой простой, как кажется • проверять

    как можно ближе к реальным профилям нагрузки ◦ мелочей не бывает* • готовы выявлять и предотвращать проблемы ◦ практический опыт ◦ автоматическая детекция 99
  23. Полезные ссылки • William Kennedy - Macro View of Map

    Internals In Go • Vladimir Varankin - Continuous Profiling and Go • go101 - Memory Leaking Scenarios • Jacob Walker - Goroutine Leaks 100