Оптимизация GO-фронтенда на примере. Как мы это делаем в Lazada.
1 of 38
Download to read offline
More Related Content
Профайлинг.
1. Hong Kong Indonesia Malasya Philippines Russia Singapore Thailand Vietnam
Профайлинг.
Оптимизация GO-фронтенда на примере. Как мы это делаем в Lazada.
Никита Романов
21. Pprof + Callgrind + objdump (binutils)
Вывод: Debug как и любую ошибку стоит выводить по
условию. Форматированный вывод = аллокация.
Решение: Избегать ненужных логирований, не
использовать форматирующие методы там где можно
обойтись без них..
21
22. • Пустой тип (с нулевой длинной) переданный в interface{} не
аллоцируется.
• Для map m типа map[string]T и []byte b, m[string(b)] не вызовет
аллокации. (временная string копия слайса байт не делается)
• Так же, аллокаций не произойдет если выполнить range по []byte(s) от
string
• Escape анализ
• Function inlining - только короткие и простые функции могут быть
“заинлайнены”. Функция должна содержать менее 40 выражений и не
содержать вызова функций, циклов, лейблов, замыканий, паник,
восстановлений, селектов, свитчей, и т.д.
Оптимизации в GO
https://github.com/golang/go/wiki/CompilerOptimizations 22
26. • sync.Pool
• Позволяет сократить количество аллокаций за счет
переиспользования объектов.
• atomic.Values
• Реализация copy-on-write
Sync, Atomic
26
28. Было:
result := strings.Split(key.Str, “;”)
key.Set = result[0]
key.Pk = result[1]
Еще мелочи
Стало:
if index := strings.Index(key.Str, sep); index >= 0
{
key.Set = key.Str[:index]
key.Pk = key.Str[index+1:]
}
28
29. Результат
- 50 % memory usage
- 30 % CPU
+ ~1000 RPS во время стрессов
29
30. Результат
- 50 % memory usage
- 30 % CPU
+ ~1000 RPS во время стрессов
30
31. Результат
- 50 % memory usage
- 30 % CPU
+ ~1000 RPS во время стрессов
31
32. Результат
- 50 % memory usage
- 30 % CPU
+ ~1000 RPS во время стрессов
32
33. • Новая реализация ничего не аллоцирует
• После реализации тротлинга (уже тестируется) накладные расходы
стремятся к минимальным значениям (+20% к значениям без неё)
Metrics
33
36. Еще одна оптимизация от GO.
Non-scannable objects
type Key [64]byte // SHA-512 hash
type Value struct {
Name [32]byte
Balance uint64
Timestamp int64
}
m := make(map[Key]Value, 1e8)
Что дальше?
https://github.com/golang/go/wiki/CompilerOptimizations 36