LinuxForum.Fans
Тема

VPS и ОЗУ

Автор: r0ck3r 15 сообщений 3113 просмотров
#215594

Доброго времени суток!
Ситуация следующая:
Раньше арендовал VPS с 512 ОЗУ и все было хорошо, а теперь переехал к другому провайдеру VPS, у которого ОЗУ 1024 МБ.
Перенес конфиги Apache, Postfix, Dovecot, Spamassassin и пр.
Возникла проблема нехватки ОЗУ (!!!) хотя, на новом VPS ее должно было хватить в два раза больше.
Вывод free

text

             total       used       free     shared    buffers     cached
Mem:       1048576     810316     238260          0          0          0
-/+ buffers/cache:     810316     238260
Swap:            0          0          0

Вопрос следующий. Есть ли возможность узнать суммарное использование ОЗУ процессами, а не по отдельности как top/ps/htop, то есть сколько всего жрет httpd, mysqld, spamd, clamd ну и так далее. Именно суммарно.

#215608
r0ck3r написал:
Mem: 1048576 810316 238260 0 0 0

используется 800Mb свободно 200Mb. Через vmstat посмотри информацию, она будет статичная, в отличии top/htop.

#215615

i2ks, а как же кешь?
[console][xlin@ldap ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 104 31780 15320 857376 0 0 111 88 60 79 7 2 90 1 0
[/console]
[console][root@domain ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 353092 14156 82064 0 0 1 0 5 5 0 0 100 0 0[/console]
[console]xlin@smb:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 4272 76384 81344 200624 0 0 5 4 17 7 0 0 100 0[/console]
[console][root@ser1 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 116 27988 178004 57632 0 0 27 41 16 6 0 0 99 0 0
[/console]

#215625

Дело в том, что вывод free я показал на момент рестарта системы...работая примерно сутки, отжирается все...даже не могу подключиться по ssh ибо не хватает памяти. Что и как разобрался бы сам, главное узнать как получить информацию об общем потреблении ОЗУ каждой программой. Например, процессов httpd я вижу много и каждый из-них по 1-2%, а хотелось бы видеть 1 httpd и все, что расходуют процессы с таким же именем

#215627
r0ck3r написал:
Дело в том, что вывод free я показал на момент рестарта системы...работая примерно сутки, отжирается все...даже не могу подключиться по ssh ибо не хватает памяти. Что и как разобрался бы сам, главное узнать как получить информацию об общем потреблении ОЗУ каждой программой. Например, процессов httpd я вижу много и каждый из-них по 1-2%, а хотелось бы видеть 1 httpd и все, что расходуют процессы с таким же именем

swap добавь = RAM или 2xRAM, и посмотри что у тебя там происходит.

#215631
i2ks написал:
[quote=r0ck3r]Дело в том, что вывод free я показал на момент рестарта системы...работая примерно сутки, отжирается все...даже не могу подключиться по ssh ибо не хватает памяти. Что и как разобрался бы сам, главное узнать как получить информацию об общем потреблении ОЗУ каждой программой. Например, процессов httpd я вижу много и каждый из-них по 1-2%, а хотелось бы видеть 1 httpd и все, что расходуют процессы с таким же именем

swap добавь = RAM или 2xRAM, и посмотри что у тебя там происходит.[/quote]

дело в том, что VPS на OpenVZ не поддерживает swap. Там OpenVZ имеет какие-то проблемы с этим, мол swap относится к ядру хост-системы и гостевые системы не могут им оперировать...ну что-то в этом роде.
Где-то читал, что x86_64 приложения жадны до оперативки. Это так? Может мне поставить мускуль и апач с пхп 32-х битные? Но все-таки, хотелось бы видеть кто создает эту проблему

#215632

r0ck3r, у меня подозрение то что spam* ест память. А что за дистрибутив у вас?

#215634

[console]
[r0ck3r@hosting ~]$ top -bn 1 | grep spam*
1603 root 18 0 237m 52m 3068 S 0.0 5.1 0:20.58 spamd
1604 root 18 0 237m 50m 656 S 0.0 4.9 0:00.00 spamd
1606 root 18 0 237m 50m 656 S 0.0 4.9 0:00.00 spamd
1710 root 15 0 237m 52m 3076 S 0.0 5.1 0:22.91 spamd
23914 root 16 0 240m 55m 2772 S 0.0 5.4 0:00.91 spamd
29788 root 16 0 242m 56m 2644 S 0.0 5.5 0:00.41 spamd
[r0ck3r@hosting ~]$
[/console]

Дистрибутив CentOS 6. Тоже были подозрения на spamd, но как показывают наблюдения, он держится в своих пределах.
Больше думаю на httpd и MySQL

#215636

r0ck3r, mysql можно ограничить потребление памятью с помощью конфигов. А вот httpd кол-вом запросов к нему и не более того. Надо тестировать =)

#215640
i2ks написал:
r0ck3r, mysql можно ограничить потребление памятью с помощью конфигов. А вот httpd кол-вом запросов к нему и не более того. Надо тестировать =)

Согласен..необходимые настройки, я вроде выполнил, но результата не вижу...поэтому, как я отписал в первом сообщении, хотелось бы найти аналог htop, но который показал бы, не кучу одноименных процессов с маленькими значениями потребления памяти, а один и сколько все хавают систему эти процессы.
Например:
Вместо
[console]
[r0ck3r@hosting ~]$ top -bn 1 | grep spamd
1603 root 15 0 237m 52m 3068 S 0.0 5.1 0:20.65 spamd
1604 root 18 0 237m 50m 656 S 0.0 4.9 0:00.00 spamd
1606 root 18 0 237m 50m 656 S 0.0 4.9 0:00.00 spamd
1710 root 18 0 237m 52m 3076 S 0.0 5.1 0:22.99 spamd
23914 root 15 0 240m 55m 2772 S 0.0 5.4 0:00.91 spamd
29788 root 15 0 242m 56m 2644 S 0.0 5.5 0:00.41 spamd
[/console]

Хотелось бы видеть что-то вроде
[console]
1603 root 15 0 237m 309m 3068 S 0.0 30.9 0:20.65 spamd
[/console]

И так по каждому процессу..Чтобы точно знать кто где гадит

#215641

Если нет готового решения, то прийдется писать свой парсер вывода top -bn 1
А писать нормально могу только на PHP...значит буду мучаться....

#215644
r0ck3r написал:
Если нет готового решения, то прийдется писать свой парсер вывода top -bn 1
А писать нормально могу только на PHP...значит буду мучаться....

как вариант ёто php_cli или bash еще лучше python =)

#215664
i2ks написал:
[quote=r0ck3r]Если нет готового решения, то прийдется писать свой парсер вывода top -bn 1
А писать нормально могу только на PHP...значит буду мучаться....

как вариант ёто php_cli или bash еще лучше python =)[/quote]

напишу скрипт - скину ссылку

#215954

Вот, склепал что-то на коленке:

text

#!/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";
?>
#216509

r0ck3r, отжор бОльшего кол-ва ОЗУ- это нормально, это архитектура системы такая. Рекомендую на досуге почитать про то, как ядро х86 и х86_64 работают с оперативкой. Это жеж не винда, тут зполненость оперативки под завязку еще ничего не значит, важнее LA.
Еще одним фактором может быть кол-во впсов на рэйд-массив. Вполне может не хватать ширины ввода на запись, в отличие от предыдущего хостинг-оператора, у которого ферма могла быть разгружена. Посмотрите в сторону процессов апача и скорости обработки мускульных запросов. Заббикс и скрипты Вам в помощь, хотя проблемы выявляются и без мониторинга, чисто визуально, show full processlist;

Войдите или зарегистрируйтесь, чтобы ответить.