分享一個輔助分析內存泄漏的腳本

  最近給系統做了一點優化,前幾天去查看系統監控,想看看上線前后cpu使用率曲線變化情況。查看的時候意外發現上線前后內存占用相差不少,20%以上。

本來我沒怎么在意這個問題,因為我們系統會在運行過程中緩存部分數據內容。但客戶覺得有異常,堅持要查。于是把一個月的內存使用情況調出來看,這一看就發現問題了:

  系統內存占用確實是在緩慢增加,一兩天的內存使用率曲線看不出什么,但一個月的可以明顯看出來,是一條斜率很小的直線。

  發現了有內存泄漏,但是想具體分析是哪個進程泄漏的還真不好辦。因為我們系統有上千個進程在跑,而監控系統又只記錄了總體內存占用情況,沒記錄單個進程內存占用。

  沒有槍,沒有炮,只能自己來造 :) 。?我設計了一個簡單的分析方法:

  1?首先,我寫一個腳本,每天定期記錄系統所有進程使用情況,保存到文件,以時間戳命名。(用ps實現)

  2?腳本跑幾天后,我再使用另一個腳本,把文件合并起來分析,把每個進程在不同時間點的內存使用情況合并成一行,逐個進程輸出

  3?比較每個進程第一次出現與最后一次出現時占用內存之差,按從小到大排序,即可得出可能存在內存泄漏的程序。

  效果如下:可以看出這個進程內存占用一直在增加,從第一次統計到最后一次統計之間內存使用增加了1460k

  知道問題后就好辦了,使用valgrind+gdb很快就找出導致內存泄漏的代碼,糾正即可。

?

  下面是分析過程中用到的腳本,希望對大家有幫助

 1 # 20190228 hch 輔助分析程序內存泄漏情況的腳本
 2 # 設計思路:首先用ps定期采集所有程序占用內存情況,生成多個文件。然后使用awk分析ps輸出的文件,把相同進程占用的內存合并成一行輸出
 3 # 計算進程第一次和最后一次出現的時間點占用內存之差,逆序輸出即可獲得疑似內存泄漏的程序
 4 
 5 # 首先使用以下腳本采集程序每一分鐘內存占用信息,采集若干分鐘
 6 # while [ 1 ]; do ps -eo 'pid,comm,rsz,vsz,user,comm,args,pcpu,pmem' --sort rsz > ps_info_$(date "+%Y%m%d%H%M%S").txt ; sleep 60; done
 7 
 8 # 使用awk腳本分析內存占用信息 把進程每一個時間點的內存占用情況合并成一行方便對比
 9 # 并且統計進程第一次出現和最后一次出現占用內存差,輸出
10 awk '{
11     # 每次處理一個新文件時需要特殊處理一下 
12     if (FNR == 1) {
13         # 登記文件名稱
14         v_all_file_name = v_all_file_name "," FILENAME;
15         v_prefix_str = v_prefix_str ",";
16         ++v_file_cnt;
17         
18         # 把上次文件沒有出現的pid補上
19         if (NR != 1) { # FNR == 1 && NR == 1 代表第一個文件
20             for (v_pid_name in v_mp_pid_cnt) {
21                 if (v_mp_pid_cnt[v_pid_name] != v_file_cnt - 1) {
22                     v_mp_pid_rsz[v_pid_name] = v_mp_pid_rsz[v_pid_name] ","
23                     v_mp_pid_vsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] ","
24                     v_mp_pid_cnt[v_pid_name] = v_file_cnt - 1;
25                 }
26             }
27         }
28     }
29     
30     v_pid_name = $2 "-" $1 "-" $5; #程序名-進程號-用戶名
31     # 非第一個文件,第一次出現,需要補齊","
32     if (v_file_cnt != 1 && v_mp_pid_cnt[v_pid_name] == 0) {
33         v_mp_pid_rsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] = substr(v_prefix_str, 1, v_file_cnt - 1);
34         v_mp_pid_cnt[v_pid_name] = v_file_cnt - 1;
35     }
36     
37     # rsz是物理內存 單位k
38     v_mp_pid_rsz[v_pid_name] = v_mp_pid_rsz[v_pid_name] "," $3
39     # 記錄最后值和初始值 方便后面分析(有需要可以改成最大和最小值)
40     #if ($3 > v_mp_pid_rsz_max[v_pid_name]) v_mp_pid_rsz_max[v_pid_name] = $3;
41     v_mp_pid_rsz_max[v_pid_name] = $3;
42     if (v_mp_pid_rsz_min[v_pid_name] == 0 ) # || $3 < v_mp_pid_rsz_min[v_pid_name]
43         v_mp_pid_rsz_min[v_pid_name] = $3;
44     
45     # vsz是虛存 單位k
46     v_mp_pid_vsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] "," $4
47     v_mp_pid_vsz_max[v_pid_name] = $4;
48     if (v_mp_pid_vsz_min[v_pid_name] == 0 ) # || $4 < v_mp_pid_rsz_min[v_pid_name]
49         v_mp_pid_vsz_min[v_pid_name] = $4;
50         
51     # 在本文件出現過就標記一下,后面文件處理完后才知道哪些進程沒出現
52     v_mp_pid_cnt[v_pid_name] = v_file_cnt;
53 }
54 END {
55     print v_all_file_name
56     for (v_pid_name in v_mp_pid_rsz) {
57         print "rsz:"v_pid_name, v_mp_pid_rsz_max[v_pid_name] - v_mp_pid_rsz_min[v_pid_name], v_mp_pid_rsz[v_pid_name]
58         print "vsz:"v_pid_name, v_mp_pid_vsz_max[v_pid_name] - v_mp_pid_vsz_min[v_pid_name], v_mp_pid_vsz[v_pid_name];
59     }
60 }' $(ls -rt ps_inf*txt) > ps_trace.txt #按時間逆序分析
61 
62 # 將分析結果排序輸出
63 # sh ps_trace.sh; sork -k2n ps_trace.txt | tail -100

