tornado+sqlalchemy+celery,資料庫連接消耗在哪裡

来源:http://www.cnblogs.com/summery91/archive/2016/12/22/6209664.html
-Advertisement-
Play Games

隨著公司業務的發展,網站的日活數也逐漸增多,以前只需要考慮將所需要的功能實現就行了,當日活越來越大的時候,就需要考慮對伺服器的資源使用消耗情況有一個清楚的認知。 最近老是發現資料庫的連接數如果幾天不重啟伺服器,就經常會發現有很多sleep很久的資料庫連接,對資料庫伺服器的性能有較大的影響。所以需要知 ...


  隨著公司業務的發展,網站的日活數也逐漸增多,以前只需要考慮將所需要的功能實現就行了,當日活越來越大的時候,就需要考慮對伺服器的資源使用消耗情況有一個清楚的認知。
     最近老是發現資料庫的連接數如果幾天不重啟伺服器,就經常會發現有很多sleep很久的資料庫連接,對資料庫伺服器的性能有較大的影響。所以需要知道我們的資料庫連接到底是在哪裡被創建的,什麼時候會被覆用,什麼時候會被釋放。
     測試的時候使用的代碼,適當進行調整,可幫助梳理清楚場景。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (sessionmaker)
from sqlalchemy import create_engine
import time

## []括起來的參數,這邊就是做一個占位符
engine = create_engine("mysql+{driver}://{username}:{password}@{server}/{database}?charset={charset}"\
    .format(
        driver   = [MYSQL_DRIVER],
        username = [MYSQL_USERNAME],
        password = [MYSQL_PASSWORD],
        server   = [MYSQL_MASTER_SERVER],
        database = [DB_NAME],
        charset  = [DB_CHARSET]
    ),
    pool_size    = 20,
    max_overflow = 100,
    pool_recycle = 7200,
    echo         = False  # 調試模式,開啟後可輸出所有查詢語句
)
DBSession = sessionmaker(bind=engine)
session=DBSession()
engine.execute("select 1;")
time.sleep(10)
session.execute("select 1;")
engine.execute("select 1;")
# session.close()
time.sleep(10)
session1=DBSession()
session1.execute("select 1;")
# session1.execute("select 1;")
engine.execute("select 1;")

    就是在上面的這一部分代碼的測試,可以對以下的問題給出一些個人理解:
1.什麼時候創建新的資料庫連接的?
   A.engine.excute
   B.session.excute
   C.session.query
2.什麼時候關掉sqlachemy裡面的連接(其實是將可用的資料庫連接丟回到sqlachemy的連接池裡面去):
   A.engine的excute執行完成時
   B.session.close()
   C.engine定義裡面設置的pool_recycle時間到期,如果某一個session長期占有,沒有close,在這個到期了之後就會被回收回去;
3.什麼時候關掉資料庫連接:
   A.python3進程關掉,比如kill或者重啟伺服器的時候;
   B.資料庫連接的sleep時間超過wait_timeout的時候;比如在一個http請求裡面,先用了一次session.query,然後休眠了10秒鐘,這個時候我們的資料庫的wait_timeout如果設置為5秒,在query執行完成之後,資料庫就會顯示連接進入sleep狀態,超過5秒就會被關掉。這個時候,如果我們如果需要繼續用這個session來進行查詢的話,就會提示“MySQL connection not available”

    所以,為了不產生比較多的資料庫連接,導致無謂的資源消耗,就是一定要註意儘量少創建新的,使用完了以後,一定要註意丟回到連接池中;當然還要保證,資料庫的wait_timeout時間不能低於engine的pool_recyle時間,否則會出現mysql連接不可用的提示。
    在tornado裡面,可以在base的on_finish方法裡面將本次請求產生的session關掉;
    使用celery的時候也需要註意,可以在函數執行的末尾關掉本次創建的session,也可以寫裝飾器;並且需要註意,對函數異常也要進行捕獲。

