A solução rápida é usar MaxRequestsPerChild (number)
(por exemplo, 10000) para que o Apache reinicie cada trabalhador após várias solicitações. Isso descartará a memória usada quando for reiniciada.
O número de 276m não é o quanto cada processo está usando. Uma explicação dos valores mostrados em 'top' é útil aqui:
VIRT : imagem virtual (kb) A quantidade total de memória virtual usada pela tarefa. Inclui todo o código, dados e bibliotecas compartilhadas, além de páginas que foram trocadas. (se você estiver usando o APC, o espaço de memória usado por ele também será incluído neste valor)
RES : tamanho do residente (kb) A memória física não trocada que uma tarefa usou.
SHR : tamanho do Mem. Compartilhado (kb) A quantidade de memória compartilhada usada por uma tarefa. Ele simplesmente reflete a memória que poderia ser potencialmente compartilhada com outros processos.
Em 'top', você pode adicionar uma coluna 'data' Dados : dados + tamanho da pilha (kb) A quantidade de memória física dedicada a outro código que não seja o executável, também conhecido como tamanho "conjunto de residentes de dados" ou DRS.
Esse valor 'Data' corresponde mais de perto à memória exclusiva usada por esse processo em particular, o que provavelmente não é muito. Somando esses 276M e obtendo um número próximo de 2GB significa que você está contando um monte de coisas.