?

轉載于:https://www.cnblogs.com/kingstarer/p/10504841.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449702.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449702.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449702.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows Virtualbox下配置Ubuntu,且用ssh連接

1、軟件介紹 1&#xff09;virtualbox 5.2.22 2&#xff09;Ubuntu 18.04 3&#xff09;git bash 2、virtualbox設置 安裝完Ubuntu后點擊該鏡像的設置&#xff0c;依次點擊“網絡”——“端口轉發” 將主機端口設置為一個閑置端口&#xff0c;子系統端口也就是Ubuntu端口設置…

專訪劉偉:軟件開發人員的內功修煉之道

摘要&#xff1a;數學修養對軟件開發之路起著什么作用&#xff1f;碼農如何修煉自己的內功并成長為優秀的軟件開發員&#xff1f;帶著相關思考&#xff0c;社區之星第10期采訪了中南大學副教授——劉偉。他對數學修養、設計模式、軟件架構和重構方面的獨特見解&#xff0c;相信…

多線程數據下載(akshare)

import akshare as ak import pandas as pd from multiprocessing.dummy import Pool as ThreadPool import datetime import timedef get_hs300_stock_codes():獲取滬深300股票代碼列表:return:hs300ak.index_stock_cons_sina("000300")codeshs300[code]codescodes.…

MongoDB 4.6.1 c++ driver 編譯

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主同意不得轉載。https://blog.csdn.net/sheismylife/article/details/25512251 這個版本號已經和之前不一樣了。有專門的github的項目。https://github.com/mongodb/mongo-cxx-driver首先獲取源碼&#xff1a;git cl…

地址解析協議 (ARP) 是什么

