python+uwsgi導致redis無法長鏈接引起性能下降問題記錄

来源:http://www.cnblogs.com/EmptyFS/archive/2016/12/27/6227690.html
-Advertisement-
Play Games

今天在部署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/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在項目常常要和數據表格打交道。 現在BS的通常做法都是前端用一個js的Grid控制項, 然後通過ajax的方式從後臺載入數據, 然後將數據和Grid綁定。 數據往往不是一頁可以顯示完的, 所以要加分頁;然後就是根據關鍵欄位做排序, 做篩選過濾。 作為後端人員, 要考慮的是如何優雅的實現分頁、排序、篩選 ...
  • 最近一點公益被傳播的風風火火,起點聯盟作為和一點公益差不多的模式進來更是大肆開招商會,讓人覺得這兩個平臺很賺錢,那麼肯定有很多人和我一樣好奇,起點聯盟和一點公益系統是怎麼開發的?下麵我把這兩個系統的具體功能寫出來,希望大家給點開發思路。 1.累積消費達500元,獲得一顆愛心,激勵109%,得548顆 ...
  • Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • 目錄: 前言 設計(完成擴展) 實現效果 擴展設計方案 擴展後代碼結構 集思廣益(問題) 前言: 在上一篇文章我寫瞭如何重建IDbCommandTreeInterceptor來實現創建人、創建時間、更新人、更新時間的統一賦值。看起來會比較複雜,有人提到了重寫SaveChanges來實現,這個是很好的 ...
  • 問題: eclipse 啟動後,啥也不幹,就一直在loading descriptor for XXX (XXX為工程名),,其他什麼操作都不能操作。 如下圖所示,保存文件也無法保存。 這個怎麼辦? 解決方法: Eclipse左側的Project Explorer的右邊一個按鈕鈕,滑鼠移上去會提示” ...
  • 今天如約放送函數部分吧,畢竟預告都出了,“廣電”也沒禁我...... ...
  • 在 網上看到使用PHP寫的ValidateCode生成驗證碼碼類,感覺不錯,特拿來分析學習一下 ...
  • 又見面啦!!!經過上一章的學習,我們大概對Hibernate框架有所瞭解。接下來進入我們的第二階段——實戰! 準備資料庫 這裡使用MySQL作為示範。 如下圖: 資料庫的操作暫時就到這裡。 Ps:沒有資料庫基礎的朋友們,請先學習資料庫基礎再來學習哦! 準備Hibernate的jar包 至於你下載什麼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...