Эта тема на forum.dklab.ru


vg2k: Производительность , хранение данных (БД/файл)
Требуется хранить данные поступающие ежеминутно по тысячи раз и более (в теории). Данные эти должны где-то складироваться и раз в несколько минут вся очередь, набравшаяся во временной базе, будет обрабатываться и переноситься в основное хранилище(в теории БД MySQL).

Главный вопрос : где временно все данные складировать ? Для интереса провел тест(денвер на Celeron 2.6, жестак немного тормозной) какова разница в производительности при заносе данных в текстовик и в БД. Ниже привел два моих исытательных скрипта... в результате моих проб получилось что в текстовик все заноситься порядка 22-23 секунд, а в БД вообще затыкается где-то на 2 000-ой попытке и дольше напорядок выполняется.

Варинат с текстовым файлом :

<?
echo 'START<br>';

$st = time();

$d = 1;

while($d<10000)
{
echo $d.'<br>';
$f = fopen('file.txt','a+');
fwrite($f,' |> '.date('H').':'.date('i').':'.date('s').chr(10));
fclose($f);
$d++;
}

$end = time();

echo 'st='.$st.'     end='.$end.'     TOTAL='.($end-$st);
?>


Вариант с БД

<?
echo 'START<br>';

$st = time();

$d = 1;

while($d<10000)
{
echo $d.'<br>';
$con = mysql_connect('localhost','root','');
mysql_select_db('timetest',$con);
mysql_query("INSERT INTO `test`(`id`,`t1`,`t2`,`t3`) VALUES ('',".date('H').",".date('i').",".date('s').")");
mysql_close($con);
$d++;
}

$end = time();

echo 'st='.$st.'     end='.$end.'     TOTAL='.($end-$st);
?>

vg2k:
Еще слышал о существовании Shared Memory у PHP. Такой вариант может быть более производительнее( ведь ничего не "закрывается" и не "открывается", вся временная БД постоянно в оперативе висит?) или это безнадежно ?
vg2k:
Сейчас попробывал вот такую фишку с расшаряной памятью shmop. Результат того же сприпта приятно удивил время выолнения было 0-1 секунда ;)
Кстати, я вообще тестю все это дело правильно, али бессмыслицей занимаюсь ?


<?
echo 'START<br>';

$st = time();

// Create 100 byte shared memory block with system id if 0xff3
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if (!$shm_id) {
echo "Couldn't create shared memory segment\n";
}

$d = 1;

while($d<10000)
{
echo $d.'<br>';
// Lets write a test string into shared memory
$shm_bytes_written = shmop_write($shm_id, "my shared memory block", 0);
if ($shm_bytes_written != strlen("my shared memory block")) {
echo "Couldn't write the entire length of data\n";
}

$d++;
}

$end = time();

echo 'st='.$st.'     end='.$end.'     TOTAL='.($end-$st);

//Now lets delete the block and close the shared memory segment
if (!shmop_delete($shm_id)) {
echo "Couldn't mark shared memory block for deletion.";
}
shmop_close($shm_id);

?>

ExHealer:
Мне кажется все можно КАРДИНАЛЬНО ускорить


<?
echo 'START<br>';

$st = time();

$d = 1;

$_h = date('H');
$_i = date('i');
$_s = date('s');

$con = mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'timetest', $con );
while($d<10000)
{
echo $d . '<br>';
mysql_query( "INSERT INTO `test`(`t1`,`t2`,`t3`) VALUES (" . $_h . "," . $_i . "," . $_s . ")" );
$d++;
}
mysql_close($con);

$end = time();

echo 'st='.$st.' end='.$end.' TOTAL='.($end-$st);
?>



