Странный эффект "биглока" в php

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Странный эффект "биглока" в php

Anton Maksimenkov-2
18 ноября 2010 г. 16:52 пользователь Andrey N. Oktyabrski
<[hidden email]> написал:
>> На какой процесс и где? "Количества" для апача я не трогал - по
>> умолчанию. Для моих 10 человек не должно быть никаких проблем.
> ulimit, login.conf
> Лимиты на количество открытых файлов (оно же и для сокетов, насколько я
> помню).
> Или pf.conf

ulimit - ну то что там по дефолту (у меня "-current" полумесячной
давности). апач работает от www, тоже что там по дефолту, то и есть.
Только лишь для Postgres'а заведёт "свой" login-класс на 768
openfiles.

в pf.conf присутствует строчка:
pass in log inet proto tcp to port { http, https, ... } synproxy state

Повторюсь: клиентов всего несколько человек в офисе. И ещё повторюсь:
эксперимент со всего двумя клиентами показал, что блочится именно в
тот момент, когда ПХП ожидает завершения операции (выборки из базы,
или коннекта и чтения сокета).

Я насчёт дефолта упомянул, в том смысле что любой у себя может
проверить легко - могу даже накинуть для простоты примерно что в
скрипте написать:

<?php
$url = "http://site/url/...";
$opts = array( 'http' => array('timeout'  => '30', 'method' => 'GET',
'header'  => 'Content-type: text/html') );
$context  = stream_context_create($opts);
$fd = fopen($url, "r", false, $context);
if ($fd) {
        echo "open OK";
        $data = fgets($fd);
        if ($data)
                echo "data OK";
        else
                echo "date FAILED";
        fclose($fd);
} else
        echo "open FAILED";

// ИЛИ так:

$url = "http://site/url/...";
$opts = array( 'http' => array('timeout'  => '30', 'method' => 'GET',
'header'  => 'Content-type: text/html') );
$context  = stream_context_create($opts);
if (($info = file_get_contents($url, false, $context)) !== FALSE)
        echo "OK";
else
        echo "FAILED";
?>

Занести в УРЛ какойнить адрес, где коннект принимают, но долго ничего
туда не отвечают.
И с одного клиента запустить запрос на этот скрипт, а с другого - на
любой другой скрипт. И посмотреть - отработает ли второй скрипт, или
будет висеть пока первый не отвалится.

--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Anton Maksimenkov-2
18 ноября 2010 г. 17:14 пользователь Dinar Talypov <[hidden email]> написал:
>> дефолтные, в среднем он откушивает 800Мб от моего 1Г оперативы. А вот
> Скорее всего скрипт кривой ;)
Ты это по поводу памяти? Так это не "срипт кушает". Это я как бы
намекал, что посгрису настроено кушать ресурсов вдоволь. Ибо к нему не
только веб обращается ессно.
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Anton Maksimenkov-2
Хм.
Приношу извинения почтенной публике.

Проблема обнаружилась. Дело в том, что у меня все скрипты-то с
авторизацией. И с СЕССИЕЙ.

Так вот, session_start() видимо просто и тупо хватает блокировку на
всё время работы срипта.
У меня сессия во всех сриптах использовалась.
Так что как только любой скрипт зависал на какой-то длительной
операции (ожидание выборки из базы или обращение к внешнему серверу),
то ВСЕ ОСТАЛЬНЫЕ висели ждали.
Без сессии вроде бы всё полетело (ещё погляжу, если будут ещё какие-то
проблемы - расскажу).

Мораль. НЕ ИСПОЛЬЗУЙТЕ session*() !!!
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Anton Maksimenkov-2
19 ноября 2010 г. 15:02 пользователь Anton Maksimenkov
<[hidden email]> написал:
> Приношу извинения почтенной публике.
> Мораль. НЕ ИСПОЛЬЗУЙТЕ session*() !!!

Упс. Есть "лечение". Лок удерживается до момента session_write_close();
В принципе с этим уже можно работать.
Только в документации про это надо было бы явно упоминать.
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Dinar Talypov

On Fri, 19 Nov 2010 15:31:15 +0500
Anton Maksimenkov <[hidden email]> wrote:

> 19 ноября 2010 г. 15:02 пользователь Anton Maksimenkov
> <[hidden email]> написал:
> > Приношу извинения почтенной публике.
> > Мораль. НЕ ИСПОЛЬЗУЙТЕ session*() !!!
>
> Упс. Есть "лечение". Лок удерживается до момента session_write_close();
> В принципе с этим уже можно работать.
> Только в документации про это надо было бы явно упоминать.
> --
По идее сессия должна создаваться только один раз на клиента
и все операции делаться в сессии. Блокировка в этом случае оправдана,
т.к. не позволяет изменять данные(по крайней мере думается, что так задумано, хотя скорее всего это не так).


--
Dinar Talypov

Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Anton Maksimenkov-2
19 ноября 2010 г. 15:52 пользователь Dinar Talypov <[hidden email]> написал:
>> Упс. Есть "лечение". Лок удерживается до момента session_write_close();
> По идее сессия должна создаваться только один раз на клиента
> и все операции делаться в сессии. Блокировка в этом случае оправдана,
> т.к. не позволяет изменять данные(по крайней мере думается, что так задумано, хотя скорее всего это не так).

Да. Но там судя по всему просто ОДИН ОБЩИЙ лок.
С одной стороны, разумнее было бы хотя бы отдельный лок на клиента.
Правда вряд ли это приемлемо в случае сотен или тысяч разных клиентов.
Поэтому сделали так - просто в реализации и под кучей клиентов не
деградирует.

Но блин, такое надо писать крупным красным цветом в документации, хотя
бы на ту же session_start(), которая собно и устанавливает блокировку.
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Странный эффект "биглока" в php

Anton Maksimenkov-2
19 ноября 2010 г. 16:14 пользователь Anton Maksimenkov
<[hidden email]> написал:
> С одной стороны, разумнее было бы хотя бы отдельный лок на клиента.
Эээ. Имелось ввиду "отдельный лок на уникальную сессию", конечно.
--
antonvm