![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
infarch |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Здравствуйте.
Пытаюсь запустить и использовать memcached под виндовс 7. Сам сервис запустил: D:\memcached-amd64>memcached.exe -l localhost -p 12345 -v Процесс висит в памяти, могу доступиться через телнет. Теперь пробую использовать:
Однако set не работает, возвращает 0. Я полез в сам Cache::Memcached, дошел до вот этой строки:
На ней все останавливается и в $! я нахожу сообщение "Unknown error". Сам я абсолютно не знаком с использованием сокетов, мне это ни о чем не говорит. Может подскажете в чем может быть проблема? пс. файрволл отключен |
||||
|
|||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
UPD. Запустил memcached с ключом -vv. В момент конекта вижу в консоли:
<644 new auto-negotiating client connection <644 connection closed. Пациент значит не совсем мертв... Но причина по прежнему не понятна. |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
1) УМВР. Debian/stable, ровно этот код и строка запуска memcached.
2) Попробуйте 127.0.0.1 вместо localhost и/или проверьте, что возвращает Socket::inet_aton($ip) в $sin = Socket::sockaddr_in... 3) $! можно напечатать в числовом контексте (хотя, вообще говоря, в перле такого нет) -- например, printf "%d", $!. Кроме $! есть ещё $^E. Хотя, конечно, WSA такая вещь, что всего можно ждать... 4) Попробуйте поставить timeout в 0. non-blocking sockets можэт иметь ограничения портируемости. |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Пробовал использовать айпи вместо локалхост, результата нет. Таймаут в ноль тоже не помог. Да и как его поставить... Вот кусок конструктора:
Ставим ноль, получаем дефолт. Ну я его руками подправил, для восприятия нулей. И не помогло. Вывел $sin на печать, получил забавные смайлики: sin=☻ 09⌂ ☺. А вот $^E несколько улучшил читаемость: "A non-blocking socket operation could not be completed immediately". После этого я еще раз пересмотрел код и пришел вот к этому: IO::Handle::blocking($sock, 1). переписал на IO::Handle::blocking($sock, 1) or die $!; и получил "Inappropriate I/O control operation". Что бы это значило?.. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
infarch, а могешь поискать как определяются переменные $sock и $sin.
Мож там пафос в криво выставленных флагах. Если найдешь вызов функции socket - тож в студию ! И плюс, ежели вдруг будет вызов функции setsockopt - тоже интересно посмотреть Добавлено через 4 минуты и 49 секунд он у тебя в бинарном виде -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Конечно, могу. Вот в сокращенной форме то что происходит:
|
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
ActivePerl 5.16 for win32, memcached 1.4.5 64-бит от northscale: В sub _connect_sock {
заменить
Работать будет видимо только с неблокирующими сокетами (timeout > 0) |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
tzirechnoy, ваш рецепт сработал! Огромное спасибо!
|
|||
|
||||
Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
здесь вроде бы все кошерно. Посему можешь попробовать совет tzirechnoy Или эту строку подхачить
на
Если не поможет - попробуем ковырятся дальше! -------------------- менеджер по кодеврайтингу ![]() |
||||
|
|||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Он ужэ сказал -- что это просто неработает. Точнее, неработает конкретно blocking($sock, 1) -- но во-первых blocking($sock, 0) -- не выглядит осмысленным, поскольку ошыбки и так явно идут от неблокирующихся хэгдлов, во-вторых почти наверняка если код для установки blocking неправильный/не от того API -- то и для снятия будет такжэ. Впрочем, мне до сих пор непонятно, как он всё-таки получился non-blocking. Возможно, это поведение по умолчанию в WSA. В-третьих -- это WSA, что вы хотели. Ад, заборы, коровники. Проще всего -- отправить однострочный патч автору и забить. Можно попытаться представить, что IO::Socket::INET более используемый, потому там большэ шансов, что заработает сразу, и потому переписать на IO::Socket::INET -- но как бы видно, что надо переписывать и отлажывать десяток-другой строк -- и непонятно в чём будет выигрыш дажэ если что-то получится. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
tzirechnoy, много эмоций, а по сути - практически ничего. Это во-первых.
Во-вторых, функция socket создает блокирующие сокеты по умолчанию, и по-крайней мере это в виндовс всегда работало, а значит от чего там идут ошибки - вовсе не явно. Не заглядывая в код модуля, а читая лишь посты - вообще ничего явного не вижу. В-третьих, то, что не работает вызов blocking($sock, 1), вовсе не означает, что вызов blocking($sock, 0) - тоже не будет работать! Почему - читай дальше. В четвертых, учитывая, что это windows - лично я не знаю, какие константы из fcntl, socket и прочих функций в ней реализованы кошерно, а какие нет. В пятых, и конечных, я могу найти не одно верное решение данной проблемы, когда будет понятно в чем суть, но каждый выбирает сам, какое ему любо. Однако от выбора одного решения из множества, вовсе не означает, что другие способы решения - бесмысленны! В шестых, на этом, я надеюсь флуд будет закончет! -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Верно подмечено. Я не модэратор, но по мне так -- обращайтесь, когда потребуется ещё раз выплеснуть. |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Друзья, не ссорьтесь ) Проблема решена для меня и это главное. Тут такая ситуация - на девелоперской машине я модуль мемкешед и попатчить могу, не критично. А в продакшене это будет линукс сервер и я думаю там то проблем не будет.
Вот кстати вопрос еще: я в примере к модулю видел что в конструкторе определяется несколько серверов. Что это дает? Можно ли мемкешед инстансы организовать в устойчивый кластер? |
|||
|
||||
tzirechnoy |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Распределение нагрузки. Ключ хэшыруется, и на основании хеша определяется, на какой сервер его отправлять.
memcached и устойчивость -- какое-то странное сочетание. Как минимум -- зачем вам устойчивый кластер из memcached, всё равно жэ его значения периодически выкидываются? |
||||
|
|||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Насколько я понимаю, выкидываются если настроить таймаут, иначе хранятся до последнего. Или не так? Я вообще предполагал там хранить объекты которые часто читаются из базы, но редко изменяются. Еще хранить сесии. Причем сесии будут только там, в базу данных не пойдут. И вот возникает сомнение... Если один сервер упадет или станет недоступен то получается что куча юзеров окажутся разлогинеными. Это мне не нравится.
|
|||
|
||||
tzirechnoy |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Или если память закончится. Или если демон перезагрузят.
Не должно быть тут никаких сомнений: это -- кэш. Для ускорения. Никаких основных копий там хранить нельзя. |
||||
|
|||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Да, правда ваша... Ну значит буду думать об его использовании чисто как кеша. Спасибо всем за участие, закрываю тему.
|
|||
|
||||
Grost |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 26.8.2010 Где: Москва Репутация: нет Всего: нет |
Значения в мемкеше удаляются если закончилось время жизни или заканчивается память, т.е. для записи нового элемента будет удалён старый. Так же, если вдруг сервер упадёт, то мемкеш будет чист.
Для важных записей можно использовать Redis который время от времени пишит свои данные на диск, что помогает ему восстановить данные после падении. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |