Alguns comentários sobre sua configuração.
-
MaxSpareThreads e MinSpareThreads devem ser realmente um múltiplo de ThreadsPerChild. Se não for, com algumas combinações de valores, você pode obter o ciclo do Apache entre criar novos processos porque acha que precisa deles e depois decidir o próximo momento para matá-los novamente, porque muda de ideia e os vê como excesso. Então, mude MinSpareThreads para 5.
-
MaxClients diz que pode ter no máximo 20 solicitações simultâneas em todos os processos de trabalho filho do Apache. No entanto, os processos de daemon mod_wsgi aos quais estão fazendo proxy, têm capacidade para manipular 7 * 12 = 84. Portanto, você está sobrecarregado no processo / threads do daemon porque os processos de trabalho filho do Apache nunca poderão passar por mais de 20 solicitações ao mesmo tempo. Uma configuração melhor e uma que usa menos memória é process = 4 e threads = 5.
-
Os StartServers definidos como 20 são altos se você estiver usando o worker MPM. Tecnicamente, os StartServers não podem ser mais do que MaxClients / ThreadsPerChild para o worker MPM. Então, defina StartServers como 2.
-
MaxRequestsPerChild é definido arbitrariamente alto e com sua taxa de transferência de solicitações, você também pode configurá-lo para o padrão normal de 0, o que significa manter os processos em vez de reciclá-los em um número máximo de solicitações. Como o aplicativo da Web Python está sendo executado no modo daemon mod_wsgi, não deve haver a necessidade de reciclar o processo de trabalho filho do Apache de qualquer maneira.
De qualquer forma, é improvável que isso altere seu problema original, mas crie uma configuração mais ideal.