地址解析協議 (ARP) 是通過解析網路層地址來找尋數據鏈路層地址的一個在網絡協議包中極其重要的網絡傳輸協議。 ARP是通過網絡地址(例&#xff1a;IPv4)來定位MAC地址 (也稱為乙太地址)。 ARP已經在很多網路層和數據鏈接層之間得以實現&#xff0c;包括IPv4&#xff0c;Chaosn…

04.React事件 方法、 React定義方法的幾種方式 獲取數據 改變數據 執行方法傳值...

2019獨角獸企業重金招聘Python工程師標準>>> 一.基本用法 在以類繼承的方式定義的組件中&#xff0c;為了能方便地調用當前組件的其他成員方法或屬性&#xff08;如&#xff1a;this.state&#xff09;&#xff0c;通常需要將事件處理函數運行時的 this 指向當前組件…

代碼之美——Doom3源代碼賞析

摘要&#xff1a;Dyad作者、資深C工程師Shawn McGrathz在空閑時翻看了Doom3的源代碼&#xff0c;發出了這樣的驚嘆&#xff1a;“這是我見過的最整潔、最優美的代碼&#xff01;”“Doom 3的源代碼讓我對那些優秀的程序員刮目相看。”因此有了本文。 背景介紹&#xff1a; Doom…

UDP:用戶數據報協議 是什么

用戶數據報協議&#xff08;英語&#xff1a;User Datagram Protocol&#xff0c;縮寫為UDP&#xff09;&#xff0c;又稱用戶數據報文協議&#xff0c;是一個簡單的面向數據報的傳輸層協議&#xff0c;正式規范為RFC 768。在TCP/IP模型中&#xff0c;UDP為網絡層以上和應用層以…

隨想錄(程序員和收入)

距離上一次寫博客已經很長時間了&#xff0c;大約過了三個星期。這三個星期發生了很多事情&#xff0c;這中間也有我自己的思考積累&#xff0c;也有工作上的變故。總之&#xff0c;自己想了很多&#xff0c;也得到了很多。每到這個時候&#xff0c;畢業生朋友們都在尋找工作&a…

iOS進階之正則表達式

最近一直在弄正則表達式&#xff0c;于是在這里整理一下&#xff0c;便于日后查閱。 1、常用符號 ^&#xff1a;字符串的開始$&#xff1a;字符串的結束*&#xff1a;表示零個或若干個?&#xff1a;表示零個或一個&#xff1a;表示一個或若干個| &#xff1a;表示 或 操作. &a…

akshare分析漲停板股票數據

導入包&#xff0c;獲取日期數據 import pandas as pd import numpy as np import akshare as ak #畫圖 import matplotlib.pyplot as plt #正確顯示中文和負號 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False #處理時間 from dateutil.parser…

DNS(域名系統) 是什么

域名系統&#xff08;英文&#xff1a;Domain Name System&#xff0c;縮寫&#xff1a;DNS&#xff09;是互聯網的一項服務。 它作為將域名和IP地址相互映射的一個分布式數據庫&#xff0c;能夠使人更方便地訪問互聯網。 DNS使用TCP和UDP端口53。當前&#xff0c;對于每一級域…

《The Art of Readable Code》學習筆記(一)

放寒假回家有些頹廢&#xff0c;就是不想看書。但是已經大三了&#xff0c;春節過后就要找實習了。哎&#xff0c;快樂的大學生活終于要過去了。 先從簡單的書看起吧&#xff01;在圖書館借了本《The Art of Readable Code》&#xff0c;就是教你咋寫好優雅的代碼的&#xff0c…

文件基本處理

1 打開文件&#xff0c;將文件句柄賦值給一個變量 2 拿句柄對文件進行操作 3 關閉文件 將一個文件第一行寫道另外一個文件 f open("test","r",encoding"utf-8") # open找的是系統的編碼 x f.readlines() f.close() f1 open("test1"…

C++ ofstream和ifstream詳細用法

ofstream是從內存到硬盤&#xff0c;ifstream是從硬盤到內存&#xff0c;其實所謂的流緩沖就是內存空間; 在C中&#xff0c;有一個stream這個類&#xff0c;所有的I/O都以這個“流”類為基礎的&#xff0c;包括我們要認識的文件I/O&#xff0c;stream這個類有兩個重要的運算符&…

如何將JAR包發布到Maven中央倉庫?

將jar包發布到Maven中央倉庫(Maven Central Repository)&#xff0c;這樣所有的Java開發者都可以使用Maven直接導入依賴&#xff0c;例如fundebug-java&#xff1a; <!-- https://mvnrepository.com/artifact/com.fundebug/fundebug-java --> <dependency><grou…

SSH、SSL與HTTPS

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 關于加密 在解釋SSH、SSL與HTTPS協議之前我先介紹一下非對稱加密協議。在1976年以前&#xff0c;所有的加密都采用對稱加密&#xff0c…

北向資金運作akshare

import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] mpl.rcParams[axes.unicode_minus]False#獲取交易日歷 import datetime def get_cal_date(start,end):dates ak.to…

網絡性能測試工具iperf詳細使用圖文教程【轉載】

原文&#xff1a;https://www.cnblogs.com/yingsong/p/5682080.html 轉載于:https://www.cnblogs.com/luo30zhao/p/10512042.html

代碼審查:程序員內煉之道

摘要&#xff1a;“關注并弄清楚橋梁修建細節&#xff0c;否則你建起來的橋梁有可能坍塌。”代碼審查更重要的是一種技術分享或者代碼共享。程序員如何提升自我修煉之道&#xff0c;歡迎來支招。 代碼審查更重要的是一種技術分享或者代碼共享。在審查過程中&#xff0c;通過被…