本次的測試過程使用到的一些知識:
    ①.查詢資料庫的連接超時設置:show variables like '%wait_timeout%';
    ②.查詢資料庫的最大可用連接數:show variables like '%max_connections%';
    ③.設置資料庫的連接超時:set wait_timeout=28800;||set global wait_timeout=5;(這個global參數待查)
    ④.查看當前連接的使用情況:show status like 'Threads%';
    ⑤.查看所有的資料庫連接情況:show full processlist;
    ⑥.lsof -i :3306 查看資料庫的埠[3306]現在運行的情況

不過,後續還是需要把sqlachemy 官網推薦的web如何使用session的英文擼一擼。。。http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-faq-whentocreate

然後還有一個疑惑,是在使用⑥的時候,有發現有一些celery程式有出現closewait的狀態。
      tcp連接有3次握手,斷開連接有4次握手。closewait狀態的產生,其實就是如果A是主動斷開的一方,那麼在B這邊顯示就會是CloseWait狀態。
      所以celery出現closewait,那就說明是mysql先關閉了連接,但是,celery和MySQL的連接,也是,一個是使用的是db_config裡面的engine,回收時間是7200,mysql的wait_timeout是28800,按道理不會出現資料庫中關掉了,但是celery裡面沒關掉的情況。。。
      可能是我還是有哪裡沒有弄的很透徹。。。

 


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

-Advertisement-
Play Games
更多相關文章
  • "檢索COM類工廠中 CLSID為 {00024500-0000-0000-C000-000000000046}的組件時失敗,原因是出現以下錯誤: 80070005" 問題的解決 ...
  • 菜單收縮有很多種方法具體如何實現還是看個人想法: 第一種通過後臺控制收起與展開: 效果圖: 代碼 : <Grid> <Grid.ColumnDefinitions> <ColumnDefinition x:Name="cd" Width="154"/> <ColumnDefinition /> </ ...
  • 用html實現圖片上傳 後臺採用.net其中在這裡要借用一個js插件 在這裡我會寫一個圖片上傳的一個小Demo,有不全的地方多多包容,和提議, 我把已經寫好的demo已經上傳到百度雲 在這裡可以下載 http://pan.baidu.com/s/1bG2934 開始 html中的內容是 <body> ...
  • 年關將至,對於大部分程式員來說,馬上就可以閑下來一段時間了,然而在這個閑暇的時間里,唯有爭論哪門語言更好可以消磨時光,估計最近會有很多關於java與.net的博文出現,我表示要作為一個吃瓜群眾,靜靜的看著大佬們發表心情。 以上的廢話說的夠多了,這裡就不再廢話了,還是切入正題吧。 在項目開發中,對於系 ...
  • 本文要介紹的是ASP.NET怎樣讀寫文本文件,但更重要的是實現的過程。使用的工具是Visual Studio 2015 ,.NET版本是4.6.1 。一共建立的2個項目,HoverTreePanel和HoverTreeWeb,都是ASP.NET項目。文章末尾附源碼下載。項目結果如下圖:讀寫文件功能在 ...
  • 在多線程(線程同步)中,我們將學習多線程中操作共用資源的技術,學習到的知識點如下所示: 執行基本的原子操作 使用Mutex構造 使用SemaphoreSlim構造 使用AutoResetEvent構造 使用ManualResetEventSlim構造 使用CountDownEvent構造 使用Bar ...
  • 目錄 前言 OAuth2.0簡介 授權模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模擬OpenID認證 通過authorization code授權模式申請令牌 通過implicit授權模式申請令牌 通過password模式申請令牌 通過c ...
  • 你真的懂異常(Exception)嗎? 目錄 異常介紹 異常的特點 怎樣使用異常 處理異常的 try-catch-finally 捕獲異常的 Catch 塊 釋放資源的 Finally 塊 捕獲異常的 Catch 塊 釋放資源的 Finally 塊 一、異常介紹 我們平時在寫程式時,無意中(或技術不 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...