LINUX.ORG.RU
ФорумAdmin

httpd: page allocation failure

 


0

2

Люди знающие, помогите, пожалуйста:
несколько раз в день возникает ошибка httpd: page allocation failure. На апаче висит 10.000 редкопосещаемых сайтов, по нагрузке справляется. А с памятью что-то не так. Сервер CentOS 32bit, ОЗУ 4GB.

/var/log/messages:
Apr 29 08:42:01 ded kernel:  [<c045e590>] __alloc_pages+0x2bb/0x2cf
Apr 29 08:42:02 ded kernel:  [<c04748f8>] cache_alloc_refill+0x275/0x48a
Apr 29 08:42:02 ded kernel:  [<c0474b75>] __kmalloc+0x68/0x72
Apr 29 08:42:02 ded kernel:  [<c04914b1>] alloc_fd_array+0x14/0x22
Apr 29 08:42:02 ded kernel:  [<c049161c>] expand_files+0xf6/0x300
Apr 29 08:42:02 ded kernel:  [<c042452e>] dup_fd+0x142/0x2d4
Apr 29 08:42:02 ded kernel:  [<c044d0ea>] audit_alloc+0x99/0x169
Apr 29 08:42:02 ded kernel:  [<c04246fd>] copy_files+0x3d/0x54
Apr 29 08:42:02 ded kernel:  [<c0424f94>] copy_process+0x4e9/0x127e
Apr 29 08:42:02 ded kernel:  [<c0436795>] alloc_pid+0x1d3/0x236
Apr 29 08:42:02 ded kernel:  [<c0425f67>] do_fork+0x41/0x168
Apr 29 08:42:02 ded kernel:  [<c040318b>] sys_clone+0x28/0x2d
Apr 29 08:42:02 ded kernel:  [<c0404f9b>] syscall_call+0x7/0xb
Apr 29 08:42:02 ded kernel:  =======================
Apr 29 08:42:02 ded kernel: Mem-info:
Apr 29 08:42:02 ded kernel: DMA per-cpu:
Apr 29 08:42:02 ded kernel: cpu 0 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 0 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 1 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 1 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 2 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 2 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 3 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 3 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 4 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 4 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 5 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 5 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 6 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 6 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 7 hot: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: cpu 7 cold: high 0, batch 1 used:0
Apr 29 08:42:02 ded kernel: DMA32 per-cpu: empty
Apr 29 08:42:02 ded kernel: Normal per-cpu:
Apr 29 08:42:02 ded kernel: cpu 0 hot: high 186, batch 31 used:73
Apr 29 08:42:02 ded kernel: cpu 0 cold: high 62, batch 15 used:51
Apr 29 08:42:02 ded kernel: cpu 1 hot: high 186, batch 31 used:21
Apr 29 08:42:02 ded kernel: cpu 1 cold: high 62, batch 15 used:57
Apr 29 08:42:02 ded kernel: cpu 2 hot: high 186, batch 31 used:2
Apr 29 08:42:02 ded kernel: cpu 2 cold: high 62, batch 15 used:50
Apr 29 08:42:02 ded kernel: cpu 3 hot: high 186, batch 31 used:20
Apr 29 08:42:02 ded kernel: cpu 3 cold: high 62, batch 15 used:0
Apr 29 08:42:02 ded kernel: cpu 4 hot: high 186, batch 31 used:18
Apr 29 08:42:02 ded kernel: cpu 4 cold: high 62, batch 15 used:54
Apr 29 08:42:02 ded kernel: cpu 5 hot: high 186, batch 31 used:4
Apr 29 08:42:02 ded kernel: cpu 5 cold: high 62, batch 15 used:61
Apr 29 08:42:02 ded kernel: cpu 6 hot: high 186, batch 31 used:11
Apr 29 08:42:02 ded kernel: cpu 6 cold: high 62, batch 15 used:7
Apr 29 08:42:02 ded kernel: cpu 7 hot: high 186, batch 31 used:10
Apr 29 08:42:02 ded kernel: cpu 7 cold: high 62, batch 15 used:53
Apr 29 08:42:02 ded kernel: HighMem per-cpu:
Apr 29 08:42:02 ded kernel: cpu 0 hot: high 186, batch 31 used:24
Apr 29 08:42:02 ded kernel: cpu 0 cold: high 62, batch 15 used:0
Apr 29 08:42:02 ded kernel: cpu 1 hot: high 186, batch 31 used:13
Apr 29 08:42:02 ded kernel: cpu 1 cold: high 62, batch 15 used:5
Apr 29 08:42:02 ded kernel: cpu 2 hot: high 186, batch 31 used:18
Apr 29 08:42:02 ded kernel: cpu 2 cold: high 62, batch 15 used:7
Apr 29 08:42:02 ded kernel: cpu 3 hot: high 186, batch 31 used:9
Apr 29 08:42:02 ded kernel: cpu 3 cold: high 62, batch 15 used:3
Apr 29 08:42:02 ded kernel: cpu 4 hot: high 186, batch 31 used:12
Apr 29 08:42:02 ded kernel: cpu 4 cold: high 62, batch 15 used:10
Apr 29 08:42:02 ded kernel: cpu 5 hot: high 186, batch 31 used:19
Apr 29 08:42:02 ded kernel: cpu 5 cold: high 62, batch 15 used:9
Apr 29 08:42:02 ded kernel: cpu 6 hot: high 186, batch 31 used:30
Apr 29 08:42:02 ded kernel: cpu 6 cold: high 62, batch 15 used:8
Apr 29 08:42:02 ded kernel: cpu 7 hot: high 186, batch 31 used:15
Apr 29 08:42:02 ded kernel: cpu 7 cold: high 62, batch 15 used:11
Apr 29 08:42:02 ded kernel: Free pages:     2075632kB (1423252kB HighMem)
Apr 29 08:42:02 ded kernel: Active:366655 inactive:90107 dirty:741 writeback:1 unstable:0 free:518908 slab:26921 mapped-file:4748 mapped-anon:232168 pagetables:28603
Apr 29 08:42:02 ded kernel: DMA free:6484kB min:68kB low:84kB high:100kB active:0kB inactive:0kB present:16384kB pages_scanned:0 all_unreclaimable? yes
Apr 29 08:42:02 ded kernel: lowmem_reserve[]: 0 0 880 5104
Apr 29 08:42:02 ded kernel: DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
Apr 29 08:42:02 ded kernel: lowmem_reserve[]: 0 0 880 5104
Apr 29 08:42:02 ded kernel: Normal free:645896kB min:3756kB low:4692kB high:5632kB active:45616kB inactive:60012kB present:901120kB pages_scanned:0 all_unreclaimable? no
Apr 29 08:42:02 ded kernel: lowmem_reserve[]: 0 0 0 33792
Apr 29 08:42:02 ded kernel: HighMem free:1423252kB min:512kB low:5020kB high:9532kB active:1421004kB inactive:300416kB present:4325376kB pages_scanned:0 all_unreclaimable? no
Apr 29 08:42:02 ded kernel: lowmem_reserve[]: 0 0 0 0
Apr 29 08:42:02 ded kernel: DMA: 137*4kB 124*8kB 97*16kB 64*32kB 21*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 6484kB
Apr 29 08:42:02 ded kernel: DMA32: empty
Apr 29 08:42:02 ded kernel: Normal: 25682*4kB 22352*8kB 12660*16kB 4062*32kB 495*64kB 1*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 645896kB
Apr 29 08:42:02 ded kernel: HighMem: 48581*4kB 77802*8kB 29093*16kB 4063*32kB 138*64kB 15*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1423252kB
Apr 29 08:42:02 ded kernel: 242933 pagecache pages
Apr 29 08:42:02 ded kernel: Swap cache: add 871329, delete 852203, find 66471967/66535621, race 0+73
Apr 29 08:42:02 ded kernel: Free swap  = 3695056kB
Apr 29 08:42:02 ded kernel: Total swap = 4192956kB
Apr 29 08:42:02 ded kernel: Free swap:       3695056kB
Apr 29 08:42:02 ded kernel: 1310720 pages of RAM
Apr 29 08:42:02 ded kernel: 1081344 pages of HIGHMEM
Apr 29 08:42:02 ded kernel: 276021 reserved pages
Apr 29 08:42:02 ded kernel: 11033774 pages shared
Apr 29 08:42:02 ded kernel: 19126 pages swap cached
Apr 29 08:42:02 ded kernel: 741 pages dirty
Apr 29 08:42:02 ded kernel: 1 pages writeback
Apr 29 08:42:02 ded kernel: 4748 pages mapped
Apr 29 08:42:02 ded kernel: 26921 pages slab
Apr 29 08:42:02 ded kernel: 28603 pages pagetables

