我正在運行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