Tente esta solução (encontrada em outro lugar no Stack ...): link
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:
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.
Tente esta solução (encontrada em outro lugar no Stack ...): link
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.