в httpd.conf прописал:
<IfModule prefork.c>
StartServers       8
MinSpareServers    20
MaxSpareServers    25
ServerLimit       100
MaxClients        100
MaxRequestsPerChild  500
</IfModule>

при старте процессы апача съедают 500МБ и во время работы эти особо не растут:
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1903 apache    15   0  541m 450m 4512 S  0.0 11.1   0:09.32 /usr/sbin/httpd
 1902 apache    22   0  540m 449m 4296 S  0.0 11.1   0:16.19 /usr/sbin/httpd
....

Не многовато ли серверов в httpd.conf для 4 Гбайт ОЗУ? Система сможет работать при ″echo 2 > /proc/sys/vm/overcommit_memory″?

mky ★★★★★
()
Ответ на: комментарий от mky

согласен, многовато, но поменять что-либо не могу. с таким overcommit апач не запускается:

# echo 2 > /proc/sys/vm/overcommit_memory
# /etc/init.d/httpd restart
-bash: fork: Cannot allocate memory

anonymous
()
Ответ на: комментарий от anonymous

Добавляйте ещё swap'а, допустим ещё 4 Гбайт. Если существующий swap на разделе, а новый будет в файле, то делайте его менее приоритетным, но заставьте систему работать при overcommit_memory = 2. Тогда аллокатор в ядре работает как-то по другому и меньше вероятность того, что ядро не найдёт свободную страницу, когда она внезапно понадобится апачу.