у меня это выполняется за 5 микросекунд
Anonymous:
ExHealer , гы... понимаешь, уважаемый софорумец, я , как мне кажется, достаточно полно описал ситуацию. Запросы будут приходить множество раз в секунду и каждый запрос - это отдельный вызов скрипта. А , следовательно, коннект к БД будет новый.
Как вариант, но это уже отдельный разговор, мона писать приложение(демона) которое будет иметь постоянный коннект к базе и получать данные запросов от скрипта. Но опять же скрипт в любом случае будет находится на жестком диске и сервак каждый раз его поновому будет запускать, когда браузер пользователя встретит код типа <img src="http://someserver.ru/megapic.ext"> и будет ее грузить.
Или какой выход мона найти ? Ведь через сокеты в таком случае решить что-то будет невозможно, ибо порт-то 80-ый(http-шный)...забит.
_vg2k_:
Карочь, это гость - это я ,vg2k. Просто не со своего компа сейчас.
Юрий Насретдинов:
Запросы будут приходить множество раз в секунду и каждый запрос - это отдельный вызов скрипта.
Если это «множество» больше 20, забудьте про использование PHP.
ExHealer:
В там случае вариант один -- демон.
Anonymous:
забыть про пхп, тогда на чем писать ? Perl по возможностям сильнее, однако, в данном случае прибыли в производитльности существенной не даст , как я понимаю.

Демон ?
1. На каком языке ?
2. Как передавать данные демону ? В своем пред посте я привел пример вызова картинки... как это обстоятельство обойти ?
ExHealer:
Как всегда на С/C++.
Можно еще в сторону модулей для Апача посмотреть.
_vg2k_:
Допустим, я реализую демон на Си. Однако, то же самое можно написать и на PHP - аналогичного демона, пускай и медленнее работающего. Никто случаем не знает насколько медленее будет сокетный вариант пхп-шный работать ? А то тесты проводить пока руки не дойдут, да ведь это еще и на си это чудо реализовывать для этого нуна - что у меня много времени займет.

Основной камень, даже стена, заключается в обращении к этому демону. Как это реализовать ? Мне пока приходит в голову такое решение :
1. На сабдомене типа sub.myserver.ru повесить этот демон.
2. Каким-то макаром настроить сервер(если такое мона) дабы именно для этого сабдомена все запросы на http-порт обрабатывал на Апач, а этот демон.
Т.е. при запросе браузера пользователя , пытающего грузить, к примеру, <IFRAME src="http://sub.myserver.ru/page.html"></IFRAME> обрабатывать запрос на сервере будет не апач, а самописный демон. Много от него не требуется, лишь получить запрос и вернуть в качестве page.html некий текст. Хотя, в любом случае этим демоном прейдеться эмулировать(не знаю насколько сложно) работу http-протокола т.е. научить общаться на этом "языке" демона + добавить нужные фичи.
Anonymous:
Ах, касательно модулей.... в моем варианте получится демона как модуль апача писать нельзя ? Ибо модулю не удастся перехватывать запрос, али как там обстоит дело ? Я в этом месте малопросвящен(напрашиваюсь на ликбез).
_vg2k:
<......>

Сненс хоть последний пост (ибо остальные от гостя - воэтому не могу) .... обиделся т.к. народ не проявляет желания помочь.
Дмитрий Котеров:
Да нет, почему. Если скрипт совсем простенький и только складывает данные в файл, сразу же завершаясь, думаю, он около сотни запросов в секунду выдержит на хорошем хостинге.
Антон Макаренко:
http://ua2.php.net/manual/ru/features.persistent-connections.php
Если PHP установлен как модуль Apache, можно попробовать постоянные соединения.


Дмитрию Кóтерову:
Допустим, в таблице БД хранится навигационное меню сайта, которое каждый раз при обращении к скрипту вытягивается из БД.
Повысится ли производительность, если создавать сессию и записывать туда эти данные при первом обращении, а при последующих уже не коннектиться к БД?
IMHO, это один из вариантов облегчения нагрузки, когда PHP установлен как CGI-оболочка. Вы как считаете?

Дмитрий Котеров:
Оффтопик - в отдельной теме.

Эта тема на forum.dklab.ru