基于python的Linux系統(tǒng)指定進程性能監(jiān)控思路詳解

監(jiān)控Linux服務(wù)器的工具、組件和程序網(wǎng)上有很多,但是一臺服務(wù)器上會有很多進程同時運行,特別是做性能測試的時候,可能一臺服務(wù)器上部署多個服務(wù),如果只監(jiān)控整個服務(wù)器的CPU和內(nèi)存,當某個服務(wù)出現(xiàn)性能問題時,并不能有效準確的定位出(當然通過其他工具也可以實現(xiàn)),因此,很有必要只監(jiān)控指定的進程。需求明確了,于是動手擼了一個性能監(jiān)控腳本。

成都創(chuàng)新互聯(lián)公司致力于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標準化,推過標準化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇成都創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!

一、整體思路

1、為了方便的啟動監(jiān)控和停止監(jiān)控,在想查看監(jiān)控結(jié)果的時候隨時查看監(jiān)控結(jié)果,用flask開啟了一個服務(wù),通過發(fā)送get請求可以隨時啟停監(jiān)控和查看監(jiān)控結(jié)果。
2、針對控制是否監(jiān)控cpu、內(nèi)存、IO,開啟多線程監(jiān)控。
3、為了減少對其他組件的依賴,將監(jiān)控結(jié)果寫到日志中。
4、為了方便查看監(jiān)控結(jié)果,直接將結(jié)果以html方式返回。

基于python的Linux系統(tǒng)指定進程性能監(jiān)控思路詳解

二、配置文件

config.py

IP = '127.0.0.1'
PORT = '5555'
LEVEL = 'INFO' # log level
BACKUP_COUNT = 9 # log backup counter
LOG_PATH = 'logs' # log path
INTERVAL = 1 # interval, run command interval.
SLEEPTIME = 3 # interval, when stopping monitor, polling to start monitor when satisfying condition.
ERROR_TIMES = 5 # times, number of running command. When equal, automatically stopped monitor.
IS_JVM_ALERT = True # Whether to alert when the frequency of Full GC is too high.
IS_MONITOR_SYSTEM = True # Whether to monitor system's CPU and Memory.
IS_MEM_ALERT = True # Whether to alert when memory is too low. Alert by sending email.
MIN_MEM = 2  # Minxium memory, uint: G
# 0: don't clear cache, 1: clear page caches, 2: clear dentries and inodes caches, 3: include 1 and 2;
# echo 1 >/proc/sys/vm/drop_caches
ECHO = 0
SMTP_SERVER = 'smtp.sina.com' # SMTP server
SENDER_NAME = '張三'  # sender name
SENDER_EMAIL = 'zhangsan@qq.com' # sender's email
PASSWORD = 'UjBWYVJFZE9RbFpIV1QwOVBUMDlQUT09' # email password, base64 encode.
RECEIVER_NAME = 'baidu_all' # receiver name
RECEIVER_EMAIL = ['zhangsan@qq.com', 'zhangsi@qq.com'] # receiver's email
DISK = 'device1' # Which disk your application runs
START_TIME = 'startTime.txt' # Store the time of start monitoring.
FGC_TIMES = 'FullGC.txt' # Store the time of every FullGC time.
# html
HTML = '<html><body>{}</body><html>'
ERROR = '<p >{}</p>'
HEADER = '<div id="header"><h3 align="center">Performance Monitor (pid={})</h3></div>'
ANALYSIS = '<div id="container" >{}</div>'

IP和PORT:開啟服務(wù)的服務(wù)器IP和端口,必須和所監(jiān)控的服務(wù)在同一臺服務(wù)器上;
BACKUP_COUNT:默認為9,即只保留最近9天監(jiān)控結(jié)果;
INTERVAL:兩次監(jiān)控的時間間隔,默認為1s,主要用于cpu和內(nèi)存監(jiān)控,當同時監(jiān)控多個端口或進程時,請將該值設(shè)小一點;
ERROR_TIMES:命令執(zhí)行失敗次數(shù),當大于該次數(shù)時,則會自動停止監(jiān)控;主要用于監(jiān)控指定的進程,如果進程被殺掉,則必須自動停止監(jiān)控,且必須手動觸發(fā)再次開始監(jiān)控;如果監(jiān)控指定的端口,當端口的進程被殺掉后,也會停止監(jiān)控,如果端口被重新啟動,則自動開始監(jiān)控;
IS_JVM_ALERT:僅針對java應用,如果頻繁FullGC,則郵件提醒;一般性能測試,F(xiàn)ullGC的頻率不得小于3600秒;
IS_MONITOR_SYSTEM :是否監(jiān)控系統(tǒng)總CPU使用率和剩余內(nèi)存;
IS_MEM_ALERT:當系統(tǒng)剩余內(nèi)存過低時,是否郵件提醒;
MIN_MEM:允許系統(tǒng)最小剩余內(nèi)存,單位為G;
ECHO:當系統(tǒng)剩余內(nèi)存過低時,是否釋放緩存;0為不釋放,1為釋放頁面緩存,2為釋放dentries和inodes緩存,3為釋放1和2;
DISK:磁盤號,如果監(jiān)控IO,需要輸入磁盤號,通過df -h 文件名查看當前文件掛在哪個磁盤下;
START_TIME:記錄每次手動觸發(fā)開始監(jiān)控的時間;
FGC_TIMES:記錄每次FullGC的時間,用于排查問題;

