Учитывая то, что воркеры рестартуют каждые 5000 запросов, забивание памяти тут связано (я на 99.9% уверен) с твоим кодом. Сам по себе uWSGI кушает ОЧЕНЬ мало памяти.
Выключен ли DEBUG? При включенном дебаге все SQL запросы остаются в django.db.connection.queries. Если ещё и не оптимизировать N+1 запросы, то на каждый рендер страницы вполне может прийти 500-2000 запросов. Умножая на 5000, получается до 10млн записей. Каждая из них является словарём, который, допустим, занимает 200 байт памяти. Внутри содержится сам SQL, размером, допустим, 80-400 байт и время исполнения.
Итого, если взять по максимуму, каждая запись будет занимать примерно 600 байт * 10млн = 6млрд байт, что примерно равно 5.6гб. На каждый воркер (ведь у тебя каждый воркер — скорее всего процесс, а не тред). Если воркеров штуки 4, получается больше 20гб.
Это один из многих векторов оптимизации.