Я запускаю приложение python (фляга + redis-py) с uwsgi + nginx и используя aws elasticache (redis 2.8.24).AWS Redis + uWSGI за NGINX - высокая нагрузка
При попытке улучшить время отклика приложения, я заметил, что при высокой нагрузке (500 запросов в секунду/в течение 30 секунд с использованием loader.io) я теряю запросы (для этого теста я использую только один сервер без балансировки нагрузки, 1 экземпляр uwsgi, 4 процесса, предназначенные для тестирования).
Я углубился и узнал, что под этой нагрузкой некоторые запросы к ElastiCache медленны. , например:
- нормальная нагрузка: время cache_set +0,000654935836792
- тяжелая нагрузка: время cache_set 0.0122258663177 этого не происходит для всех запросов, просто случайно occurres ..
Моего AWS ElastiCache основан на 2 узлах на cache.m4.xlarge (настройки конфигурации AWS по умолчанию). См текущих клиентов, подключенных в течение последних 3-х часов:
Я думаю, что это не имеет смысла, так как в настоящее время 14 серверов (8 из них с высокой интенсивностью движения ХХ RPS использовать этот кластер), я ожидал увидеть гораздо более высокая клиентская ставка.
uWSGI конфигурации (версия 2.0.5.1)
processes = 4
enable-threads = true
threads = 20
vacuum = true
die-on-term = true
harakiri = 10
max-requests = 5000
thread-stacksize = 2048
thunder-lock = true
max-fd = 150000
# currently disabled for testing
#cheaper-algo = spare2
#cheaper = 2
#cheaper-initial = 2
#workers = 4
#cheaper-step = 1
Nginx является только веб-прокси uWSGI с помощью UNIX сокета.
Это, как я открыть соединение с Redis:
rdb = [
redis.StrictRedis(host='server-endpoint', port=6379, db=0),
redis.StrictRedis(host='server-endpoint', port=6379, db=1)
]
Это, как я установил значение, например:
def cache_set(key, subkey, val, db, cache_timeout=DEFAULT_TIMEOUT):
t = time.time()
merged_key = key + ':' + subkey
res = rdb[db].set(merged_key, val, cache_timeout)
print 'cache_set time ' + str(time.time() - t)
return res
cache_set('prefix', 'key_name', 'my glorious value', 0, 20)
Это, как я получаю значение:
def cache_get(key, subkey, db, _eval=False):
t = time.time()
merged_key = key + ':' + subkey
val = rdb[db].get(merged_key)
if _eval:
if val:
val = eval(val)
else: # None
val = 0
print 'cache_get time ' + str(time.time() - t)
return val
cache_get('prefix', 'key_name', 0)
Версия:
- uWSGI: 2.0.5.1
- Колба: 0.11.1
- Redis-ру: 2.10.5
- Redis: 2.8.24
Итак вывод:
- Почему клиенты AWS считаются низкими, если подключено 14 серверов, каждый из которых имеет 4 процесса, и каждый из них открывает соединение с 8 различными базами данных в кластере redis
- Что заставляет время отклика запросов подниматься?
- бы оценить какие-либо рекомендации относительно ElastiCache и/или производительность uWSGI при большой нагрузке
Orz, смогли ли вы найти решение? Я столкнулся с той же проблемой. Буквально ... nginx + flask + uwsgi все в порядке, но поскольку я добавил redis на Elasticache, я столкнулся с проблемами длительных запросов в Elasticache. – camelCase