今天在部署python代碼到預生產環境時,web站老是出現redis鏈接未初始化,無法連接到服務的提示,比對了一下開發環境與測試環境代碼,完全一致,然後就是查看各種日誌,排查了半天也沒有查明是什麼原因引起的。 沒有辦法的情況下,直接登錄伺服器,從uwsgi與nginx中卸載掉這個web服務,然後暴力 ...
今天在部署python代碼到預生產環境時,web站老是出現redis鏈接未初始化,無法連接到服務的提示,比對了一下開發環境與測試環境代碼,完全一致,然後就是查看各種日誌,排查了半天也沒有查明是什麼原因引起的。
沒有辦法的情況下,直接登錄伺服器,從uwsgi與nginx中卸載掉這個web服務,然後暴力的在命令操作符下輸入python main.py,執行訪問發現又正常了......狂吐血400CC...然後是各種懷疑uwsgi和nginx,查看配置與其他服務正常,排除完後只能回歸到檢查代碼。
靜下心來查看優化過後的代碼,發現為了保持redis只有一個長鏈接,在web服務主程式啟動時會對redis模塊進行一次初始化,在代碼中用global將redis鏈接設置為靜態全局變數,redis鏈接只需要初始一次
# 初始化Redis緩存鏈接 r = None def set_redis_config(_redis): """ 設置redis配置參數 :param _redis: redis配置參數 """ global r # 初始化Redis緩存鏈接 try: if not r: r = redis.Redis(host=_redis.get('server', ''), port=_redis.get('post', ''), db=_redis.get('db', ''), password=_redis.get('pwd', ''), socket_timeout=1, socket_connect_timeout=1) log_helper.info('初始化redis緩存鏈接') except: pass
然後將初始化代碼改變地方,放在勾子里,再次啟用uwsgi與nginx服務,運行終於正常了。
找了朋友問問得知,原來uwsgi是多進程服務,聽了後心裡比較擔心,會不會因為多進程關係使global失效,造成改造後長鏈接過多使redis服務崩潰了,馬上使用jmeter進行了壓力測試,壓了300個併發跑了一段時間,連上redis服務輸入client list命令,查看已鏈接的客戶端列表,發現沒幾個,打開日誌發現在高併發時,初始化代碼執行的並不多,也就是說使用uwsgi雖然造成了redis長鏈接需要經常創建,但global還是起到了一定的作用,沒有產生很差的結果。
由於redis要經常重新創建鏈接,擔心它會影響性能所以對其中一個介面進行改造,一個使用redis讀取數據,另一個直接讀取postgresql資料庫,然後對兩個介面通過手動刷新頁面方式進行反覆訪問後,查看介面日誌占用的時間,發現刷新慢時,使用redis方式會占用比較多時間,而訪問非常頻繁時,反覆調用一個長鏈接的機會會多很多,影響不大,兩種方式訪問的效果差不多。
當然和沒有使用uwsgi的開發環境與測試環境對比來看,redis要經常創建新鏈接會占用一定的開銷,影響了部分性能。暫時還沒有想到好的解決辦法,先記錄一下,以後有時間再嘗試用其他方式測試看看效果。
版權聲明:
本文由AllEmpty原創併發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過[email protected] 聯繫我,非常感謝。
發表本編內容,主要是為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。
更多內容,敬請觀註博客:http://www.cnblogs.com/EmptyFS/