ngx_pfree() вызывать не нужно, так как он умеет освобождать только
большие куски памяти. По окончании запроса вся память, выделенная из
r->pool,
освобождается. А ngx_pfree() используется, например, в gzip-фильтре
по окончании сжатия для освобождения буферов, выделенных для zlib.
Это около 100-300К, и их можно освободить, чтобы не занимать эту память
во время передачи ответа клиенту.
А memory leak скорее всего в generate_top_banner() - там нужно
всю память выделять через ngx_palloc(r->pool, ...).
Проблемка вся в том, что утечка была и в случае двух статичных
баннеров... то есть когда в верхнем буфере тоже было memory = 1 и не
было temporary = 1.
Как бы проверить, куда оно память девает....
Есть ли в коде вызвовы malloc()/calloc() или ngx_alloc()/ngx_calloc() ?
1-й вызов выделяет память под топ-баннер и она освобождается после
обработки запроса.
2-й и 3-й вызовы - выделение буферов для баннеров.
4-й и 5-й - это, соответственное, создание конфигурации и выделение
массива с информацией о баннерах (внутри ngx_http_banner_create_conf).
последнее - это отправка пакета статистики демону статистики и для него
даже pfree есть.
Погляжу-ка я повнимательнее на то, как меняется загрузка памяти... может
оно до определенного уровня растет и потом останавливается...