Как я могу заставить программу Go использовать больше памяти?Это рекомендуется? - PullRequest
0 голосов
/ 01 октября 2018

Я ищу вариант, похожий на -Xmx в Java, то есть для назначения максимальной оперативной памяти, которую может использовать мое приложение Go.Проверял время выполнения , но не совсем, если это так.

Я пытался установить что-то подобное с помощью func SetMaxStack (), (вероятно, очень глупо)

debug.SetMaxStack(5000000000) // bytes
model.ExcelCreator()

Причина, по которой я пытаюсь это сделать, заключается в том, что в настоящее время доступно достаточно ОЗУ, но приложение не потребляет более 4-6%, я могу ошибаться, но это может заставить GC произойтигораздо быстрее, чем нужно, что приводит к проблемам с производительностью.

Что я делаю

Получение большого набора данных из системы RDBMS, обработка его для записи в excel.

Еще одна причина, почемуЯ ищу такой вариант, чтобы ограничить максимальное использование оперативной памяти на сервере, где она будет в конечном итоге развернута.

1 Ответ

0 голосов
/ 01 октября 2018

Текущая стабильная версия Go (1.10) имеет только одну ручку, которую можно использовать для обмена памяти с целью более низкой загрузки ЦП сборщиком мусора, выполняемым средой выполнения Go.Эта ручка называется GOGC, а ее описание гласит:

Переменная GOGC устанавливает начальный процент целевого сбора мусора.Коллекция запускается, когда отношение вновь распределенных данных к оперативным данным, остающимся после предыдущего сбора, достигает этого процента.По умолчанию GOGC=100.Установка GOGC=off полностью отключает сборщик мусора.Функция SetGCPercent пакета runtime/debug позволяет изменять этот процент во время выполнения.См. https://golang.org/pkg/runtime/debug/#SetGCPercent.

Так что, в основном, установка его на 200 предположительно удвоит объем памяти, который может использовать среда выполнения Go вашего рабочего процесса.

Сказав, что я быобратите внимание, что среда выполнения Go на самом деле пытается настроить поведение своего сборщика мусора в соответствии с рабочей нагрузкой выполняемой программы и мощностью процессора под рукой.Я имею в виду, что обычно в вашей программе нет ничего плохого в том, что она не потребляет много оперативной памяти - если сборщик удаляет мусор достаточно быстро, без существенного снижения производительности, я не вижу причин для беспокойства: GC Go является одним източки самой интенсивной тонкой настройки во время выполнения и работают очень хорошо на самом деле.

Следовательно, вы можете попытаться выбрать другой маршрут:

  • Распределение памяти профиля вашей программы.Проанализируйте профиль и постарайтесь выяснить, где находятся «горячие точки» и можно ли (и как) их оптимизировать.

    Вы можете начать с здесь и продолжить с gazillion других вступления к этому материалу.

  • Оптимизация.Как правило, это означает, что определенные буферы можно повторно использовать в разных вызовах одной и той же функции (ей), потребляющих их, предварительно выделяя фрагменты вместо их постепенного увеличения, используя sync.Pool, где это считается полезным и т. Д.

    Такие меры могут фактически увеличитьдействительно используемая память (то есть живыми объектами, а не мусором), но это может снизить нагрузку на ГХ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...