Bitcoin Forum
November 14, 2024, 03:37:39 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Медленная обработка запросов к демону bitcoin. П  (Read 1788 times)
vadim24816 (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
March 13, 2013, 09:54:05 AM
 #1

Есть 2 сервера.
1ый с веб-приложением на php 5.3, apache 2.2.23, linux 2.6.32, MySQL 5.1, для работы с bitcoin используется библиотека https://github.com/mikegogulski/bitcoin-php, она работает с помощью cURL.
2ой с демоном bitcoin.
1ый посылает запросы ко 2му, если нужно
а) проверить соединение с bitcoind (проверяется раз в 15 секунд)
б) проверить был ли совершен входящий платеж для указанного биткоин-аккаунта. (так же кажды 15 секунд)
Проблемы начинаются, когда подключается несколько пользователей. Демон bitcoin сначала долго возвращает ответ, а потом просто перестает отвечать на запросы.
Проверки а) и б) инициируются на стороне клиента, и сейчас при 10-15 пользователях получается, что если они просто открывают сайт, то количесвто Entry Processes достигает 5-6, а если начинаются какие-то еще действия, то происходит превышение лимита  Entry Processes (лимит 25), т.е. как я понимаю, одновременно запущено 25 скриптов на обработку. Причем если закомментить запросы к биткоину, превышения лимита не происходит.
Насколько я выяснил (при помощи xdebug и WinCacheGrind), проблема в медленной обработке php-скриптов, выполняющих запросы к bitcoind, причем именно в php::exec_curl, она занимает по 500ms времени на запрос.

Вопросы:
1. Нормально ли, что запросы к bitcoind занимают столько времени, можно ли это время уменьшить?
2. Как можно снизить число Entry Processes?
3. Есть ли варианты проверки поступления входящих платежей без периодических запросов к демону? Желательно без сторонних сервисов.
Буду рад любой помощи. Идеально было бы найти наименее трудозатратное решение, короче вариант "Все переделать!" не принимается  Smiley
rPman
Legendary
*
Offline Offline

Activity: 1120
Merit: 1069


View Profile WWW
March 13, 2013, 02:15:13 PM
 #2

Скорее всего bitcoin тут не причем, проблема в библиотеке curl и хостерах openvz (я такое словил на firstvds), объяснить не могу, это какая то комбинация условий на хост системе, решение - обновить curl (или даунгрейд, я тогда так и не смог полностью выявить закономерности), еще решение - сменить curl на что-нибудь иное (вроде есть немало библиотек попроще на сокетах php). У меня тогда проблема решилась заменой вызовов библиотеки php_curl на запуск бинарника exec ('curl...'), решение было хоть кривое, но нужно было быстро решать.

p.s. обращаешься к bitcoin на любой вызов со страницы сайта? глупо, по возможности лучше кешировать запросы, хотя бы на диск.

Здесь не может находиться ваша реклама Smiley
Protect a future of bitcoin, use p2pool
Donation in BTC: 19fv5yYtfWZ9jQNjx2ncmu1TTrvg5CczZe
vadim24816 (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
March 14, 2013, 05:20:21 AM
 #3

Скорее всего bitcoin тут не причем, проблема в библиотеке curl и хостерах openvz (я такое словил на firstvds), объяснить не могу, это какая то комбинация условий на хост системе, решение - обновить curl (или даунгрейд, я тогда так и не смог полностью выявить закономерности), еще решение - сменить curl на что-нибудь иное (вроде есть немало библиотек попроще на сокетах php). У меня тогда проблема решилась заменой вызовов библиотеки php_curl на запуск бинарника exec ('curl...'), решение было хоть кривое, но нужно было быстро решать.

p.s. обращаешься к bitcoin на любой вызов со страницы сайта? глупо, по возможности лучше кешировать запросы, хотя бы на диск.

Спасибо. Я как-раз на curl и думал Smiley
С кешированием не понятно, например проверку соединения с биткоин я в бд кеширую(уже выяснил, что в файл быстрее), т.к. один результат можно отдавать всем пользователям. Но для проверки платежей кеширование не подойдет, нужен запрос к биткоину.
rPman
Legendary
*
Offline Offline

Activity: 1120
Merit: 1069


View Profile WWW
March 14, 2013, 10:25:06 AM
Last edit: March 14, 2013, 10:51:49 AM by rPman
 #4

Кеширование запросов bitcoin, если речь идет о получении информации, оправдана, так как любая такая информация в сети bitcoin может запаздывать, так что нет смысла чаще чем раз в несколько секунд проверять, например, наличие новых входящих транзакций (все равно кстати их принимать нужно после получения подтверждений, а их получить можно в реальном времени по другому).

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

p.s. транзакция получает подтрвеждение после нахождения сетью очередного блока, у клиента bitcoind есть замечательная опция:
Code:
  -blocknotify=<cmd>     Execute command when the best block changes (%s in cmd is replaced by block hash)

Здесь не может находиться ваша реклама Smiley
Protect a future of bitcoin, use p2pool
Donation in BTC: 19fv5yYtfWZ9jQNjx2ncmu1TTrvg5CczZe
vadim24816 (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
March 15, 2013, 01:49:33 PM
 #5

Нашел на форуме:
Code:
 -blocknotify=/path/to/your/script.sh 
Т.е. можно запускать шелл-скрипт, который будет запускать cURL, отправлять запрос на нужный урл, где уже можно запускать какую-то проверку на входящий платеж? Получается что-то вроде события на входящий блок.

Можно ли так получать платежи с неподтвержденных транзакций? Или есть более простые решения?
В моем случае: Входящие - без подтверждения, исходящие - 2 подтверждения, вроде достаточно надежно.
rPman
Legendary
*
Offline Offline

Activity: 1120
Merit: 1069


View Profile WWW
March 15, 2013, 03:49:15 PM
 #6

Не понимаю проблемы и вопроса. Да, достаточно прописать в приложении в этом ключе запрос к транзакциям и возможно их обработчик, с сохранением обработанной информации в базе/кеше. А запросы веб сайта лезут не к bitcoind, а к этой закешированной информации.

p.s. Получить список неподтвержденных транзакций, штатным клиентом, только периодическими запросами или сторонними скриптами. Но доверять таким транзакциям не рекомендуется (тот же metabank.ru на заре своего старта попадал на мошенников, обрабатывая обмен без подтверждений сетью), хотя конечно показывать что присланная транзакция принята сервисом и ожидает подтверждения - хороший тон.

Здесь не может находиться ваша реклама Smiley
Protect a future of bitcoin, use p2pool
Donation in BTC: 19fv5yYtfWZ9jQNjx2ncmu1TTrvg5CczZe
vadim24816 (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
March 15, 2013, 07:41:47 PM
 #7

Спасибо, теперь вроде понятнее.
Проблема по сути в том, как узнать о неподтвержденной входящей транзакции. Я сейчас это делаю через опрос биткоина, но т.к. выяснилось, что curl отрабатывает медленно, пара десятком пользователей просто повесят сайт постоянными проверками.
invader
Sr. Member
****
Offline Offline

Activity: 266
Merit: 250



View Profile
March 15, 2013, 09:22:12 PM
 #8

Самое простое решение чтобы оставить все как есть и чтобы клиенты не повесили сайт (да и зачем им позволять вообще как-то взаимодействовать с койноклиентом напрямую?) нужно просто кэшировать данные и обновлять их с некоторой периодичностью (раз в 10..30 сек.). А страница уже должна брать нужные данные из кэша и пусть обновляют сколько им влезет.
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!