Перестали "убиваться" запросы apache (Sending Reply)

T7
На сайте с 12.01.2005
Offline
197
6292

Есть сервак i7-920, 8Gb RAM.

Стоит Ubuntu, Apache/2.2.12, PHP/5.2.10+XCache и MySQL.

Общая посещаемость сайтов на серваке около 50к уник. Из них половина - крупный форум на IPB

Для отдачи картинок стоит nginx.

В последнее время сервак стал виснуть, то nginx ошибку выдает (кажется 504), то вообще не откликается по http, приходится по SSH заходить и ребутить. Раньше такого не наблюдал, с серваком в последнее время ничего не делал, разве что XCache изменил немнго настройки

Заметил, что в server-status "висит" много запросов к одному скрипту search.php:

В общем то сам скрипт представляет из себя поиск по сайту через сервис xml.yandex

Строка кода:


@ $fp = fsockopen("xmlsearch.yandex.ru", 80, $err, $err, 10);
if ($fp){
$n = "\r\n";
$request_header = 'POST /xmlsearch?user=******************* HTTP/1.0'.$n.
'Host: xmlsearch.yandex.ru'.$n.
'Content-Type: text/plain'.$n.
'Content-Length: '.strlen($request).$n.$n;

$request = $request_header.$request;

fputs($fp, $request);

while(!feof($fp)) $xml_respose .= fgets($fp, 128);
fclose($fp);
}
..................
Дальше идет разбор ответа

Таймаут 10 сек есть в скрипте.

В терминале команда htop:

Видно также, что процессы висят длительное время и не уничтожаются.

Фрагмент apache2.conf:


Timeout 300
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 30

##
## Server-Pool Size Regulation (MPM specific)
##

ServerLimit 100

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 100
MaxRequestsPerChild 0
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 100
MaxRequestsPerChild 0
</IfModule>

# event MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_event_module>
StartServers 2
MaxClients 100
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>


В php.ini директива max_execution_time = 30;

tolik777 добавил 10.12.2011 в 09:53

Конфиг XCache на всякий случай:


# configuration for php Xcache module

[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php5/20060613+lfs/xcache.so

[xcache.admin]
xcache.admin.enable_auth = On
# Configure this to use admin pages
xcache.admin.user = "****"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = "****"

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 128M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 8
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0

; same as aboves but for variable cache
xcache.var_size = 32M
xcache.var_count = 8
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"


; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory = ""

; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager = Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""
L
На сайте с 07.07.2008
Offline
89
#1

как совет, измените код

while(!feof($fp)) $xml_respose .= fgets($fp, 128); 

на

    
while (($buffer = fgets($fp, 4096)) !== false) {
$xml_respose = $buffer;
}

feof - часто глючит и не видит конец

T7
На сайте с 12.01.2005
Offline
197
#2

Спасибо. Код поменял. Мониторю, посмотрим как повлияет

pupseg
На сайте с 14.05.2010
Offline
347
#3

в вебсервере KeepAlive Off

Timeout 50 - по идее должно хватить.

ну это для начала.

и

<IfModule mpm_prefork_module>

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 100

MaxRequestsPerChild 0

</IfModule>

на что то в этом духе, ну и так же мониторить:

<IfModule mpm_prefork_module>

StartServers 10

MinSpareServers 10

MaxSpareServers 20

ServerLimit 500

MaxClients 500

MaxRequestsPerChild 0

</IfModule>

еще б на nginx.conf взглянуть бы.

Качественная помощь в обслуживании серверов. (/ru/forum/661100) Бесплатных консультаций не даю, не помогаю, не обучаю. Минималка от 100$. Как пропатчить KDE-просьба не спрашивать. Есть форумы (http://linux.org.ru) и полезные сайты (http://www.opennet.ru/).
A
На сайте с 03.06.2011
Offline
29
#4

Поставьте

MaxRequestsPerChild 1024

и перезапустите apache

T7
На сайте с 12.01.2005
Offline
197
#5
еще б на nginx.conf взглянуть бы.

Вот:

user www-data;

worker_processes 2;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
client_max_body_size 50m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;

gzip on;
gzip_proxied any;
gzip_min_length 1024;
gzip_http_version 1.0;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Andreyka
На сайте с 19.02.2005
Offline
822
#6

Я бы демонизировал поиск, и на скриптах дергающих API демона предусмотрел таймаут

Ну или системными лимитами огородить это дело

Не стоит плодить сущности без необходимости
C
На сайте с 11.01.2010
Offline
45
#7

немного не в тему, но все же може т быть полезно:

gzip off для картинок у Вас стоит?

M
На сайте с 16.09.2009
Offline
278
#8
Caviar:
gzip off для картинок у Вас стоит?

Болезный, ты читать умеешь?

tolik777:
Вот

Наверно, подразумевали таки весь конфиг nginx. Вместе с содержимым include.

pupseg:
в вебсервере KeepAlive Off

Там nginx перед апачем - эта настройка бессмысленна.

pupseg:

на что то в этом духе, ну и так же мониторить:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 500
MaxClients 500
MaxRequestsPerChild 0
</IfModule>

Разжуйте на кой хрен столько апачей. Только ради того, чтобы залезть в своп лишний раз - или вам просто цифири круглые нравятся?

ТС - ограничьте поиск, начните с этого.

Абонементное сопровождение серверов (Debian) Отправить личное сообщение (), написать письмо ().
T7
На сайте с 12.01.2005
Offline
197
#9
Наверно, подразумевали таки весь конфиг nginx. Вместе с содержимым include.

Вот конфиг одного из сайтов (основного):

server {

listen 80;
server_name www.site.ru site.ru;
access_log /var/log/nginx.access_log;
location ~* \.(jpg|jpeg|gif|png|css|js|zip|rar|doc|pdf|swf|ico)$ {
root /home/siteru/public_html/;
index index.html index.php;
access_log off;
expires 30d;
}
location ~ /\.ht {
deny all;
}
location / {
proxy_pass http://127.0.0.1:81/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
proxy_set_header Range "";
}
}

P.S. У Янжекс.XML что-то с поиском, видимо сломался, пока что эффект от изменений прверить не могу, жду пока починят.

[Удален]
#10

потерто....

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий