Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memcached + win7 
V
    Опции темы
infarch
Дата 21.1.2014, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Здравствуйте.

Пытаюсь запустить и использовать memcached под виндовс 7. Сам сервис запустил: 

D:\memcached-amd64>memcached.exe -l localhost -p 12345 -v

Процесс висит в памяти, могу доступиться через телнет. Теперь пробую использовать:

Код

use strict;
use warnings;

use Cache::Memcached;

my $memd = new Cache::Memcached {
  'servers' => [ "localhost:12345" ],
  'debug' => 1,
  'compress_threshold' => 10_000,
};

if( $memd->set("my_key", "Some value") ){
    my $val = $memd->get("my_key");
    print $val;
}


Однако set не работает, возвращает 0. Я полез в сам Cache::Memcached, дошел до вот этой строки:
Код

my $ret = connect($sock, $sin);


На ней все останавливается и в $! я нахожу сообщение "Unknown error". Сам я абсолютно не знаком с использованием сокетов, мне это ни о чем не говорит. Может подскажете в чем может быть проблема?

пс. файрволл отключен
PM MAIL   Вверх
infarch
Дата 21.1.2014, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



UPD. Запустил memcached с ключом -vv. В момент конекта вижу в консоли:

<644 new auto-negotiating client connection
<644 connection closed.

Пациент значит не совсем мертв... Но причина по прежнему не понятна.
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2014, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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 можэт иметь ограничения портируемости.
PM MAIL   Вверх
infarch
Дата 21.1.2014, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Пробовал использовать айпи вместо локалхост, результата нет. Таймаут в ноль тоже не помог. Да и как его поставить... Вот кусок конструктора:
Код

    # TODO: undocumented
    $self->{'connect_timeout'} = $args->{'connect_timeout'} || 0.25;
    $self->{'select_timeout'}  = $args->{'select_timeout'}  || 1.0;

Ставим ноль, получаем дефолт. Ну я его руками подправил, для восприятия нулей. И не помогло.

Вывел $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". Что бы это значило?..
PM MAIL   Вверх
Bulat
Дата 22.1.2014, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



infarch, а могешь поискать как определяются переменные $sock и $sin. 

Мож там пафос в криво выставленных флагах. Если найдешь вызов функции socket - тож в студию ! И плюс, ежели вдруг будет вызов функции setsockopt - тоже интересно посмотреть

Добавлено через 4 минуты и 49 секунд
Цитата(infarch @  21.1.2014,  19:12 Найти цитируемый пост)
Вывел $sin на печать, получил забавные смайлики: sin=☻ 09⌂  ☺.


он у тебя в бинарном виде


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
infarch
Дата 22.1.2014, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Конечно, могу. Вот в сокращенной форме то что происходит:

Код

my $sock;
my $sin;
my $proto = $PROTO_TCP ||= getprotobyname('tcp');
socket($sock, PF_INET, SOCK_STREAM, $proto);
$sin = Socket::sockaddr_in($port, Socket::inet_aton($ip));

PM MAIL   Вверх
tzirechnoy
Дата 22.1.2014, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



ActivePerl 5.16 for win32, memcached 1.4.5 64-бит от northscale: В sub _connect_sock {
заменить 
Код
    if (!$ret && $timeout && $!==EINPROGRESS) {
на
[code]    if (!$ret && $timeout && ( ($!==EINPROGRESS) || ($!==EWOULDBLOCK)) ) {


Работать будет видимо только с неблокирующими сокетами (timeout > 0)
PM MAIL   Вверх
infarch
Дата 22.1.2014, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



tzirechnoy, ваш рецепт сработал! Огромное спасибо!
PM MAIL   Вверх
Bulat
Дата 22.1.2014, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(infarch @  22.1.2014,  11:52 Найти цитируемый пост)
Конечно, могу. Вот в сокращенной форме то что происходит:

здесь вроде бы все кошерно.

Посему можешь попробовать совет tzirechnoy

Или эту строку подхачить

Код

IO::Handle::blocking($sock, 1)


на

Код

IO::Handle::blocking($sock, 0)


Если не поможет - попробуем ковырятся дальше!


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tzirechnoy
Дата 22.1.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
на Код IO::Handle::blocking($sock, 0)


Он ужэ сказал -- что это просто неработает. Точнее, неработает конкретно blocking($sock, 1) -- но во-первых blocking($sock, 0) -- не выглядит осмысленным, поскольку ошыбки и так явно идут от неблокирующихся хэгдлов, во-вторых почти наверняка если код для установки blocking неправильный/не от того API -- то и для снятия будет такжэ.

Впрочем, мне до сих пор непонятно, как он всё-таки получился non-blocking. Возможно, это поведение по умолчанию в WSA.

В-третьих -- это WSA, что вы хотели. Ад, заборы, коровники. Проще всего -- отправить однострочный патч автору и забить. Можно попытаться представить, что IO::Socket::INET более используемый, потому там большэ шансов, что заработает сразу, и потому переписать на IO::Socket::INET -- но как бы видно, что надо переписывать и отлажывать десяток-другой строк -- и непонятно в чём будет выигрыш дажэ если что-то получится.
PM MAIL   Вверх
Bulat
Дата 22.1.2014, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



tzirechnoy, много эмоций, а по сути - практически ничего. Это во-первых.

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

В-третьих, то, что не работает вызов blocking($sock, 1), вовсе не означает, что вызов blocking($sock, 0) - тоже не будет работать! Почему - читай дальше.

В четвертых, учитывая, что это windows - лично я не знаю, какие константы из fcntl, socket и прочих функций в ней реализованы кошерно, а какие нет.

В пятых, и конечных, я могу найти не одно верное решение данной проблемы, когда будет понятно в чем суть, но каждый выбирает сам, какое ему любо. Однако от выбора одного решения из множества, вовсе не означает, что другие способы решения - бесмысленны!

В шестых, на этом, я надеюсь флуд будет закончет!


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tzirechnoy
Дата 22.1.2014, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
tzirechnoy, много эмоций, а по сути - практически ничего.


Верно подмечено. Я не модэратор, но по мне так -- обращайтесь, когда потребуется ещё раз выплеснуть.
PM MAIL   Вверх
infarch
Дата 22.1.2014, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Друзья, не ссорьтесь ) Проблема решена для меня и это главное. Тут такая ситуация - на девелоперской машине я модуль мемкешед и попатчить могу, не критично. А в продакшене это будет линукс сервер и я думаю там то проблем не будет.
Вот кстати вопрос еще: я в примере к модулю видел что в конструкторе определяется несколько серверов. Что это дает? Можно ли мемкешед инстансы организовать в устойчивый кластер?
PM MAIL   Вверх
tzirechnoy
Дата 22.1.2014, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
Что это дает?


Распределение нагрузки. Ключ хэшыруется, и на основании хеша определяется, на какой сервер его отправлять.

Цитата
Можно ли мемкешед инстансы организовать в устойчивый кластер?


memcached и устойчивость -- какое-то странное сочетание. Как минимум -- зачем вам устойчивый кластер из memcached, всё равно жэ его значения периодически выкидываются?
PM MAIL   Вверх
infarch
Дата 22.1.2014, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Насколько я понимаю, выкидываются если настроить таймаут, иначе хранятся до последнего. Или не так? Я вообще предполагал там хранить объекты которые часто читаются из базы, но редко изменяются. Еще хранить сесии. Причем сесии будут только там, в базу данных не пойдут. И вот возникает сомнение... Если один сервер упадет или станет недоступен то получается что куча юзеров окажутся разлогинеными. Это мне не нравится.
PM MAIL   Вверх
tzirechnoy
Дата 22.1.2014, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
иначе хранятся до последнего. Или не так?


Или если память закончится. Или если демон перезагрузят.

Цитата
И вот возникает сомнение...


Не должно быть тут никаких сомнений: это -- кэш. Для ускорения. Никаких основных копий там хранить нельзя.
PM MAIL   Вверх
infarch
Дата 22.1.2014, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Да, правда ваша... Ну значит буду думать об его использовании чисто как кеша. Спасибо всем за участие, закрываю тему.
PM MAIL   Вверх
Grost
Дата 31.1.2014, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 26.8.2010
Где: Москва

Репутация: нет
Всего: нет



Значения в мемкеше удаляются если закончилось время жизни или заканчивается память, т.е. для записи нового элемента будет удалён старый. Так же, если вдруг сервер упадёт, то мемкеш будет чист. 
Для важных записей можно использовать Redis который время от времени пишит свои данные на диск, что помогает ему восстановить данные после падении.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1135 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.