哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

記一次調(diào)試python內(nèi)存泄露的問(wèn)題解決方案分享

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

掃碼添加小助手

加入工程師交流群

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

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

找到進(jìn)程id:

即 21610

我這里還沒傳幾張圖片就到78m了, 看來(lái)是內(nèi)存問(wèn)題. 其實(shí)生產(chǎn)環(huán)境占用更多, 因?yàn)樯a(chǎn)環(huán)境保密所以只能在測(cè)試環(huán)境測(cè)試比較少的數(shù)據(jù), 生產(chǎn)環(huán)境曾一度上升到3.7g的內(nèi)存占用.

這樣果斷不行啊. 我發(fā)現(xiàn)有新的文件上傳之后內(nèi)存占用就會(huì)增大, 初步斷定是dicom文件相關(guān)對(duì)象占用的內(nèi)存. 現(xiàn)在的首要工作就是找到一個(gè)能進(jìn)行內(nèi)存泄露的調(diào)試工具了.

說(shuō)道這里可能大家會(huì)有疑問(wèn), python作為動(dòng)態(tài)類型語(yǔ)言同時(shí)擁有垃圾回收機(jī)怎么會(huì)有內(nèi)存泄露? 其實(shí)也有可能出現(xiàn)內(nèi)存泄露的情況, 有如下幾種:

  1. 對(duì)象一直被全局變量所引用, 全局變量生命周期長(zhǎng).

  2. 垃圾回收機(jī)被禁用或者設(shè)置成debug狀態(tài), 垃圾回收的內(nèi)存不會(huì)被釋放.

  3. 也是非常罕見的內(nèi)存泄露的方式就是今天遇到的問(wèn)題, 我周旋這個(gè)問(wèn)題兩天才debug出來(lái), 現(xiàn)在分享給大家.客官請(qǐng)您繼續(xù)往下看

說(shuō)到查看python內(nèi)存泄露的工具, 其實(shí)有挺多, 現(xiàn)在簡(jiǎn)短介紹一下

  • gc: python 內(nèi)置模塊, 函數(shù)少功能基本, 使用簡(jiǎn)單, 作為python開發(fā)者里邊的內(nèi)容必須過(guò)一遍

  • objgraph: 可以繪制對(duì)象引用圖, 對(duì)于對(duì)象種類較少, 結(jié)構(gòu)比較簡(jiǎn)單的程序適用, 我這個(gè)一個(gè)庫(kù)套一個(gè)庫(kù), 內(nèi)存還用的這么多,

  • guppy: 可以對(duì)堆里邊的對(duì)象進(jìn)行統(tǒng)計(jì), 算是比較實(shí)用

  • pympler: 可以統(tǒng)計(jì)內(nèi)存里邊各種類型的使用, 獲取對(duì)象的大小

上邊這些雖然有用但是總是搞不到點(diǎn)子上, 上邊這些都需要改我的源程序, 比較費(fèi)勁, 線上的代碼不是說(shuō)改就能改的, 而且他們功能也都比較弱, 后來(lái)發(fā)現(xiàn)兩個(gè)強(qiáng)大的工具:

  • tracemalloc: 究極強(qiáng), 可以直接看到哪個(gè)(哪些)對(duì)象占用了最大的空間, 這些對(duì)象是誰(shuí), 調(diào)用棧是啥樣的, python3直接內(nèi)置, python2如果安裝的話需要編譯

  • pyrasite: 牛逼的第三方庫(kù), 可以滲透進(jìn)入正在運(yùn)行的python進(jìn)程動(dòng)態(tài)修改里邊的數(shù)據(jù)和代碼(其實(shí)修改代碼就是通過(guò)修改數(shù)據(jù)實(shí)現(xiàn))

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

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

pyrasite里邊有一個(gè)工具叫pyrasite-memory-viewer, 功能和guppy差不多, 不過(guò)可以對(duì)內(nèi)存使用統(tǒng)計(jì)和對(duì)象之間的引用關(guān)系進(jìn)行快照保存, 很易用也很強(qiáng)大.運(yùn)行

pyrasite-memory-viewer

記一次調(diào)試python內(nèi)存泄露的問(wèn)題解決方案分享

可以看到占用內(nèi)存最多的是DicomFileLike這種類型的對(duì)象.已經(jīng)達(dá)到上萬(wàn)個(gè), 這是不能忍受的.

就目前來(lái)看可能會(huì)有上邊說(shuō)的兩種內(nèi)存泄露原因?qū)е虏荒芑厥者@個(gè)對(duì)象.打開

pyrasite-shellpyrasite-shell

我先通過(guò)

gc.isenabled()

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

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

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

記一次調(diào)試python內(nèi)存泄露的問(wèn)題解決方案分享

所以我們的目的就是先找到一個(gè)對(duì)象然后一級(jí)一級(jí)的向上尋找相互的引用.

記一次調(diào)試python內(nèi)存泄露的問(wèn)題解決方案分享

到這里發(fā)現(xiàn)其實(shí)沒有更多的全局變量指向這個(gè)d了, 而且發(fā)現(xiàn)所以有的方法的對(duì)象地址和d是相同的, 說(shuō)明了這個(gè)對(duì)象其實(shí)是自循環(huán)引用的.

那么python不可能不支持循環(huán)引用對(duì)象的回收吧? 跟著這個(gè)問(wèn)題我查了一下stackoverflow

Does Python GC deal with reference-cycles like this?

這個(gè)問(wèn)題的第一個(gè)回答介紹的很清楚了, 如果用戶不自定類的__del__方法, gc可以回收帶有自引用的對(duì)象, 但是你自己實(shí)現(xiàn)了__del__方法就不行了.

這就是python內(nèi)存泄露的第三個(gè)可能.

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

總結(jié)

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

在這個(gè)過(guò)程中用到的其他幾個(gè)hack的技巧有:

查看進(jìn)程的線程數(shù)量

根據(jù)對(duì)象的id/address動(dòng)態(tài)獲取對(duì)象

查看垃圾回收的日志


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1965

    瀏覽量

    39846
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4882

    瀏覽量

    90285

原文標(biāo)題:記一次調(diào)試python內(nèi)存泄露的問(wèn)題

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MAX17000評(píng)估套件:DDR內(nèi)存電源解決方案的利器

    MAX17000評(píng)估套件:DDR內(nèi)存電源解決方案的利器 作為電子工程師,我們?cè)谠O(shè)計(jì)DDR內(nèi)存電源解決方案時(shí),常常需要個(gè)可靠且高效的評(píng)估工具
    的頭像 發(fā)表于 04-02 15:30 ?113次閱讀

    FPGA時(shí)序收斂的痛點(diǎn)與解決之道——從一次高速接口調(diào)試談起

    在FPGA開發(fā)中,時(shí)序收斂往往是項(xiàng)目后期最令人頭疼的環(huán)節(jié)。許多工程師都有過(guò)這樣的經(jīng)歷:RTL仿真通過(guò),綜合布線后卻出現(xiàn)大量時(shí)序違例,為了滿足時(shí)序不得不反復(fù)修改代碼、調(diào)整約束,甚至重構(gòu)設(shè)計(jì)。一次偶然
    的頭像 發(fā)表于 03-11 11:43 ?313次閱讀

    變頻器使用過(guò)程中的參數(shù)調(diào)試

    變頻器作為現(xiàn)代工業(yè)控制系統(tǒng)中不可或缺的關(guān)鍵設(shè)備,其參數(shù)調(diào)試的準(zhǔn)確性直接關(guān)系到電機(jī)運(yùn)行效率、設(shè)備壽命及生產(chǎn)安全。在實(shí)際應(yīng)用中,約60%的變頻器故障源于參數(shù)設(shè)置不當(dāng),這凸顯了科學(xué)調(diào)試的重要性。本文將系統(tǒng)闡述變頻器參數(shù)調(diào)試的核心要點(diǎn)、
    的頭像 發(fā)表于 02-28 15:46 ?389次閱讀

    與軸一次成型的微電機(jī)轉(zhuǎn)子磁鐵

    在微型電機(jī)領(lǐng)域,與軸一次成型的轉(zhuǎn)子磁鐵正逐漸成為種被廣泛采用的結(jié)構(gòu)方案,相比傳統(tǒng)“磁鐵+轉(zhuǎn)軸后裝配”的形式,這類轉(zhuǎn)子在結(jié)構(gòu)、性能和致性方面都有明顯優(yōu)勢(shì),特別適合對(duì)體積、精度和可靠性
    的頭像 發(fā)表于 01-27 11:40 ?455次閱讀
    與軸<b class='flag-5'>一次</b>成型的微電機(jī)轉(zhuǎn)子磁鐵

    光伏一次調(diào)頻設(shè)備/一次調(diào)頻裝置|光伏一次調(diào)頻涉網(wǎng)試驗(yàn)/光伏電站一次調(diào)頻建設(shè)改造方案

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

    光伏一次調(diào)頻設(shè)備,光伏電站一次調(diào)頻建設(shè)改造方案

    分布式光伏電站,又要面臨改造投資問(wèn)題,壓力較大。如何選擇質(zhì)優(yōu)價(jià)廉的一次調(diào)頻產(chǎn)品改造方案既能滿足電網(wǎng)要求,又能節(jié)約投資成本。是光伏業(yè)主和二集成商共同要考慮的問(wèn)題。本視頻就從一次調(diào)頻的基
    發(fā)表于 01-16 20:06

    車間協(xié)議戰(zhàn)爭(zhēng)調(diào)停者:一次MODBUS TCP與PROFIBUS的融合實(shí)戰(zhàn)

    ?車間協(xié)議戰(zhàn)爭(zhēng)調(diào)停者:一次MODBUS TCP與PROFIBUS的融合實(shí)戰(zhàn) 去年,我們團(tuán)隊(duì)接到個(gè)改造項(xiàng)目:家大型鋰電池制造廠希望整合其新舊設(shè)備的數(shù)據(jù)流。工廠情況很典型——新建的M
    的頭像 發(fā)表于 12-22 14:10 ?285次閱讀
    車間協(xié)議戰(zhàn)爭(zhēng)調(diào)停者:<b class='flag-5'>記</b><b class='flag-5'>一次</b>MODBUS TCP與PROFIBUS的融合實(shí)戰(zhàn)

    專業(yè)修復(fù):一次成功的Keysight MSO9254A示波器不開機(jī)故障維修

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

    解析一次消諧和二消諧的差異與應(yīng)用場(chǎng)景

    在電力系統(tǒng)中,消諧裝置是保障系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵設(shè)備,它可以有效消除諧振過(guò)電壓,避免因諧振引發(fā)的設(shè)備損壞和停電事故。一次消諧器和微機(jī)消諧裝置,都可以用于PT柜,保護(hù)電壓互感器。 一次消諧器和微機(jī)消諧
    的頭像 發(fā)表于 12-11 11:33 ?624次閱讀

    WebGL/Canvas 內(nèi)存泄露分析

    在構(gòu)建高性能、長(zhǎng)周期運(yùn)行的 WebGL/Canvas 應(yīng)用(如 3D 編輯器、數(shù)據(jù)可視化平臺(tái))時(shí),內(nèi)存管理是個(gè)至關(guān)重要且極具挑戰(zhàn)性的課題。 開發(fā)者通常面臨的內(nèi)存泄漏問(wèn)題,其根源遠(yuǎn)比簡(jiǎn)單
    的頭像 發(fā)表于 10-21 11:40 ?520次閱讀
    WebGL/Canvas <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄露</b>分析

    termux調(diào)試python猜數(shù)字游戲

    用termux做個(gè)猜數(shù)字游戲 下面是在Termux中創(chuàng)建猜數(shù)字游戲的步驟及完整實(shí)現(xiàn)方案,結(jié)合Python實(shí)現(xiàn)(最適配Termux環(huán)境): ? 、環(huán)境準(zhǔn)備(Termux基礎(chǔ)
    發(fā)表于 08-29 17:15

    伺服控制器干擾問(wèn)題解決方案

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

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

    近年來(lái),物聯(lián)網(wǎng)設(shè)備和可穿戴設(shè)備的快速普及,使得對(duì)續(xù)航時(shí)間更長(zhǎng)、體積更小的原電池供電設(shè)備的需求日益增長(zhǎng)。特瑞仕提供針對(duì)搭載原電池的設(shè)備優(yōu)化的電源IC解決方案
    的頭像 發(fā)表于 07-02 09:20 ?954次閱讀
    小型低功耗<b class='flag-5'>一次</b>電池<b class='flag-5'>解決方案</b>

    聚徽分享上架式工控體機(jī)兼容性問(wèn)題解決方案:驅(qū)動(dòng)適配與系統(tǒng)調(diào)試實(shí)戰(zhàn)

    和使用過(guò)程中常常面臨兼容性問(wèn)題。本文將圍繞驅(qū)動(dòng)適配與系統(tǒng)調(diào)試兩個(gè)方面,分享上架式工控體機(jī)兼容性問(wèn)題的解決方案與實(shí)戰(zhàn)經(jīng)驗(yàn)。 二、上架式工控體機(jī)兼容性問(wèn)題概述 (
    的頭像 發(fā)表于 06-24 16:07 ?1052次閱讀

    一次消諧裝置與二消諧裝置區(qū)別、一次消諧器與二消諧器的區(qū)別

    一次消諧器與二消諧器是電力系統(tǒng)中用于抑制諧振過(guò)電壓的不同裝置,主要區(qū)別如下: 安裝位置:一次消諧器串聯(lián)于電壓互感器(PT)一次側(cè)中性點(diǎn)與地之間,直接承受高電壓;二
    的頭像 發(fā)表于 05-07 09:58 ?4848次閱讀
    <b class='flag-5'>一次</b>消諧裝置與二<b class='flag-5'>次</b>消諧裝置區(qū)別、<b class='flag-5'>一次</b>消諧器與二<b class='flag-5'>次</b>消諧器的區(qū)別
    怀集县| 桦甸市| 阿城市| 西昌市| 湖州市| 岢岚县| 车险| 民乐县| 房产| 桑日县| 汉寿县| 永安市| 忻州市| 镇雄县| 金溪县| 临漳县| 西安市| 磐安县| 澜沧| 利川市| 民和| 平顺县| 绥阳县| 绥滨县| 大理市| 东乡县| 福贡县| 通州市| 大邑县| 昌图县| 隆回县| 枣强县| 宜都市| 墨脱县| 繁峙县| 万载县| 从江县| 台中县| 龙江县| 清流县| 南澳县|