to post messages and comments.

Сейчас поймал причину сильных тормозов периодических последнего времени на сервере.

У меня на серверах Redis обычно крутится централизованный, на хосте. Чтобы зря память контейнеров неоптимально не тратить. А тут в одном контейнере не заметил, что там свой Redis установился. Память контейнера лимитирована, так Redis кидал ключи в своп. Ну и ладно бы, в своп, и в своп. Но у него настроено периодическое сохранение базы. И вот тут начиналось переливание из пустого в порожнее, из свопа в файл-дамп... И так каждые несколько минут. Машина с нагруженным дисковым IO, так что ей это было критично.

Убрал контейнерный Redis, LA упал с 20 до 6 :)

Разработчики, которые в Redis кладут ключи без namespaces, без префиксов, голыми md5(smthng) да ещё при этом с неограниченным сроком хранения, портят себе карму и наполняют окружащую среду негативной энергией.

Ну добавьте вы к ключу хотя бы «me_vendor:»

...

И вот как, мля, искать, какое приложение срёт такими ключами?

Сидел и тупо пялился как первотэг собирался.
Какой красивый лог сборки в консольке.
Аккуратный ,легкочитаемый ,стройный и понятный.
Вот так вот прикинул и понял ,что сие не в первый раз.
Дрочу на логи — значит я логоёб((((

собственно говоря как это сделать..
во-первых патч
diff --git a/deps/lua/src/Makefile b/deps/lua/src/Makefile
index cbbb7d5..1648150 100644
--- a/deps/lua/src/Makefile
+++ b/deps/lua/src/Makefile
@@ -7,10 +7,8 @@
 # Your platform. See PLATS for possible values.
 PLAT= none
 
-CC= gcc
 CFLAGS= -O2 -Wall $(MYCFLAGS)
-AR= ar rcu
-RANLIB= ranlib
+MYAR= $(AR) rcu
 RM= rm -f
 LIBS= -lm $(MYLIBS)
 
@@ -48,7 +46,7 @@ o:    $(ALL_O)
 a:     $(ALL_A)
 
 $(LUA_A): $(CORE_O) $(LIB_O)
-       $(AR) [email protected] $(CORE_O) $(LIB_O)     # DLL needs all object files
+       $(MYAR) [email protected] $(CORE_O) $(LIB_O)   # DLL needs all object files
        $(RANLIB) [email protected]
 
 $(LUA_T): $(LUA_O) $(LUA_A)
@@ -67,7 +65,7 @@ echo:
        @echo "PLAT = $(PLAT)"
        @echo "CC = $(CC)"
        @echo "CFLAGS = $(CFLAGS)"
-       @echo "AR = $(AR)"
+       @echo "AR = $(MYAR)"
        @echo "RANLIB = $(RANLIB)"
        @echo "RM = $(RM)"
        @echo "MYCFLAGS = $(MYCFLAGS)"
diff --git a/src/config.h b/src/config.h
index c1fcaf6..b92f1ee 100644
--- a/src/config.h
+++ b/src/config.h
@@ -55,7 +55,7 @@
 
 /* Test for backtrace() */
 #if defined(__APPLE__) || defined(__linux__)
-#define HAVE_BACKTRACE 1
+/* #define HAVE_BACKTRACE 1 */
 #endif
 
 /* Test for polling API */


а потом запускаем мейк как-то так

CC=${CROSS}gcc AR=${CROSS}ar RANLIB=${CROSS}ranlib make MALLOC=libc

где не нужно объяснять что есть CROSS

Мощно (я про раздел "Using hashes to abstract a very memory efficient plain key-value store on top of Redis") redis.io

То есть можно сделать маленькую оптимизацию, группируя руками ключи в один ключ, содержащий остальные как хеш-таблицу (вместо k-v пар foo:1, foo:2, foo:3 сделаем один хеш k-v foo -> {1:, 2:, 3:}, при этом уменьшить потребление памяти эдак в 5 раз, при этом иметь приблизительно ту же производительность (хотя тут сложно анализировать, может даже и выигрыш).

Время разработки на lua под redis и openresty стремится к бесконечности, потому что отсутствие каких либо инструментов для отладки превращает процесс отладки сначала в длительную медитацию над кодом и логами, а после того, как количество кода выросло, медитация сменяется настоящим адом непонимания, где даже становится непонятно, а какой именно lua код стал причиной проблемы. Не работает и всё тут — пихай логирование на каждую строку. Стоит ли это "ну тут же перформансе очень большой" (С)? Я, думаю, нет.

В redis данные можно спокойно заливать netcat'ом и оно у меня работает практически всегда. А вот кэш lua скриптов оказался не персистентным и не передающийся другим слэйвам, надеюсь это починят. Когда нибудь...

Оказалось, что в документации к редису описываются нужные нам фичи, которых еще нету в коде. Реально, говорят потерпите, мы почти запилили :)

Пощупал редис в качестве прослойки для общения нескольких инстансов торнадо, замечательная штука sublish-subscribe, достаточно быстрая, и простая, с нормальным интерфейсом. А идея того что тебе будут пушить сообщения, а не дергать очередь, просто замечательна. Будем копать дальше, пока приятно.

Убейте меня веником!
При запуске resque воркера с пустой redis базой, redis ругается на неверные аргументы команды blpop. Поиск по содержимому на blpop выдаёт что команды такие он знает... НО НЕ ПОСЫЛАЕТ! WALL

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

Как и говорил ранее, очень советую code.google.com , есть драйвера для всего и вся, быстро работает, мемкешед курит в сторонке.
Почему не Tokyo? Потому что не Tokyo. Шутка, конечно.
На самом деле всё глубже — это принципиально разные kvs(key-value storage). Если TT/TC может(вообще больше толку если он так и будет делать) хранить данные на HDD, когда Redis, как и многие другие KVS, хранит всё в RAM.
Если у вас небольшие объёмы данных, которые нужно очень быстро получать(скажем, кеширование определённых структур, а не целой страницы), то Redis будет идеален.
Если требуется кешировать много, больших данных(даже целых страниц), то TT будет незаменим.
Напомню что и для Редиса, и Токио есть великолепная обвязка opensource.plurk.com , которая очень упрощает жизнь если сервес необходимо масштабировать.

а вот свежий python-redis (он же redis-py) уже не такой глючный как 1.3.4 версия и вполне реально теперь использовать его у django вместо memcache для кеша а также как session backend.

кстати, оказалось таки зря я грешил когда-то, что сервер перезапускается целых 20 секунд (или больше). Оказалось, что мы выгребали все категории товаров, а их 26000 с лишним штук (или около того). Потом начали выгребать в redis как-то ловко и из него читать, скорость стала около 15 секунд. Сейчас, с новым редисом это время — 5-7 секунд. Viva la redis!