Почему приложение на Go постепенно потребляет все больше и больше оперативки?
Проследите за количеством горутин. Возможно, где-то они у вас неявно создаются и зависают на чтении из канала, например, в который вы забыли записать или который забыли закрыть.
Это можно сделать с помощью модуля runtime, получая значение runtime.NumGoroutine
Количество процессов обычно берется из количества ядер, поэтому у вас их запускается 6. Упрощенно говоря, рантайм go раскидывает между этими процессами горутины на выполнение.
Функциям sendPush(), preparesendPush()вы передаете apns.Clientв качестве параметра. Go всегда передает параметры 'copy_by_value', то есть создается и передается копия client при каждом вызове. apns.Client // contains filtered or unexported fields, то есть неизвестно что копируется и насколько оно поддается мусорщику. Попробуйте передавать  один и тот же client ссылкой func prepareSendingPush(client *apns.Client), func sendPush(client *apns.Client...вызывая prepareSendingPush(&c)