三、接口和服務(wù)

server.py

server = Flask(__name__)
permon = PerMon()
# 開啟多線程
t = [threading.Thread(target=permon.write_cpu_mem, args=()),
 threading.Thread(target=permon.write_io, args=())]
for i in range(len(t)):
 t[i].start()
# 開始監(jiān)控
# http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600
@server.route('/runMonitor', methods=['get'])
def runMonitor():......
# 畫監(jiān)控結(jié)果圖
# http://127.0.0.1:5555/plotMonitor?type=pid&num=23121
@server.route('/plotMonitor', methods=['get'])
def plotMonitor():.......
server.run(port=cfg.PORT, debug=True, host=cfg.IP) # 開啟服務(wù)

通過在瀏覽器地址欄輸入對應的url,即可啟停監(jiān)控和查看監(jiān)控結(jié)果

url傳參:

1、開始監(jiān)控

http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600
isRun:1為開始監(jiān)控,0為停止監(jiān)控;
type和num:type=pid時,表明num為進程號,type=port,表明num為端口號;可以同時監(jiān)控多個端口或進程,多個端口或進程用英文逗號隔開;
totalTime:為監(jiān)控總時間,單位為秒;如果不傳入totalTime,則默認一直監(jiān)控;

2、查看監(jiān)控結(jié)果

http://127.0.0.1:
5555/plotMonitor?type=port&num=23121&system=1&startTime=2019-08-03 08:08:08&duration=3600
type和num:type=pid時,表明num為進程號,type=port,表明num為端口號;
system:表示查看系統(tǒng)監(jiān)控結(jié)果;如果傳了type和num,不管sysytem是否傳值,都只能看到進程的監(jiān)控結(jié)果;不傳type和num,只傳system,則可以查看系統(tǒng)監(jiān)控結(jié)果;
startTime:查看監(jiān)控結(jié)果開始時間;
duration:查看監(jiān)控結(jié)果的時長,單位為秒;
如果不傳startTime和duration,則默認查看最近一次開始監(jiān)控以來的所有結(jié)果;如果需要查看某一段時間內(nèi)的監(jiān)控結(jié)果,則需要傳startTime和duration,查看監(jiān)控結(jié)果的時間范圍為從startTime開始到startTime+duration為止。
注:如果在查看監(jiān)控結(jié)果輸入的一段時間內(nèi),服務(wù)被重啟過,則進程號會有變化,此時仍輸入重啟前的進程號,則只能查看對應進程號在對應時間段內(nèi)的監(jiān)控結(jié)果。一般情況下,端口號不會輕易變化,建議查看監(jiān)控結(jié)果時輸入端口號。

四、監(jiān)控

performance_monitor.py

使用top命令監(jiān)控CPU和內(nèi)存,使用jstat命令監(jiān)控JVM內(nèi)存(僅java應用),使用iotop命令監(jiān)控進程讀寫磁盤,使用iostat命令監(jiān)控磁盤IO,使用netstat命令根據(jù)端口查進程,使用ps命令查看服務(wù)啟動時長。因此,服務(wù)器必須支持以上命令,如不支持,請安裝。

注:由于進程可以開啟多個線程,在查看進程的IO時,是看不到任何IO;而查看進程開啟的某個線程IO時,是可以看到IO的,但是線程是一直是在變化的;故目前暫不支持監(jiān)控指定進程IO的。

五、查看監(jiān)控結(jié)果

draw_performance.py

1、分別畫CPU圖、內(nèi)存和JVM圖、IO圖和句柄數(shù)圖;
2、為方便統(tǒng)計CPU和IO使用情況,計算百分位數(shù);
3、為方便統(tǒng)計垃圾回收信息,計算java應用的ygc、fgc,以及各自的頻率。

監(jiān)控結(jié)果效果圖如下:

基于python的Linux系統(tǒng)指定進程性能監(jiān)控思路詳解

六、擴展函數(shù)

extern.py 有兩個功能

1、端口轉(zhuǎn)進程

try:
 result = os.popen(f'netstat -nlp|grep {port} |tr -s " "').readlines()
 res = [line.strip() for line in result if str(port) in line]
 p = res[0].split(' ')
 pp = p[3].split(':')[-1]
 if str(port) == pp:
 pid = p[-1].split('/')[0]
except Exception as err:
 logger.logger.error(err)

2、查找包含監(jiān)控結(jié)果的日志

整體思路:

        (1)根據(jù)輸入的開始時間和結(jié)束時間,查找包含這段時間的所有日志文件;
        (2)根據(jù)查找出來的日志文件,找出包含監(jiān)控結(jié)果的所有日志;
        (3)畫圖的時候遍歷找出的所有日志。

補充

1、為了方便查看最近一次開始監(jiān)控的時間,會將每一次開始監(jiān)控的時間寫到startTime.txt文件中;

2、為了方便排查java應用可能出現(xiàn)的問題,將每一次Full GC的時間寫到FullGC.txt文件中。

項目地址:https://github.com/leeyoshinari/performance_monitor

總結(jié)

以上所述是小編給大家介紹的基于python的Linux系統(tǒng)指定進程性能監(jiān)控,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

網(wǎng)站題目:基于python的Linux系統(tǒng)指定進程性能監(jiān)控思路詳解
路徑分享:http://muchs.cn/article16/jpjogg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、做網(wǎng)站、網(wǎng)站策劃、定制網(wǎng)站、服務(wù)器托管、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)