Pilat

Рейтинг
250
Регистрация
08.03.2007
netwind:
Например, поиск в этой строке символа, которого нет изначально через функцию index. Иначе перл просто оперирует с указателями на блок ( вот это однозначно ляп)

Вот в этом я не уверен - я специально вывел номера читаемых блоков, и номера не мгновенно выводятся, как можно было бы ожидать при указателях. К тому же мне надо минимизировать загрузку процессора, чтобы отловить обращение к свопу. В общем, я немного доделал скрипт, и на моей машине он отлавливает обращение к swap.

#!/usr/bin/perl

use strict;
use Time::HiRes qw ( time);
sub getMemInfo{
my %mem;
open IN, '</proc/meminfo'||die($!);
while(<IN>){
chomp;
my ($name, $val) = split /\s*:\s*/;
$mem{$name} = $val;
}
close IN;
return @mem{qw{MemTotal MemFree}};
}

$|=1;
my @a;
my $allocated=0;
print STDERR "Usage: perl test-mem.pl [blocksize, default 50==50Mb]\n";
my $blocksize=shift || 50;
my $testcount = 10; # number of block to read
my $timeout;#auto-calculate
my $speed; # block read speed
my $prec = 1.5;
foreach my $i(1..1024){
print "Pass $i\n";
my $time = time();
push @a, '1' x ($blocksize*1024*1024);
$allocated += $blocksize;
my $s;
my $time2 = time();
foreach (1..$testcount){
my $bn = int(rand($i));
my $time_start = time();
$s = $a[$bn]; # read data - from swap slow!
my $time_end = time();
print $bn , ($time_end-$time_start > $speed*$prec)?'s ' : ' ' if defined $speed;
#my $n = index($s,'2');
}
my $dt = time()-$time;
unless( defined $timeout){
$timeout = $dt*2;
$speed = (time()-$time2) / $testcount;
}
my ($MemTotal, $MemFree) = getMemInfo();
my $MemAllocated = $MemTotal - $MemFree;
print sprintf("\nalloc %d Mb, used %d kb, %.1f sec\n", $allocated, $MemAllocated/1024, $dt);
if( $dt > $timeout ){
print "Slow memory allocation\n";
last;
}
undef $s;

}

Pilat добавил 15.03.2009 в 15:55

LineHost:
Видимо да. Но скорее всего то, что это не способ проверять качество VPS. Не память на данный момент проблема, а другие ресурсы.
А качество видно просто по первому заходу по SSH, а перед заказом - по цене ;)

Ну вообще да, видно - только надо же знать что является нормой, а что отклонением. Моя же цель - понять сколько памяти. Например, мой vps показал, что из 2407124k памяти только 1900 попадает в реальную (я и на HN это отслеживал, так что результат правильный), остальное идёт в своп, и это хорошо заметно по падению скорости.

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

Хорошо, вот другой скрипт. Читается 10 случайных блоков, таймаут выбирается как удвоенное время первого прохода. Вообще результата можно ждать только на нагруженной ноде, где реально используется своп - если до этого ещё не дошло, VM получают реальную память. То есть можно детектировать оверселлинг только если он есть. Скрипт возник по мотивам /ru/forum/327715 - чтобы в подобных случаях отлавливать использование свопа.

#!/usr/bin/perl

use strict;

sub getMemInfo{
my %mem;
open IN, '</proc/meminfo'||die($!);
while(<IN>){
chomp;
my ($name, $val) = split /\s*:\s*/;
$mem{$name} = $val;
}
close IN;
return @mem{qw{MemTotal MemFree}};
}

$|=1;
my @a;
my $allocated=0;
print STDERR "Usage: perl test-mem.pl [blocksize, default 50==50Mb]";
my $blocksize=shift || 50;
my $timeout;#auto-calculate
foreach my $i(1..1024){
print "Pass $i\n";
my $time = time();
push @a, '1' x ($blocksize*1024*1024);
$allocated += $blocksize;
my $s;
foreach (1..10){
my $bn = int(rand($i));
print " $bn ";
$s = $a[$bn]; # read data - from swap slow!
}
my $dt = time()-$time;
$timeout = $dt*2 unless defined $timeout;
print "\n",join "\t", "$allocated Mb", getMemInfo(), "$dt sec", "\n";
if( $dt > $timeout ){
print "Slow memory allocation\n";
last;
}
undef $s;

}

