PConnect and Connect perfomance

Grey_EM

Guest
PConnect and Connect perfomance

Маленькая информация к размышлению.
Разница между персистент и не персистент коннекциями достигает 300% (для оракла естественно).
То есть обычный коннект в 3 раза медленнее.

Oracle 9i
php 4.2.1
oci функции
1)Коннект
2)Выборка 10 записей по 3 поля в каждой.
3)OCILogoff

Более никакой информации не будет.
 

Konstantin

Guest
А если выбирать не 10 записей по 3 поля, а делать тяжелые запросы. То есть чтобы обработка запроса занимала больше времени чем конект/дисконект?
 

Grey_EM

Guest
Автор оригинала: Konstantin
А если выбирать не 10 записей по 3 поля, а делать тяжелые запросы. То есть чтобы обработка запроса занимала больше времени чем конект/дисконект?
Зачем?
 

romutis

Guest
Вполне логичный результат для такого уровня теста.

Объясняется просто: PHP, используя persistent connection, просто не шлет команду окончания сессии серверу. И при создании нового коннекта - не создает новую сессию физически, а пытается использовать предыдущую незакрытую сессию в надежде, что Оракл ее не прибил. При данном тесте, если выборки шли подряд, без значительных пауз - выборка прошла, используя одну и ту же открытую сессию - отсюда и выигрыш во времени - не надо было коннектиться/отсоединяться.

Жаль, что не все выборки из Оракла подобны тестовой. :)

P.S. Никаких реальных средств поддержания постоянного коннекта с Ораклом у PHP нет. Не прибили - пользуемся этой сессией, прибили - ну что ж - создадим новую сессию.

Здесь, кстати, зарыта большая потенциальная проблема - при некорректной конфигурации TCP Stack возможна ситуация с неконтролируемым ростом клиентских сессий и дальнейшей невозможностью коннекта к Ораклу, вызванной достижением максимального кол-ва серверных процессов Оракла.
 

Grey_EM

Guest
Автор оригинала: romutis
Вполне логичный результат для такого уровня теста.
А, еретик, ты осмеливаешься усомниться в величии господа ?
Объясняется просто: PHP, используя persistent connection, просто не шлет команду окончания сессии серверу.
Мудры слова твои, но бесом внушаемы. Приди ко мне и очистишься.

И при создании нового коннекта - не создает новую сессию физически, а пытается использовать предыдущую незакрытую сессию в надежде, что Оракл ее не прибил.
При данном тесте, если выборки шли подряд, без значительных пауз - выборка прошла, используя одну и ту же открытую сессию - отсюда и выигрыш во времени - не надо было коннектиться/отсоединяться.

Жаль, что не все выборки из Оракла подобны тестовой. :)
Проясни соль твоих замечаний ибо смущаюсь я. Чую что где-то подвох есть, но где не проникнусь.

Считаешь ли ты что существует запрос (возможно очень сложный ), при котором поведение php при коннекте персистент и не персистент будет отличаться от описанного мною?

То есть думаешь ли ты, что сложность запроса или тяжесть его для сервера может изменить тот факт что персистент коннект к ораклу значетельно быстрее обычного?

P.S. Никаких реальных средств поддержания постоянного коннекта с Ораклом у PHP нет. Не прибили - пользуемся этой сессией, прибили - ну что ж - создадим новую сессию.
В таком контексте ни у кого средств поддержания постоянного коннекта с Ораклом ибо если сессия прибита на сервере, то хоть тресни не сможешь этому помешать с клиента. Имеется ввиду конечно удержание конкретной сессии, не открытие новой с теми же параметрами.
Кстати что есть средства поддержания постоянного коннекта с Ораклом ? Можешь прояснить свою фразу?
Кстати проверь значение серверного параметра sqlnet.expire_time (в sqlnet.ora). По моим данным при значении по умолчанию, что обычно для установки оракла с нуля, прибитие сессий на сервере не происходит вообще (oracle 9.1 enterprise). Проверь как это у тебя.
Здесь, кстати, зарыта большая потенциальная проблема - при некорректной конфигурации TCP Stack возможна ситуация с неконтролируемым ростом клиентских сессий и дальнейшей невозможностью коннекта к Ораклу, вызванной достижением максимального кол-ва серверных процессов Оракла.
Э-ээ, а можно об этом поподробнее. Неконтролируемый рост сессий, коннекций наблюдается у многих провайдеров, которые позволяют использовать Pconnect для коннекта к mysql. И я считаю что проблема здесь не в некорректной конфигурации TCP Stack, а в реализации персист коннекций в php и в непонимании программистами его механизма.
P.S. Я мог бы дать запрос, время исполнения которого исчисляется десятками минут, но это не меняет того что обычный коннект к ораклу очень долог.
 

romutis

Guest
Автор оригинала: Grey_EM
Считаешь ли ты что существует запрос (возможно очень сложный ), при котором поведение php при коннекте персистент и не персистент будет отличаться от описанного мною?
Нет, конечно. Я имел в виду, что если коннекты к Ораклу следуют в рандомном порядке, то шансы по созданию новой сессии у pconnect и connect будут более одинаковыми и выигрыш во времени может и исчезнуть. А потенциальное наличие проблем - остаться...


