我正在运行python应用程序(flask + redis-py)与uwsgi + nginx和使用aws elasticache(redis 2.8.24)。我发现在高负载下(每秒500次请求/使用loader.io 30秒),我正在失去请求(对于这个测试,我只用了一个单个服务器没有负载平衡器,1个uwsgi实例,4个进程,用于测试)。 AWS Redis + uWSGI背后的NGINX - 高负载
我已经挖得更深一些,并发现这个负载下,一些要求ElastiCache是缓慢的。 例如:
- 正常负荷:cache_set时间0.000654935836792
- 重载:cache_set时间0.0122258663177 这不会发生的所有请求,只是随机occurres ..
我的AWS ElastiCache基于cache.m4.xlarge(默认AWS配置设置)上的2个节点。 查看已连接在过去3小时目前的客户:
我觉得这样做没有意义,因为目前14台服务器(其中8 XX 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的是只使用Unix套接字网络代理uWSGI。
这是我如何打开一个连接到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的-PY:2.10.5
- Redis的:24年2月8日
于是得出结论:
- 如果连接14台服务器,每台服务器有4个进程,并且每台服务器都打开一个连接到redis集群内的8个不同数据库,那么AWS客户端的计数会很低
- 什么导致请求响应时间爬升?
- 希望了解关于ElastiCache和/或uWSGI性能任何意见重载
奥兹,你能找到解决办法吗?我面临着完全相同的问题。从字面上看...... nginx + flask + uwsgi一直很好,但是因为我在Elasticache中添加了redis,所以我在Elasticache中遇到了长时间运行查询的问题。 – camelCase