LINUX.ORG.RU
ФорумAdmin

VPS и ОЗУ


0

4

Арендовал VPS с 1024 мб ОЗУ CentOS На нем работают: Apache с PHP MySQL Postfix & Dovecot & Spamassassin & Clamav

Крутится порядка 35 сайтов и не более 100 почтовых акаунтов с низкой посещаемостью.

Проблема с нехваткой ОЗУ после 10-15 дней аптайма, так как Apache не убивает старых чайлдов, что можно увидеть в выводе mod_status Использую prefork. При попытке использовать worker не работают расширения PHP и вообще при этом уходит вся свободная память. Как бы не менял настройки prefork ничего не меняется. Пробовал включить/выключить KeepAlive Можно ли что-то с ним сделать? Или только nginx proxy?

★★★★★

хостить сайты на шаред-хостинге?

redixin ★★★★
()

На сколько я понимаю модуль prefork держит в памяти готовые обработчики для новых соединений, а модуль worker создает их по пришествию нового клиента, по всей видимости тебе все таки необходим worker.

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

как написано выше, почему-то при включении worker, если забудем про нерабочие модули PHP, забирается вся память...

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

может рестарт апача раз в пару дней - ночью ?
иль надо точнее смотреть - как о тчего и почему нехватает памяти
может апачь/php течет ? вроде как апачевые префорки доолжны завершаться - когда выполнять определенное колво запросов ? не ?

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

в том то и дело что должны...из ситуации так и выхожу...в кроне ежесуточно рестарт апача...как промониторить что и как текет?

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

со значениями игрался по-разному...изменений не замечал... насчет MaxRequestsPerChild обычно советуют ставить побольше...попробую уменьшить до ста..было так:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 10000
</IfModule>

swap на VPS подключить нельзя...пишет, что нет прав

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

написал такой скрипт...может он не совсем точный, но примерно ситуацию просмотреть можно...так вот он показывает, что httpd процессов 17...несмотря на то, что MaxSpareServers 10 разве так должно было быть?

#!/usr/bin/php
<?php
if(isset($_SERVER['argv'][1])){
        if($_SERVER['argv'][1]=='--help'){
                echo "Usage:\r\n".$_SERVER['argv']['0']." [-s=mem|cpu]\r\n";
                die();
        }
}
$top=shell_exec('top -bn 1');
$order=array("\r\n", "\n", "\r");
$top=str_replace($order,'\n',$top);
$r=array();
$r=explode('\n',$top);
$u=count($r);
$k=0;
for($i=7;$i<=$u-3;$i++){
        $procs=str_word_count($r[$i],1,'0123456789.:/_');
        $pid[$k]=$procs[0]*1;
        $user[$k]=trim($procs[1]);
        $cpu[$k]=$procs[8]*1;
        $mem[$k]=$procs[9]*1;
        $name[$k]=trim($procs[11]);
        $k++;
}
$name2=$name;
asort($name2);
$i=0;
foreach($name2 as $key=>$value){
        $apid[$i]=$pid[$key];
        $auser[$i]=$user[$key];
        $acpu[$i]=$cpu[$key];
        $amem[$i]=$mem[$key];
        $aname[$i]=$name[$key];
        $i++;
}
unset($pid,$user,$cpu,$mem,$name,$name2,$i,$k,$procs,$r,$u,$top,$order);
$proces=array();
for($i=0;$i<=count($aname)-1;$i++){
        if(isset($aname[$i+1])){
        if($aname[$i+1]==$aname[$i]){
                $l=$i;
                $cmem=0;
                $ccpu=0;
                while($aname[$i]==$aname[$l]){
                        $cmem=$cmem+$amem[$l];
                        $ccpu=$ccpu+$acpu[$l];
                        $l++;
                }
                $name[$i]=$aname[$i]." (".($l-$i).")";
                $cpu[$i]=$ccpu;
                $mem[$i]=$cmem;
                $pid[$i]=$apid[$i];
                $user[$i]=$auser[$i];
                $i=$l-1;
        }else{
                $name[$i]=$aname[$i];
                $cpu[$i]=$acpu[$i];
                $mem[$i]=$amem[$i];
                $pid[$i]=$apid[$i];
                $user[$i]=$auser[$i];
        }
        }
}
if(isset($_SERVER['argv'][1])){
        switch($_SERVER['argv'][1]){
                case('-s=mem'):$sort=$mem;break;
                case('-s=cpu'):$sort=$cpu;break;
                default:$sort=$mem;
        }
        arsort($sort);
}else{
        $sort=$name;
}
$cnt=$i;
$i=0;
foreach($sort as $key=>$val){
        $proces[$i]['pid']=$pid[$key];
        $proces[$i]['user']=$user[$key];
        $proces[$i]['cpu']=$cpu[$key];
        $proces[$i]['mem']=$mem[$key];
        $proces[$i]['name']=$name[$key];
        $i++;
}
unset($mem,$cpu);
$mem=0;
$cpu=0;
$ucnt=count($proces);
echo "==============================================================================\r\n";
echo "||        PID     ||      USER    ||      CPU     ||      MEM     ||      NAME\r\n";
echo "==============================================================================\r\n";
foreach($proces as $current){
        if(!empty($current)){
                echo "||        ".$current['pid']."     ||      ".$current['user']."    ||      ".$current['cpu']."     ||      ".$current['mem']."     ||      ".$current['name']."\r\n";
                $mem=$mem+$current['mem'];
                $cpu=$cpu+$current['cpu'];
        }
}
echo "==============================================================================\r\n";
echo "Total RAM using: ".$mem."\r\n";
echo "Total CPU using: ".$cpu."\r\n";
echo "Total procesess: ".$cnt."\r\n";
echo "Unique procesess: ".$ucnt."\r\n";
$uptime=shell_exec('uptime');
echo "Uptime: ".trim($uptime)."\r\n";
?>
r0ck3r ★★★★★
() автор топика
Ответ на: комментарий от r0ck3r

