Производительность кеша Django - PullRequest
2 голосов
/ 02 сентября 2011

Сейчас мы используем Redis для кэширования в памяти для нашего приложения Django (раньше мы использовали memcached, и нет большой разницы в производительности, мы используем Redis, потому что функция дампа диска).

Проблемав том, что производительность кеша Django, на мой взгляд, ужасна.У нас есть представление с 102 попаданиями в кеш (без пропусков), и это занимает 81 мс (только часть кеша, измеренная с помощью панели отладки Django).На мой взгляд - это огромное количество времени.Я знаю, что выполнение запросов к БД заняло бы в 10 раз больше времени (или даже в 100 раз), но даже с учетом этого факта производительность кеша не очень хорошая.в локальной сети с другими серверами.

Есть ли способ настроить производительность кэша в Django?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

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

Самое простое решение - переместить кэш redis на веб-сервер - локальный запрос выполняется намного быстрее.Это усложнит аннулирование кэша, но вы, вероятно, можете исправить это с помощью репликации - либо выполните все операции записи в главный узел и считайте данные с локального ведомого устройства, чтобы все узлы имели одинаковый кэш, либо выполните локальную запись с помощью главного узла, используемого для репликацииКоманда del для всех ведомых, когда вам нужно сделать объект недействительным.

Еще одна вещь, на которую стоит обратить внимание, это проблема производительности.300 мс для загрузки страницы - это не так уж плохо для пользователя.Это проблема, только если это означает, что вы не можете обрабатывать более 3 страниц в секунду для всех пользователей - маловероятно в этом случае, когда узким местом является задержка в сети, а не ЦП или локальный ввод / вывод.

3 голосов
/ 19 марта 2016

Задержка сети между хостами, вероятно, является причиной.Простое общение с Redis на локальном хосте займет + 200us (микросекунд) для маленьких ключей и значений.Memcached также обменивается данными по сети и поэтому испытывает ту же проблему задержки.Исходя из числа, которым вы поделились, каждый запрос занимает около 800 мкс.

Не все кэши взаимодействуют по сети.Более быстрый метод состоит в том, чтобы отобразить части памяти в кэш-памяти непосредственно в память процесса.Если вы используете несколько веб-серверов, то каждый из них будет иметь свой собственный кэш, но если вы будете последовательно направлять запросы (по IP-адресу, имени пользователя и т. Д.), Вы можете уменьшить количество кеш-пропусков.Предполагая, что вы переместили свою базу данных на отдельный хост-компьютер, у вас, вероятно, есть запасные циклы дисков, доступные на ваших веб-серверах.

Если вы хотите попробовать этот подход, рассмотрите возможность использования DiskCache ,лицензированная Apache2 библиотека дискового и файлового кэша, написанная на чистом Python и совместимая с Django.DiskCache включает в себя ряд тестов кеша и тестов кеша Django .Ключи и небольшие значения отображаются в памяти в памяти процесса Django, поэтому поиск выполняется очень быстро (в 3-12 раз быстрее, чем ваша установка).Как показано в тестах, задержка "get" даже меньше, чем Memcached (на localhost).Существует также ряд настраиваемых настроек , которые вы можете настроить по своему вкусу.

...