#python #django #docker #memcached
#питон #джанго #докер #кэширование памяти
Вопрос:
Я использую Django с memcached с несколько большим объемом запросов. Сначала memcached работает нормально, однако через некоторое время он начинает время от времени выдавать ошибки. Сообщения об ошибках также противоречивы. Потратив много времени, я даже не могу выяснить, что именно означают ошибки и как их устранить.
Настройка:
- Серверная часть Django memcached по умолчанию
- memcached запускается с помощью Docker:
docker up -d memcached -m 3072m -I 10m -c 4096
- memcached использует свой собственный выделенный хост
- Спецификация хоста: 4 процессора 3,5 ГБ оперативной памяти
- перестановка = 0
- запуск на Google compute engine
Статистика
stats
STAT pid 1
STAT uptime 38718
STAT time 1476576775
STAT version 1.4.31
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 73.432000
STAT rusage_system 565.536000
STAT curr_connections 10
STAT total_connections 346393
STAT connection_structures 4070
STAT reserved_fds 20
STAT cmd_get 710031
STAT cmd_set 373473
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 681898
STAT get_misses 28133
STAT get_expired 1295
STAT get_flushed 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 294333584541
STAT bytes_written 294114029877
STAT limit_maxbytes 3221225472
STAT accepting_conns 1
STAT listen_disabled_num 8604
STAT time_in_listen_disabled_us 207162898
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 80025379
STAT curr_items 4616
STAT total_items 373473
STAT expired_unfetched 20032
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 21994
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 1229
END
Различные сообщения об ошибках
Exception Value: error 31 from memcached_get(:1:a7735b06da00d2e6991920299c31): (14006136669712) A TIMEOUT OCCURRED, host: 10.140.0.16:11211 -> libmemcached/get.cc:314
error 37 from memcached_set: SUCCESS
error 47 from memcached_get(:1:throttle_naive_9885206_None_): (140085126390144) SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY, host: 10.140.0.16:11211 -> libmemcached/get.cc:314
Примечание
- Во всех случаях кажется, что memcached docker все еще функционирует, поскольку
stats
все еще работает, и не все запросы генерируют ошибку - Загрузка процессора для узла memcached составляет всего около 1%
- Раньше у меня была такая же проблема, когда экземпляр memcached находился на том же хосте, что и моя служба интерфейса. Однако та же проблема.
РЕДАКТИРОВАТЬ: Поскольку я не смог решить эту проблему, я переключился на Redis на том же хосте. Хотя я не понял это правильно с первого раза, Redis предоставляет исчерпывающие сообщения об ошибках, поэтому я могу легко их устранить. Теперь мой кэш работает стабильно.
Комментарии:
1. Грубое предложение, но я спрошу его — вы заглядывали в код memcached (по крайней мере, в документацию)? Разве это не может быть просто промахом кэша на первом месте ?. Похоже, это не так, но…
2. Docker обычно предоставляет мне часы развлечений при каждом обновлении. Просмотр последних обновлений и изучение того, что изменилось, также могут дать вам некоторые подсказки
3. Да, я это сделал. Я просмотрел исходный код и документы. Найдено несколько документов о том, как его настроить, а также таблица кодов ошибок в исходном коде. Однако мне трудно понять, что означает сообщение об ошибке, когда в нем говорится что-то вроде «УСПЕХ». Промах кэша не вызывает ошибок, а просто возвращает None. Обратите внимание, что он не вызывает ошибку до тех пор, пока не будет запущен некоторое время. Я использую последний официальный образ docker. Дополнительные данные будут с благодарностью.
4. Что касается меня, вам следует продолжить просмотр (анализ) кода для конкретных кодов ошибок (37, 47, как в вашем отчете). Сведение к некоторому воспроизводимому тестовому сценарию между тем, похоже, что ваша сеть (или хост, на котором вы используете memcached) имеет некоторые серьезные ошибки… Пока не могу сказать, какова точная причина этого. Извините, я не могу предложить вам ничего лучшего, это вектор, которому я бы следовал сам, по крайней мере, в этом случае. Я полагаю, что упоминание о просмотре системных журналов очевидно