Como evitar que o Apache consuma muita RAM

0

Estou executando um servidor http baseado no ubuntu 16.04. A aplicação é baseada no django (python) que é conectado ao apache via mod-wsgi.

Quando eu emito um comando que consome grandes quantidades de RAM, o sistema fica paralisado, em vez de matar o processo de fuga. Eu esperaria que ele matasse o processo ofensivo.

Esta é minha top output (após o reinício do apache):

top - 17:34:31 up 27 days, 23:47,  1 user,  load average: 7.90, 10.82, 10.23
Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.0 us,  3.3 sy,  0.0 ni, 83.4 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  992.379 total,  194.777 free,  249.852 used,  547.750 buff/cache
MiB Swap:    0.000 total,    0.000 free,    0.000 used.  164.383 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
11242 www-data  20   0  0.955g 0.064g 0.013g S  8.6  6.6   0:25.16 apache2
11016 root      20   0  0.352g 0.021g 0.004g S  1.3  2.1   0:09.78 python3
11184 www-data  20   0  0.953g 0.063g 0.013g S  0.7  6.5   0:16.99 apache2
  836 postgres  20   0  0.725g 0.308g 0.306g S  0.3 31.8 104:07.87 postgres
10810 root      20   0  0.000g 0.000g 0.000g S  0.3  0.0   0:00.04 kworker/u2:0
11183 www-data  20   0  0.956g 0.070g 0.013g S  0.3  7.2   0:55.98 apache2
11981 mars      20   0  0.040g 0.004g 0.003g R  0.3  0.4   0:00.36 top
18977 postgres  20   0  0.733g 0.017g 0.014g S  0.3  1.7   0:00.01 postgres
    1 root      20   0  0.177g 0.004g 0.003g S  0.0  0.5   1:36.65 systemd

E isso quando a coisa toda entrar em colapso:

top - 17:38:46 up 27 days, 23:52,  1 user,  load average: 1.99, 5.04, 7.91

Tasks: 148 total,   1 running, 147 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.3 us, 19.8 sy,  0.0 ni,  0.0 id, 73.5 wa,  0.0 hi,  2.4 si,  0.0 st
MiB Mem :  992.379 total,   61.977 free,  439.453 used,  490.949 buff/cache
MiB Swap:    0.000 total,    0.000 free,    0.000 used.    3.473 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
   29 root      20   0    0.0m   0.0m   0.0m S 13.4  0.0  54:35.96 kswapd0
11242 www-data  20   0 1094.5m 216.5m   0.0m S  2.5 21.8   1:10.18 apache2
11183 www-data  20   0  979.4m  59.2m   0.0m S  1.6  6.0   1:01.84 apache2
11184 www-data  20   0  976.2m  51.9m   0.0m S  1.6  5.2   0:24.32 apache2
11016 root      20   0  360.8m  16.9m   0.0m D  0.8  1.7   0:12.06 python3
20916 root      20   0   92.1m   1.0m   0.0m S  0.5  0.1   0:00.07 sshd
21033 postgres  20   0  749.9m   4.2m   2.2m D  0.5  0.4   0:00.02 postgres
  633 root      20   0   36.1m   6.3m   0.0m S  0.3  0.6   5:14.55 systemd-journal
19988 mars      20   0   41.5m   0.6m   0.0m R  0.3  0.1   0:00.24 top
20837 postgres  20   0  751.0m   8.4m   3.7m S  0.3  0.8   0:00.02 postgres
20838 postgres  20   0  751.0m   8.5m   3.7m S  0.3  0.9   0:00.02 postgres
20943 postgres  20   0  751.0m   7.0m   4.2m S  0.3  0.7   0:00.01 postgres
20956 postgres  20   0  751.0m   6.3m   3.5m S  0.3  0.6   0:00.02 postgres
21034 postgres  20   0  749.9m   4.3m   2.3m D  0.3  0.4   0:00.01 postgres
    1 root      20   0  180.9m   1.9m   0.0m S  0.0  0.2   1:36.66 systemd

Se eu entendi corretamente, é a coluna "RESident" que deve ser de interesse para mim.

No entanto, mesmo quando todo o sistema for interrompido, eu somaria essa coluna a algo em torno de 400MB, o que está longe de 1GB.

Como obviamente não é a quantidade de RAM consumida, minhas perguntas:

  1. Como prevenir o Apache SEMPRE mesmo tendo muita RAM (vamos apenas matar o processo em tal caso)
  2. Por que praticamente todos os serviços (apache, postgres, python) consomem muita memória VIRTUAL, mesmo depois de serem iniciados?

Eu comecei a pesquisar ulimit e cgroups, mas honestamente eu não acho que eles sejam a abordagem certa para o meu problema: é uma instância (apache) que enlouquece e eu gostaria de simplesmente matar aquela instância, nem tudo ao redor também.

    
por velis 21.11.2016 / 17:46

2 respostas

1

Tente esta solução (encontrada em outro lugar no Stack ...): link

    
por 27.11.2016 / 10:29
2

Se o seu servidor apache exibir páginas php, você pode tentar o php-fpm. Com o php-fpm, seu servidor será muito mais eficiente.

Com esta configuração, o RAM pode ser consumido por php-fpm.

    
por 21.11.2016 / 20:27