Тип доклада: Доклад

Снижаем нагрузку на Garbage Collector и ускоряем работу с памятью, используя sync.Pool там, где это уместно

  • Доклад на русском языке

Как-то я работал над приложением, которое испытывало пиковые нагрузки при получении новых данных и не успевало поставить их в централизованную обработку. Или делало это слишком медленно. По привычке я начал профилировать приложение в надежде вычислить time-critical участки кода. Но быстро выяснил, что дело было не в какой-то медленной функции. Во время пиковых нагрузок всегда зачем-то приходил garbage collector и всё притормаживал. 

Расскажу, какие подходы попробовал, чтобы уменьшить влияние GC на ход выполнения задачи, приведу результаты бенчмарков для разных размеров буферов данных и объясню, почему остановился на sync.Pool для решения задачи обработки 1К+ сообщений в секунду. В частности, обсудим: 

  • как настроить порог срабатывания GC и какие плюсы и минусы это несет; 
  • как организовать пул предопределенного размера с помощью буферизованного канала и когда это решение не работает; 
  • особенности использования sync.Pool и когда не следует возвращать данные в пул, а также как запретить GC очищать выделенную память.

Спикеры

Приглашенные эксперты

Расписание