Автор оригинала: Grey_EM
В таком контексте ни у кого средств поддержания постоянного коннекта с Ораклом ибо если сессия прибита на сервере, то хоть тресни не сможешь этому помешать с клиента. Имеется ввиду конечно удержание конкретной сессии, не открытие новой с теми же параметрами.
Кстати что есть средства поддержания постоянного коннекта с Ораклом ? Можешь прояснить свою фразу?
Кстати проверь значение серверного параметра sqlnet.expire_time (в sqlnet.ora). По моим данным при значении по умолчанию, что обычно для установки оракла с нуля, прибитие сессий на сервере не происходит вообще (oracle 9.1 enterprise). Проверь как это у тебя.
Сессия не будет прибита если клиентское соединение взаимодействует с сервером в bidirectional режиме. Т.е. периодически отылает ему уведомление "Шеф, я живой, не убивай сессию" и реагирует на опросы сервера на предмет выявления неживых сессий.

При sqlnet.expire_time=0 сервер закрывает сессии при приходе сигнала от клиента о том, что сессия закончена - можно ее и прибить, но при этом не проводит периодических опросов всех сессий, помеченных как открытые на предмет выявления среди них "мертвяков". Помнишь, что я писал в предыдущем сообщении, что при persistent connect PHP не шлет сигнал окончания сессии серверу? Вот тебе и "вечные" сессии при совокупности параметров. А если у сессии имеется блокировка и сервер ждет окончания сессии, чтобы освободить ресурс от блокировки - то ему долго придется ждать... :) Другие сессии могут изрядно страдать от наличия такого типа блокировок.

Точно также параметр expire_time действует на стороне клиента - при "0" клиент не подтверждает то, что он живой (если сессия что-то там активно читает из Оракла или пишет - это и не нужно особо).

Проверить практикой не могу - ибо PHP + Oracle мы нигде не используем (вообще PHP не используем :) ), но принципы работы оракловских механизмов я знаю. И если какой-то софт пользует Оракловского клиента как транспорт для соединения с сервером - поведение софта будет таким, как ведет себя Оракловский клиент.

Про то, что коннект к Ораклу очень долог - это дело поправимое на уровне тюнинга Net8. Из той конфигурации, что устанавливается Ораклом по умолчанию - можно повысить скорость коннекта в 2-5 раз, особо не напрягаясь. Это даже частично описано в доках
 

Grey_EM

Guest
Автор оригинала: romutis

Нет, конечно. Я имел в виду, что если коннекты к Ораклу следуют в рандомном порядке, то шансы по созданию новой сессии у pconnect и connect будут более одинаковыми и выигрыш во времени может и исчезнуть. А потенциальное наличие проблем - остаться...

Сессия не будет прибита если клиентское соединение взаимодействует с сервером в bidirectional режиме. Т.е. периодически отылает ему уведомление "Шеф, я живой, не убивай сессию" и реагирует на опросы сервера на предмет выявления неживых сессий.
Что нужно для установления такого соединения? По умолчанию в каком режиме создаются соединения?

При sqlnet.expire_time=0 сервер закрывает сессии при приходе сигнала от клиента о том, что сессия закончена - можно ее и прибить, но при этом не проводит периодических опросов всех сессий, помеченных как открытые на предмет выявления среди них "мертвяков". Помнишь, что я писал в предыдущем сообщении, что при persistent connect PHP не шлет сигнал окончания сессии серверу? Вот тебе и "вечные" сессии при совокупности параметров. А если у сессии имеется блокировка и сервер ждет окончания сессии, чтобы освободить ресурс от блокировки - то ему долго придется ждать... :) Другие сессии могут изрядно страдать от наличия такого типа блокировок.

Точно также параметр expire_time действует на стороне клиента - при "0" клиент не подтверждает то, что он живой (если сессия что-то там активно читает из Оракла или пишет - это и не нужно особо).

Проверить практикой не могу - ибо PHP + Oracle мы нигде не используем (вообще PHP не используем :) ),
Вот это и плохо.

но принципы работы оракловских механизмов я знаю. И если какой-то софт пользует Оракловского клиента как транспорт для соединения с сервером - поведение софта будет таким, как ведет себя Оракловский клиент.
Да нет тут все запущеннее чем кажется.
 

romutis

Guest
Автор оригинала: Grey_EM

Что нужно для установления такого соединения? По умолчанию в каком режиме создаются соединения?
Ничего не нужно. Если sqlnet.expire_time>0 - то оракловский клиент так и взаимодействует с сервером. Т.е. помимо посылаемых команд серверу он еще и в периоды "простоя" сам посылает сигналы серверу.

Автор оригинала: Grey_EM
Да нет тут все запущеннее чем кажется.
Ну не знаю. У нас везде Java-pools используются. При правильном программинге - проблем не наблюдается даже при 5000 коннектов в один момент.
 
Сверху