apache, oom (overcommit)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

distress
Сообщения: 84
ОС: RHEL5

apache, oom

Сообщение distress »

Приветствую. Суть такова: хочу включить глобальное ограничени на использоание памяти, в т.ч. и апачем.
Нектороые параметры сервера:
RAM 4GB
swap отсутствует
штатное использование памяти < 1GB

root@server

# uname -a Linux server 2.6.18-194.17.1.el5 #1 SMP Mon Sep 20 07:12:06 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux # rpm -qa | fgrep 'httpd-2' httpd-2.2.3-43.el5_5.3 # free total used free shared buffers cached Mem: 4047628 2537524 1510104 0 418412 1462932 -/+ buffers/cache: 656180 3391448 Swap: 0 0 0


мне понадобятся параметры overcommit_memory и overcommit_ratio:

# man 5 proc
.................
/proc/sys/vm/overcommit_memory
This file contains the kernel virtual memory accounting mode.
Values are:

0: heuristic overcommit (this is the default)
1: always overcommit, never check
2: always check, never overcommit

In mode 0, calls of mmap(2) with MAP_NORESERVE are not checked,
and the default check is very weak, leading to the risk of get‐
ting a process "OOM-killed". Under Linux 2.4 any nonzero value
implies mode 1. In mode 2 (available since Linux 2.6), the
total virtual address space on the system is limited to (SS +
RAM*(r/100)), where SS is the size of the swap space, and RAM is
the size of the physical memory, and r is the contents of the
file /proc/sys/vm/overcommit_ratio.

.........

проверяю параметры

root@server

# sysctl vm.overcommit_memory vm.overcommit_memory = 0 # sysctl vm.overcommit_ratio vm.overcommit_ratio = 95


выключаю возможность превышения памяти.

root@server

sysctl vm.overcommit_memory=2 vm.overcommit_memory = 2


и сразу же получаю в error_log апача с интервалом в несколько секунд:

Код: Выделить всё

...
[Wed Dec 08 12:43:29 2010] [error] [client xx.xx.xx.xx] (12)Cannot allocate memory: couldn't create child process: 12: index.cgi
[Wed Dec 08 12:43:29 2010] [error] [client xx.xx.xx.xx] (12)Cannot allocate memory: couldn't spawn child process: /var/www/cgi-local/index.cgi
...

Любая программа на сервере запускается через раз ссылаясь на отсутствие свободной памяти.
Все ошибки как бы намекают, что процессы не могут получить память, хотя свободно >3GB, а vm.overcommit_ratio = 95 должно разрешить использование до 3.8GB из 4х (95% от всей памяти).
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: apache, oom

Сообщение KiWi »

Сами же написали:
This file contains the kernel virtual memory accounting mode.


Если посмотреть man top, то можно найти:
VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It
includes all code, data and shared libraries plus pages that
have been swapped out and pages that have been mapped but not
used.


Проще говоря, потребление виртуальной памяти практически всегда больше, чем потребление реальной физической памяти. А при overcommit_memory -- ограничивается виртуальная память на основе доступной физической.

Вот, например:
2880 www-data 20 0 6494m 163m 2184 S 0 0.7 11:12.49 java

Выделенное -- виртуальная и физическая память, соответственно.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: apache, oom

Сообщение distress »

спасибо, я всё понял.
KiWi писал(а):
09.12.2010 00:20
А при overcommit_memory -- ограничивается виртуальная память на основе доступной физической.

как-то проглядел этот момент. :unsure:

у всех процессов апача виртуальная память ~350mb.

Код: Выделить всё

apache   18645  0.0  1.6 345540 64852 ?        S    04:03   0:00 /usr/sbin/httpd
apache   18646  0.1  1.6 345828 66488 ?        S    04:03   0:01 /usr/sbin/httpd


если ограничивать на уровне системы, а не апача, php.ini и т.д. это значит, что мой выбор limits.conf и вот этот параметр?
$ man limits.conf
...
<item>
...
as
address space limit (KB)
...

Спасибо сказали:
neol
Сообщения: 600
ОС: Debian Stable

Re: apache, oom

Сообщение neol »

distress писал(а):
08.12.2010 23:26
хочу включить глобальное ограничени на использоание памяти, в т.ч. и апачем.

Зачем?
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: apache, oom

Сообщение distress »

neol писал(а):
09.12.2010 12:58
Зачем?