netwind:
Кажется, лучше будет постоянное случайное чтение из всего массива, чтобы поддерживать в памяти весь массив. Первые элементы могут в своп уйти, а вы читате только последних 10.

и use Time::HiRes; он в стандартной поставке в нормальных дистрибутивах.

Да, что именно читать - это большой вопрос. Я и над случайным чтением думал, и над чтением нескольких случайных блоков данных, но там возникает элемент случайности. Идея в том, чтобы уловить момент попадания в своп первых же блоков. В идеале надо рисовать график, чтобы не вычислять производительность системы.

Time::HiRes использовать смысла нет - из-за случайных посторонних нагрузок на систему я 5 секунд выбрал, там миллисекундная точность не поможет.

Pilat добавил 15.03.2009 в 11:35

LineHost:
1800 MbOut of memory! когда на ноде изпользуется всего лишь 2 ГБ из 8 :)

И что этот результат значит? Наверно, что память вся реальная ?

newseditor:
Да, хостер так и говорит, что из-за превышения лимита памяти. На скрипт не грешу, так как на нем работает еще с десяток сайтов и с ними нет таких проблем.

Вот в сети нашел такое решение для автоудаления файлов

<?php

//DELL core.1234
system("rm -f /home/djx/core.*")
?>


Скажите, это поможет? И как его использовать?

Поможет как мёртвому припарки :) Лечить надо болезнь. И не создание core файлов причина падения производительности.

Для удаления файлов incron был бы тут уместней, я думаю (если он там работает) - http://inotify.aiken.cz/?section=incron&page=about

Если есть возможность, так же можно сделать вызов ulimit или limit при старте апача (к примеру) - с соответствующими опциями они подавят создание core файлов вообще.

Есть такой пакет rssh - хорошая альтернатива полному запрету ssh:

rssh is a restricted shell for providing limited access to a host via ssh(1), allowing a user whose shell is configured to rssh to use one or more
of the command(s) scp(1), sftp(1) cvs(1), rdist(1), and rsync(1), and only those commands. It is intended primarily to work with OpenSSH (see
http://www.openssh.com), but may work with other implementations.

The system administrator should install the shell on the restricted system. Then the password file entry of any user for whom it is desireable to
provide restricted access should be edited, such that their shell is rssh. For example:

luser:x:666:666::/home/luser:/usr/bin/rssh

newseditor:
Есть виртуальный хостинг, пользуюсь давно, все устраивает. Но один из сайтов, как они говорят, создает нагрузку на сервер в результате чего создаются файлы core, каждый весом в 7-8 метров. Вчера отключили весь аккаунт из-за этого. Есть ли решение этой проблемы? Может есть скрипт, который удаляет по крону такие файлы? Просветите, люди знающие. Предложения о хостинге не нужны.

core файлы создаются в момент краха приложения и содержат кучу информации, по которой можно понять что случилось. Их можно просто не создавать, но это должен сделать хостер. Так что не нагрузка является причиной, а что-то другое.Ну разве что ресурсов на сервере не хватает (памяти например).

А к текущему разделу какое это имеет отношение?

LineHost:
Я вот ни как не могу понять тех, которые хостёров меняют как перчатки. Это просто показатель того, что человек сам не знает что ему надо или заведомо покупает то, что уже с самого начала не подходит.

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

Так что хостер-то сказал?

bergen:
что за "нода" ?

нода - это всё что угодно. В данном случае подозрения падают на Hardware Node - то, что запускает VPS'ки (OpenVZ или Virtuozzo) . Возможно, там огромное количество виртуальной памяти и мало реальной, поэтому Ваш гигабайт на 90 процентов лежит на диске, отсюда и тормоза при свободном процессоре, память постоянно из свопа подкачивается. Вопрос - к хостеру.

ЗЫ

Глупая идея пришла в голову. Посмотрите

cat /proc/user_beancounters

хотя это лучше смотреть, опять же, на hardware node

Всего: 2890