memcached завершается с ошибкой после запуска на некоторое время

#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) имеет некоторые серьезные ошибки… Пока не могу сказать, какова точная причина этого. Извините, я не могу предложить вам ничего лучшего, это вектор, которому я бы следовал сам, по крайней мере, в этом случае. Я полагаю, что упоминание о просмотре системных журналов очевидно