Чтобы сервер не завис если вдруг кто-то решит съесть всю память. Чтобы oom-killer случайно не пристрелил что-то важное.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: apache, oom

Сообщение KiWi »

distress писал(а):
09.12.2010 14:59
neol писал(а):
09.12.2010 12:58
Зачем?

Чтобы сервер не завис если вдруг кто-то решит съесть всю память. Чтобы oom-killer случайно не пристрелил что-то важное.

Чтобы OOM не пристрелил что-то важное(в общем случае -- это только sshd), можно сделать sshd неубиваемым OOMом.

В остальных случаях -- OOM прекрасно поубивает ненужное.
А так самый правильный вариант -- написать скрипт, который будет смотреть на RSS, и штатными средствами перезапускать сервис, потому что неизвестно как поведёт себя приложение в случае невозможности выделения памяти.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: apache, oom

Сообщение distress »

KiWi писал(а):
09.12.2010 15:10
В остальных случаях -- OOM прекрасно поубивает ненужное.

Он честно пытается убивать ненужное, но ,похоже, это не помогает. По rsyslog приходят сообщения типа

Код: Выделить всё

Dec  8 00:46:10 kernel: httpd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0
Dec  8 00:46:10 kernel:
Dec  8 00:46:10 kernel: Call Trace:
Dec  8 00:46:10 kernel: [<ffffffff800c71a5>] out_of_memory+0x8e/0x2f3
Dec  8 00:46:10 kernel: [<ffffffff8000f540>] __alloc_pages+0x27f/0x308
Dec  8 00:46:10 kernel: [<ffffffff80012f11>] __do_page_cache_readahead+0x96/0x179
Dec  8 00:46:10 kernel: [<ffffffff800138c9>] filemap_nopage+0x14c/0x360
Dec  8 00:46:10 kernel: [<ffffffff8000895e>] __handle_mm_fault+0x1fb/0x1039
Dec  8 00:46:10 kernel: [<ffffffff8000c6be>] _atomic_dec_and_lock+0x39/0x57
Dec  8 00:46:10 kernel: [<ffffffff80066b55>] do_page_fault+0x4cb/0x874
Dec  8 00:46:10 kernel: [<ffffffff8005dde9>] error_exit+0x0/0x84
Dec  8 00:46:10 kernel:

, но сервер уже не отвечает.

KiWi писал(а):
09.12.2010 15:10
А так самый правильный вариант -- написать скрипт, который будет смотреть на RSS, и штатными средствами перезапускать сервис, потому что неизвестно как поведёт себя приложение в случае невозможности выделения памяти.


уже второй день спасает вот этот скрипт. сделал как временное решение пока не найду возможность ограничить память как-то иначе.

Код: Выделить всё

while :; do if [ $(free -m | fgrep "buffers/cache" | sed "s/\s\+/ /g" | cut -d" " -f 4) -lt 400 ]; then echo -n "X";killall -9 httpd; logger -p local6.emerg -t server_out_of_memory "httpd restart"; sleep 20; service httpd start; else echo -n "."; fi; sleep 3; done

Каждые 3 секунды проверяет не стало ли свободной памяти меньше 400мб.

Спасибо сказали:
neol
Сообщения: 600
ОС: Debian Stable

Re: apache, oom

Сообщение neol »

distress писал(а):
09.12.2010 14:59
Чтобы сервер не завис если вдруг кто-то решит съесть всю память.

А почему кто-то пытается съесть всю память?

PS Я не просто задаю глупые вопросы, а пытаюсь подтолкнуть к исправлению причины вместо борьбы со следствиями.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: apache, oom

Сообщение distress »

neol писал(а):
09.12.2010 17:08
А почему кто-то пытается съесть всю память?

На сервере 1000+ perl- и php- скриптов самым старым из которых лет 10, самые новые - вчерашние. Некоторые из них присутствуют в crontab. Вот память и кушается апачем или просто интерпретаторами запустившими скрипт. Кроме того, есть еще программа на Cи не самая отлаженная - постоянно истекает памятью. И вобще много всякого там есть - хотел быть готовым ко всему (поставить глобальное ограничение).

neol писал(а):
09.12.2010 17:08
PS Я не просто задаю глупые вопросы, а пытаюсь подтолкнуть к исправлению причины вместо борьбы со следствиями.

Быстро эти причины не исправить, особенно если сервер умирает периодически. Поэтому я решил хотя бы с последствиями справиться для начала, а там видно будет.
Спасибо сказали: