在我們的工作中,我們使用ddagent ver。5作為收集工具,收集和報告託管伺服器的效能指標,並對ddagent進行一定程度的定製。經過多次功能迭代,發現一批**執行時間長的託管伺服器占用了太多記憶體。分析問題機器上程序樹中每個節點的占用情況,可以看出ddagent集合程序的記憶體占用仍然很高。
我們將學習最基本的流程控制工具,比如
if 條件判斷for 迴圈while 迴圈
作為保證業務系統穩定執行的監控元件,存在記憶體洩漏,這自然是非常嚴重的,所以我們開始了我們的「故障排除之旅」。
if-elif-else 判斷
分析有很多任務具可以分析和匯出python程式的記憶體狀態。在這裡,我們使用pyrasite,它可以附加到正在執行的python程式,生成記憶體快照,並檢查當前哪些物件型別占用了多少記憶體,並從大到小排序。
使用命令非常簡單: pyrasite-memory-viewer ,同時會生成乙份快照檔案: /tmp/pyrasite--objects.json。
由於無法提供真實的生產資料,下面提到的所有資料都來自問題版本在測試環境中執行12小時後的取樣。
在pyrasite提供的cui檢視中,我們可以清楚地看到字典型別的物件例項占用的記憶體最多,達到3.4mb,有6621個例項:
while 迴圈
while迴圈也是一種常見的迴圈方式。這種迴圈通常以迴圈體類或條件方式結束。它不可能無限期地進行下去。
對於洩漏情況,我們有以下事實和猜測:
乙個或多個位置持續建立空字典物件,並且無法**它們,從而導致記憶體洩漏記憶體洩漏量隨時間而增加。在索引收集業務中,洩漏很可能是在每個收集過程中引起的,並在間隔期之後重複觸發我們看不到當前依賴的ddagent版本存在尚未關閉的相關問題,這可能是在我們的定製過程中引入的錯誤
[[ [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
[".../modules/monitor/bot/task.py",50,"run","super(repeattask, self).run()"],
[".../modules/monitor/bot/task.py",18,"run","self.check()"],
[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()www.cppcns.com"],
[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
], [
[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"程式設計客棧],
[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
[".../modules/monitor/bot/task.py",50,"run","super(repeattask, self).run()"],
[".../modules/monitor/bot/task.py",18,"run","self.check()"],
[".../modules/monitor/checks/collector.py",223,"wrapper","_check"],
[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
],程式設計客棧
[ [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
[".../modules/monitor/bot/task.py",50,"run","super(repeattask, self).run()"],
[".../modules/monitor/bot/task.py",18,"run","self.check()"],
[".../modules/monitor/checks/collector.py",223,"www.cppcns.comwrapper","_check.run()"],
[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
],...
重播我們不提「做好設計審查和規範審查」、「加強試驗階段質量檢驗工作」等「老生常談」,也值得我們反思。
要徹底防止和控制記憶體洩漏幾乎是不可能的,像rust這樣的安全程式語言也不能保證程式不會洩漏記憶體。
許多引發記憶體不安全的行為,如陣列訪問越界、訪問釋放後的記憶體等,都可以通過制定更嚴格的程式設計模型(如rust提出的所有權+生命週期規則)甚至資料競爭問題來避免。
然而,觸發記憶體洩漏的行為,如競爭條件,需要開發人員將開發元件和業務規則結合起來。設想乙個需要手動觸發重新整理的資料佇列。結果,我們在推送資料時忘記呼叫它。這種記憶體洩漏無法通過任何常規檢查規則來識別。
關鍵字函式是為了更形象地說明傳入引數的位置和具體用法。如果乙個函式有四個或五個引數,而且一次傳入的引數太多,那麼很難讓人眼花繚亂。如果key=value用於傳入。
總結通過本節的學習,我們了解了通過if else在不同條件下控制**流和執行不同**。for/while和如何定義函式有兩種不同的迴圈方法,包括函式的返回值和引數傳遞方法、position引數傳遞和向函式傳遞引數時的key=value引數傳遞。
本文標題: python流程控制常用工具詳解
本文位址:
Python常用工具PyCharm
pycharm 是我用過的python編輯器中,比較順手的乙個。而且可以跨平台,在macos和windows下面都可以用,這點比較好。首先預覽一下 pycharm 在實際應用中的介面 更改了pycharm的預設風格 安裝pycharm 的啟用方式 1,推薦購買正版。2,可以選擇試用,免費試用30天。...
SEO常用工具
seo常用工具 搜尋引擎抓取內容模擬器 可以模擬蜘蛛抓取指定網頁,包括text link keywords及description資訊等。頁面相似度檢測工具 檢驗兩個頁面的相似度 如果相似度達80 以上,將可能受到懲罰 sitemap 製作工具 中文 http www.xinqj.com sitem...
SQL 常用工具
在測試我們的系統時,需要向資料庫一次性插入128條記錄,而我們的配置工具的匯入匯出居然不支援 想想,也情有可原,需求就是這樣。手工輸入128條又太麻煩了,因此,我想到了bcp,之前在給同事導資料時也用過這個命令,但是當時看完幫助文件 導完資料後沒有做相應的記錄,又從頭看了遍文件,因此,決定把他記錄下...