Хотя, более правильно, если нужно столько экземпляров апача, менять железо на 64 битное и с большим количеством ОЗУ.

mky ★★★★★
()

Ставьте nginx + php-fpm (ну или апач на php-fpm переводите если с рерайтами лень заморачиваться). Ну и MinSpareServers уменьшите...

NiTr0 ★★★★★
()
Последнее исправление: NiTr0 (всего исправлений: 1)
Ответ на: комментарий от mky

спасибо, вроде, помогло. Почти сутки работает. Но сейчас другая проблема вылезла - периодически mod_php выдает PHP Warning: exec(): Unable to fork. Памяти, по идее, достаточно:

             total       used       free     shared    buffers     cached
Mem:       4138796    3573596     565200          0     230644    1663336
-/+ buffers/cache:    1679616    2459180
Swap:      8387252     490588    7896664
Причем этот скрипт использует совсем мало памяти. Другие, более прожорливые, работают нормально. Проблема только с fork'ом.

zempf
() автор топика
Ответ на: комментарий от NiTr0

спасибо за совет. Перейти на nginx не могу, всё сильно привязано к апачу. Почитал про php-fpm и задумался - на сайтах РНР используется редко, около 1% запросов. Если отказаться от mod_php в пользу fastcgi или php-fpm, можно же сократить потребление памяти? И не совсем понял - получится ли перейти с mod_php на php-fpm, сохранив все настройки php.ini? Т.е. надо только перекомпилировать PHP и подправить httpd.conf или есть еще какие-то особенности?

zempf
() автор топика
Ответ на: комментарий от zempf

Не знаю, как это получить из php, но у системного вызова fork() есть код ошибки errno. В случае fork() может быть EAGAIN и ENOMEM.

В первом случае (EAGAIN) это, либо лимиты на число процессов на пользователя (ulimit), либо какие-то лимиты внутри ядра, допустим ″/proc/sys/kernel/threads-max″.

mky ★★★★★
()
Ответ на: комментарий от zempf

Да, потребление памяти резко падает. Причина банальна: апач - помойка, воркер процесс обрабатывает и статику и пхп, а для пхп утечки памяти - милое дело (от чего и лимит на кол-во выполненных воркером запросов, после которого он пришибается и стартует новый).

Итог: concurrent connections - большое, кол-во воркеров - большое, каждый воркер жрет метров по 600 памяти...

php-fpm - пхп воркеров можно сделать немного (по кол-ву ядер к примеру, может - несколько больше). И памяти кушать будут меньше. Запросы к ним будут становиться в очередь.

php.ini - ну да, сохранится, только для php-fpm может быть другое имя файла (как и для cgi-варианта пыха).

NiTr0 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.