если нет прав - значит openvz

MaxRequestsPerChild 10000 - сдаеться у тебя никто стока запросов и невырабатывает - и не завершаеться - поставь поменьше - около пары сотен

ae1234 ★★
()

Выкинь апач и используй nginx либо lighttpd.

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

MaxSpareServers 10


# 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

у тебя поставлено максимально запускать процессов - 256

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

поставил 100...будем смотреть что будет

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

если нет прав - значит openvz

Первое правило выбора хостера - не выбирайте хостера с OpenVZ.

Второе правило выбора хостера - никогда не выбирайте хостера с OpenVZ.

no-dashi ★★★★★
()
Ответ на: комментарий от xpahos

примерно понимаю...хотелось бы таки узнать когда и чем лучше префорк, а когда и чем лучше воркер

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

раз сайты ненагруженные - можешь смело поставить MaxRequestsPerChild 100 и проверить итог.;)

если не помогло - значит у тя какие-то проблемы с ПО апача||php (более вероятно).

если помогло - значит проблемы скорее в php.:-)

а 256 maxclients на гиге - это сильно.;-)

у меня было сильно поменьше.:-)

советую посмотреть размер среднего запущенного потомка апача с php , *2 и разделить полученное число на объём ОЗУ - получишь правильный maxclients. если апач будет жаловаться на его малую величину - значит тебе возможно нужно ещё памяти докупить :-)

но не торопись - проверь что это не монстры типа яндекса с гуглем пришли, они всё сожрут и не поперхнутся, даже maxclients 100500.;-)

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

советую посмотреть размер среднего запущенного потомка апача с php , *2 и разделить полученное число на объём ОЗУ - получишь правильный maxclients. если апач будет жаловаться на его малую величину - значит тебе возможно нужно ещё памяти докупить :-)

Может разделить ^на^ полученное число? если так, то 10..

MaxRequestsPerChild 100 
MaxClients 10

отпишусь о результатах через несколько дней...

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

не забываю, но как бы то ни было, free должен показать занятую только моим VPS память?

r0ck3r ★★★★★
() автор топика

Проблема с нехваткой ОЗУ после 10-15 дней аптайма

В чем выражается нехватка ОЗУ, можно поинтересоваться?

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

ну например в выводе free ну и соответственно не может запуститься yum upgrade, некоторые виртуальные хосты отваливаются, что-то происходит со spamassassin, в результате чего ящики забрасываются спамом

r0ck3r ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

Первое правило выбора хостера - не выбирайте хостера с OpenVZ.
Второе правило выбора хостера - никогда не выбирайте хостера с OpenVZ.

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

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

ещё утечка может быть в php. была в своё время утечка, так что у меня стояло MaxRequestsPerChild 20 несколько дней ;-(

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

видать течет пхп...выставил MaxRequestPerChild 10
вроде стало лучше....когда нагрузка спадает память освобождается

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

ищи утечку! скомбинируй с логами на какие URL заходили

mumpster ★★★★★
()

настрой сайт на работу в режиме fcgi: php, работающий в режиме fcgi убивает воркера после обработки им N запросов (специально, чтоб утечек памяти не бояться)

и замени апач на nginx

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