国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

記一次調試python內存泄露的問題解決方案分享

馬哥Linux運維 ? 2017-12-18 16:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這兩天由于公司需要, 自己編寫了一個用于接收dicom文件(醫學圖像文件)的server. 經過各種coding-debuging-coding-debuging之后, 終于上線了, 上線后心里美滋滋的, 一切正常.

第二天一上班, 負責人和我說接收太慢了, 卡的要死. 我想難道是python本身的問題?(程序員本征思維)我好奇的打開了終端輸入

找到進程id:

即 21610

我這里還沒傳幾張圖片就到78m了, 看來是內存問題. 其實生產環境占用更多, 因為生產環境保密所以只能在測試環境測試比較少的數據, 生產環境曾一度上升到3.7g的內存占用.

這樣果斷不行啊. 我發現有新的文件上傳之后內存占用就會增大, 初步斷定是dicom文件相關對象占用的內存. 現在的首要工作就是找到一個能進行內存泄露的調試工具了.

說道這里可能大家會有疑問, python作為動態類型語言同時擁有垃圾回收機怎么會有內存泄露? 其實也有可能出現內存泄露的情況, 有如下幾種:

  1. 對象一直被全局變量所引用, 全局變量生命周期長.

  2. 垃圾回收機被禁用或者設置成debug狀態, 垃圾回收的內存不會被釋放.

  3. 也是非常罕見的內存泄露的方式就是今天遇到的問題, 我周旋這個問題兩天才debug出來, 現在分享給大家.客官請您繼續往下看

說到查看python內存泄露的工具, 其實有挺多, 現在簡短介紹一下

  • gc: python 內置模塊, 函數少功能基本, 使用簡單, 作為python開發者里邊的內容必須過一遍

  • objgraph: 可以繪制對象引用圖, 對于對象種類較少, 結構比較簡單的程序適用, 我這個一個庫套一個庫, 內存還用的這么多,

  • guppy: 可以對堆里邊的對象進行統計, 算是比較實用

  • pympler: 可以統計內存里邊各種類型的使用, 獲取對象的大小

上邊這些雖然有用但是總是搞不到點子上, 上邊這些都需要改我的源程序, 比較費勁, 線上的代碼不是說改就能改的, 而且他們功能也都比較弱, 后來發現兩個強大的工具:

  • tracemalloc: 究極強, 可以直接看到哪個(哪些)對象占用了最大的空間, 這些對象是誰, 調用棧是啥樣的, python3直接內置, python2如果安裝的話需要編譯

  • pyrasite: 牛逼的第三方庫, 可以滲透進入正在運行的python進程動態修改里邊的數據和代碼(其實修改代碼就是通過修改數據實現)

我開始的時候非常想用tracemalloc, 可是對python2特別不友好, 需要重新編譯python, 而且只能用python2.7.8編譯, 編譯好了也不容易嵌入到虛擬環境中, 頭大, 果斷換第二個.

注: pyrasite使用之前需要在root用戶下運行命令 echo 0 > /proc/sys/kernel/yama/ptrace_scope后才能正常使用

pyrasite里邊有一個工具叫pyrasite-memory-viewer, 功能和guppy差不多, 不過可以對內存使用統計和對象之間的引用關系進行快照保存, 很易用也很強大.運行

pyrasite-memory-viewer

記一次調試python內存泄露的問題解決方案分享

可以看到占用內存最多的是DicomFileLike這種類型的對象.已經達到上萬個, 這是不能忍受的.

就目前來看可能會有上邊說的兩種內存泄露原因導致不能回收這個對象.打開

pyrasite-shellpyrasite-shell

我先通過

gc.isenabled()

判斷gc是否在工作, 結果發現是True, 也就是正常工作的, 而且使用gc.setdebug(gc.STATUS)設置gc為debug模式, 然后gc.collect()進行垃圾回收發現并沒有更多內存釋放,則否認了第二種泄露的可能.

現在來看gc.garbage中不能被釋放的對象, 讓我來檢查一下是否有全局變量指向它們(這里極有可能是一個列表或者是一個字典)

gc.garbage 可以看到被塞滿了各種DicomFileLike對象

記一次調試python內存泄露的問題解決方案分享

所以我們的目的就是先找到一個對象然后一級一級的向上尋找相互的引用.

記一次調試python內存泄露的問題解決方案分享

到這里發現其實沒有更多的全局變量指向這個d了, 而且發現所以有的方法的對象地址和d是相同的, 說明了這個對象其實是自循環引用的.

那么python不可能不支持循環引用對象的回收吧? 跟著這個問題我查了一下stackoverflow

Does Python GC deal with reference-cycles like this?

這個問題的第一個回答介紹的很清楚了, 如果用戶不自定類的__del__方法, gc可以回收帶有自引用的對象, 但是你自己實現了__del__方法就不行了.

這就是python內存泄露的第三個可能.

回頭看DicomFileLike的源碼, 果然在__init__函數上方定義了一個__del__函數, 我這里使用了一個猴子補丁刪除了這個方法, 內存泄露的問題就得以解決了.

總結

到這里整個調試過程就結束了, 然而實際上過程中做了很多曲折的工作, 在pyrasite中會找到幾個引用DicomFileLike對象的object, 比較不容易辨別, 最開始我以為是某個全局的對象引用的DicomFileLike, 比如是列表什么的, 后來發現其實是locals()和globals()字典, 如果使用pyrasite-memory-viewer保存下來的數據會發現有一個大列表指向所有沒有回收的DicomFileLike對象, 捯飭半天發現其實是gc.garbage, 好囧, 曾讓我一度懷疑是第一種泄露方式, 但是怎么找這個對象都沒有找到. 其中還有幾次看到線程達到140+, 后來發現其實和線程一點關系沒有, 線程維持在這個數目上邊很穩定.

在這個過程中用到的其他幾個hack的技巧有:

查看進程的線程數量

根據對象的id/address動態獲取對象

查看垃圾回收的日志


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程語言
    +關注

    關注

    10

    文章

    1964

    瀏覽量

    39558
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90025

原文標題:記一次調試python內存泄露的問題

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    變頻器使用過程中的參數調試

    變頻器作為現代工業控制系統中不可或缺的關鍵設備,其參數調試的準確性直接關系到電機運行效率、設備壽命及生產安全。在實際應用中,約60%的變頻器故障源于參數設置不當,這凸顯了科學調試的重要性。本文將系統闡述變頻器參數調試的核心要點、
    的頭像 發表于 02-28 15:46 ?116次閱讀

    與軸一次成型的微電機轉子磁鐵

    在微型電機領域,與軸一次成型的轉子磁鐵正逐漸成為種被廣泛采用的結構方案,相比傳統“磁鐵+轉軸后裝配”的形式,這類轉子在結構、性能和致性方面都有明顯優勢,特別適合對體積、精度和可靠性
    的頭像 發表于 01-27 11:40 ?328次閱讀
    與軸<b class='flag-5'>一次</b>成型的微電機轉子磁鐵

    JTAG/SWD禁用導致無法燒寫的解決辦法

    開始滾動,會之后會提示出錯。直接關閉它,放開復位鍵。   3.這時候單片機已經停止程序了,SWD那些端口已經恢復原有的調試端口功能,這時候你再一次按下載鍵便可以下載程序了,問題解決
    發表于 01-21 06:05

    光伏一次調頻設備/一次調頻裝置|光伏一次調頻涉網試驗/光伏電站一次調頻建設改造方案

    改造方案既能滿足電網要求,又能節約投資成本。是光伏業主和二集成商共同要考慮的問題。大家好我是廣州智昊小曾本視頻我就從一次調頻的基本原理,裝置的結構形態,安裝部署,光伏電站的應用方案
    的頭像 發表于 01-17 08:54 ?1186次閱讀
    光伏<b class='flag-5'>一次</b>調頻設備/<b class='flag-5'>一次</b>調頻裝置|光伏<b class='flag-5'>一次</b>調頻涉網試驗/光伏電站<b class='flag-5'>一次</b>調頻建設改造<b class='flag-5'>方案</b>

    光伏一次調頻設備,光伏電站一次調頻建設改造方案

    分布式光伏電站,又要面臨改造投資問題,壓力較大。如何選擇質優價廉的一次調頻產品改造方案既能滿足電網要求,又能節約投資成本。是光伏業主和二集成商共同要考慮的問題。本視頻就從一次調頻的基
    發表于 01-16 20:06

    車間協議戰爭調停者:一次MODBUS TCP與PROFIBUS的融合實戰

    ?車間協議戰爭調停者:一次MODBUS TCP與PROFIBUS的融合實戰 去年,我們團隊接到個改造項目:家大型鋰電池制造廠希望整合其新舊設備的數據流。工廠情況很典型——新建的M
    的頭像 發表于 12-22 14:10 ?199次閱讀
    車間協議戰爭調停者:<b class='flag-5'>記</b><b class='flag-5'>一次</b>MODBUS TCP與PROFIBUS的融合實戰

    專業修復:一次成功的Keysight MSO9254A示波器不開機故障維修

    一次成功的Keysight MSO9254A示波器不開機故障維修
    的頭像 發表于 12-16 17:04 ?578次閱讀
    專業修復:<b class='flag-5'>記</b><b class='flag-5'>一次</b>成功的Keysight MSO9254A示波器不開機故障維修

    解析一次消諧和二消諧的差異與應用場景

    在電力系統中,消諧裝置是保障系統穩定運行的關鍵設備,它可以有效消除諧振過電壓,避免因諧振引發的設備損壞和停電事故。一次消諧器和微機消諧裝置,都可以用于PT柜,保護電壓互感器。 一次消諧器和微機消諧
    的頭像 發表于 12-11 11:33 ?519次閱讀

    WebGL/Canvas 內存泄露分析

    在構建高性能、長周期運行的 WebGL/Canvas 應用(如 3D 編輯器、數據可視化平臺)時,內存管理是個至關重要且極具挑戰性的課題。 開發者通常面臨的內存泄漏問題,其根源遠比簡單
    的頭像 發表于 10-21 11:40 ?407次閱讀
    WebGL/Canvas <b class='flag-5'>內存</b><b class='flag-5'>泄露</b>分析

    termux調試python猜數字游戲

    用termux做個猜數字游戲 下面是在Termux中創建猜數字游戲的步驟及完整實現方案,結合Python實現(最適配Termux環境): ? 、環境準備(Termux基礎
    發表于 08-29 17:15

    伺服控制器干擾問題解決方案

    工程實踐案例,系統分析干擾源類型及傳播路徑,并提出多層級解決方案、干擾源識別與影響分析 1. 傳導干擾 ? 電源線引入的高頻噪聲(如變頻器回饋電流)通過共模方式侵入控制器,某汽車生產線曾因變頻器與伺服系統共用
    的頭像 發表于 07-31 18:13 ?1821次閱讀
    伺服控制器干擾<b class='flag-5'>問題解決方案</b>

    小型低功耗一次電池解決方案

    近年來,物聯網設備和可穿戴設備的快速普及,使得對續航時間更長、體積更小的原電池供電設備的需求日益增長。特瑞仕提供針對搭載原電池的設備優化的電源IC解決方案
    的頭像 發表于 07-02 09:20 ?869次閱讀
    小型低功耗<b class='flag-5'>一次</b>電池<b class='flag-5'>解決方案</b>

    聚徽分享上架式工控體機兼容性問題解決方案:驅動適配與系統調試實戰

    和使用過程中常常面臨兼容性問題。本文將圍繞驅動適配與系統調試兩個方面,分享上架式工控體機兼容性問題的解決方案與實戰經驗。 二、上架式工控體機兼容性問題概述 (
    的頭像 發表于 06-24 16:07 ?832次閱讀

    一次消諧裝置與二消諧裝置區別、一次消諧器與二消諧器的區別

    一次消諧器與二消諧器是電力系統中用于抑制諧振過電壓的不同裝置,主要區別如下: 安裝位置:一次消諧器串聯于電壓互感器(PT)一次側中性點與地之間,直接承受高電壓;二
    的頭像 發表于 05-07 09:58 ?4254次閱讀
    <b class='flag-5'>一次</b>消諧裝置與二<b class='flag-5'>次</b>消諧裝置區別、<b class='flag-5'>一次</b>消諧器與二<b class='flag-5'>次</b>消諧器的區別

    Python從入門到精通背手冊

    電子發燒友網站提供《Python從入門到精通背手冊.pdf》資料免費下載
    發表于 03-28 17:43 ?108次下載