Linux下應用進程相關性能指標數據採集 (CPU,內存百分比,運行時長,TIME-WAIT鏈接數等)

 

1)如何查看某個服務進程所佔本機物理內存及百分比狀況?可使用Linux命令行查看,也可使用腳本實現。以下以查看本機kube-nginx服務進程爲例:java

[root@kevin ~]# pidof kube-nginx                 
4763 4762
 
查看上面兩個pid的物理內存使用狀況
[root@kevin ~]# cat /proc/4763/status | grep VmRSS    
VmRSS:      4596 kB
[root@kevin ~]# cat /proc/4762/status|grep VmRSS 
VmRSS:       224 kB

由上面可知,kube-nginx服務進程的兩個pid所佔物理內存爲"4596+224=4820k"
 
編寫python腳本
[root@kevin ~]# cat mem_percent.py
#!/usr/bin/python
#coding=utf8
import subprocess
pidcheck = subprocess.Popen('pidof kube-nginx',shell=True,stdout=subprocess.PIPE)
pid = pidcheck.stdout.read().rstrip().split()
memsize = 0
for i in pid:
   filename = "/proc/"+i+"/status"
   #os.path.join("/proc","i","status")     #等同於上條語句
   with open(filename,"r") as statusfile:
       for line in statusfile:
           if line.startswith("VmRSS"):
               memsize+=int(line.split()[1])
print "kube-nginx進程佔用內存:%sk" % memsize
 
with open("/proc/meminfo","r") as memfile:
   for line in memfile:
       if line.startswith("MemTotal"):
           memtotal = int(line.split()[1])
print "kube-nginx進程內存佔用率爲:%.2f%%" % (memsize/float(memtotal)*100)
 
執行腳本:
[root@kevin ~]# chmod 755 mem_percent.py
 
[root@kevin ~]# ./mem_percent.py
kube-nginx進程佔用內存:4820k
kube-nginx進程內存佔用率爲:0.06%
 
[root@kevin ~]# python ./mem_percent.py
kube-nginx進程佔用內存:4820k
kube-nginx進程內存佔用率爲:0.06%
 
 
================================================================================================================
再看一例: 查看docked服務進程所佔物理內存狀況
[root@kevin ~]# pidof dockerd        
29496
[root@kevin ~]# cat /proc/29496/status|grep VmRSS
VmRSS:     78288 kB
 
[root@kevin ~]# cat mem1_percent.py
#!/usr/bin/python
#coding=utf8
import subprocess
pidcheck = subprocess.Popen('pidof dockerd',shell=True,stdout=subprocess.PIPE)
pid = pidcheck.stdout.read().rstrip().split()
memsize = 0
for i in pid:
   filename = "/proc/"+i+"/status"
   #os.path.join("/proc","i","status")     #等同於上條語句
   with open(filename,"r") as statusfile:
       for line in statusfile:
           if line.startswith("VmRSS"):
               memsize+=int(line.split()[1])
print "dockerd進程佔用內存:%sk" % memsize
 
with open("/proc/meminfo","r") as memfile:
   for line in memfile:
       if line.startswith("MemTotal"):
           memtotal = int(line.split()[1])
print "dockerd進程內存佔用率爲:%.2f%%" % (memsize/float(memtotal)*100)
 
[root@kevin ~]# python mem1_percent.py
dockerd進程佔用內存:78288k
dockerd進程內存佔用率爲:0.96%

2)使用Linux命令行直接某個進程的CPU百分比和內存百分比python

使用"ps auxw" 能夠查看到本機的進程所佔cpu和mem的百分比狀況
[root@m7-autocv-gpu02 ~]# ps auxw|head -1
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

%CPU 進程的cpu佔用率
%MEM 進程的內存佔用率

查看java進程所佔本機的cpu百分比, 以下爲0.3%
[root@m7-autocv-gpu02 ~]# ps auxw |grep -v grep|grep -w java|awk '{print $3}'           
0.3

查看java進程所佔本機的內存百分比, 以下爲18.0%  (這個值跟上面python腳本查出來的18.05%稍微有點偏差,這裏百分比的數只精確到小數點後一位)
[root@m7-autocv-gpu02 ~]# ps auxw |grep -v grep|grep -w java|awk '{print $4}'
18.0

Linux下查看哪些進程佔用的CPU和內存資源最多的方法mysql

1)獲取佔用CPU資源最多的10個進程
[root@kevin ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head -10

2)獲取佔用內存資源最多的10個進程
[root@kevin ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head -10

3)查看佔用cpu最高的進程
[root@kevin ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head -1

4)獲取佔用內存資源最高的進程
[root@kevin ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head -1

3)Linux下查看某些進程的啓動時間和運行時長nginx

好比查看java進程的啓動時間和運行時長
[root@m7-autocv-gpu02 ~]# ps -ef|grep -v grep|grep -w java|awk '{print $2}'
18661

[root@m7-autocv-gpu02 ~]# ps -eo pid,lstart,etime | grep 18661             
18661 Tue May 14 19:22:51 2019  5-19:42:51

其中:
Tue May 14 19:22:51 2019   爲java進程的啓動時間
5-19:42:51                 爲java進程的運行時長,即5天19小時42分51秒


能夠查看全部進程的啓動事件、運行時長
[root@m7-autocv-gpu02 ~]# ps -eo user,pid,lstart,etime,cmd

查看nginx進程啓動的精確時間和啓動後運行的時長
[root@m7-autocv-gpu02 ~]# ps -eo pid,lstart,etime,cmd|grep nginx

4)Linux下查看某個進程的TIME_WAIT、ESTABLISHED、FIN_WAIT2 鏈接數sql

查看總的TIME_WAIT、ESTABLISHED、FIN_WAIT2 鏈接數 (下面兩個命令均可以)
[root@kevin ~]# netstat -ae|grep "TIME_WAIT" |wc -l
[root@kevin ~]# ss -a|grep "TIME_WAIT" |wc -l

[root@kevin ~]# netstat -ae|grep "ESTABLISHED" |wc -l
[root@kevin ~]# netstat -ae|grep "FIN_WAIT2" |wc -l

 
好比查看kube-apiserve進程的TIME_WAIT、ESTABLISHED、FIN_WAIT2 鏈接數 
[root@kevin ~]# netstat -antp | grep kube-apiserve | grep ESTABLISHED  -c4
85
[root@kevin ~]# netstat -antp | grep kube-apiserve | grep TIME_WAIT -c4   
0
[root@kevin ~]# netstat -antp | grep kube-apiserve | grep ESTABLISHED -c4 
85
[root@kevin ~]# netstat -antp | grep kube-apiserve | grep FIN_WAIT2 -c4  
0


還能夠根據某一個進程的端口號來查看
[root@kevin ~]# netstat -antp | grep 6443 | grep TIME_WAIT -c4           
0
[root@kevin ~]# netstat -antp | grep 6443 | grep ESTABLISHED -c4               #即ESTABLISHED鏈接數爲8
8
[root@kevin ~]# netstat -antp | grep 6443 | grep FIN_WAIT2 -c4           
0

====================================================================================
Linux下查看併發鏈接數

[root@kevin ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 218

或者能夠簡單的直接用:
[root@kevin ~]# netstat -n|grep "ESTABLISHED"|wc -l
218

解釋:
/^tcp/    :表示搜索以tcp開頭的行
S[$NF]    :表示以$NF爲數組下標,創建數組S
++S[$NF]  :表示給數組S賦值,至關於有一個tcp那麼這個S數組裏的元素就+1
/^tcp/ {++S[$NF]}   :表示整個意思應該是 匹配出一個tcp協議的鏈接 數組S就+一個元素值
END是前面的/^tcp/ {++S[$NF]}  :表示執行結束後在執行
{for(a in S) print a, S[a]}   :表示將S值代入a 打印a 和這個S[a]數組的值。好比S是10,那麼a就是10,S[a] 就是s這個數組的第10個元素的值


返回結果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待處理的請求數;ESTABLISHED表示正常數據傳輸狀態;TIME_WAIT表示處理完畢,等待超時結束的請求數。

狀態:描述
CLOSED:無鏈接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個鏈接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個鏈接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另外一邊已贊成釋放
ITMED_WAIT:等待全部分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另外一邊已初始化一個釋放
LAST_ACK:等待全部分組死掉

例子
查看Nginx運行進程數
[root@kevin ~]# ps -ef | grep nginx | wc -l      #返回的數字就是nginx的運行進程數

查看Web服務器進程鏈接數:
[root@kevin ~]# netstat -antp | grep 80 | grep ESTABLISHED -c4

查看MySQL和java進程鏈接數:
[root@kevin ~]# ps -axef | grep mysqld -c
1
[root@kevin ~]# ps -axef | grep java -c
3

注意:
grep -c 的做用相似grep | wc -l,不一樣的是,若是是查找多個文件,grep -c會統計每一個文件匹配的行數,每行一個文件的列出來,
而wc -l 則列出總的統計數字。
另外grep -c 要比 grep | wc -l快一點。


====================================================================================
針對TIME_WAIT現象的優化措施:
 
好比某一天下午,登錄IDC機房的一臺服務器,輸入命令"netstat -an|grep mysql",
發現mysql服務進程存在大量TIME_WAIT狀態的鏈接
[root@kevin ~]# netstat -an|grep mysql
...........
tcp        0      0 127.0.0.1:3306              127.0.0.1:41378             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41379             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39352             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39350             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:35763             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39372             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39373             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41176             TIME_WAIT
...........
 
經過調整內核參數解決, 編輯文件,加入如下內容:
[root@kevin ~]# vim /etc/sysctl.conf
...........
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
  
而後讓添加的參數生效。
[root@kevin ~]# /sbin/sysctl -p
 
其中:
net.ipv4.tcp_syncookies = 1  表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1    表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1  表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
net.ipv4.tcp_fin_timeout=30  表示修改系統默認的TIMEOUT時間爲30秒
 
修改以後,再用命令查看TIME_WAIT鏈接數
[root@kevin ~]# netstat -ae|grep "TIME_WAIT" |wc –l
 
此時發現大量的TIME_WAIT 已不存在,mysql進程的佔用率很快就降下來的,網站訪問正常。
不過不少時候,出現大量的TIME_WAIT狀態的鏈接,每每是由於網站程序代碼中沒有使用mysql.colse(),才致使大量的mysql  TIME_WAIT.

5) 查看本機全部進程的CPU和內存使用率之和docker

查看本機全部進程的CPU佔比之和
[root@kevin ~]# cat cpu_per.sh 
#!/bin/bash

ps auxw|awk '{if (NR>1){print $3}}' > /opt/cpu_list

awk '{CPU_PER+=$1}END{print CPU_PER}'  /opt/cpu_list

執行腳本,獲取全部進程的cpu佔比之和,即14.1%
[root@kevin ~]# sh cpu_per.sh
14.1

==========================================================
查看本機全部進程的內存佔比之和
[root@kevin ~]# cat mem_per.sh 
#!/bin/bash

ps auxw|awk '{if (NR>1){print $4}}' > /opt/mem_list

awk '{MEM_PER+=$1}END{print MEM_PER}'  /opt/mem_list

執行腳本,獲取全部進程的內存佔比之和,即22.2%
[root@kevin ~]# sh mem_per.sh 
22.2


腳本配置解釋:
ps -auxw|awk '{print $3}'   表示列出本機全部進程的cpu利用率狀況,結果中第一行帶"%CPU"字符
ps -auxw|awk '{print $4}'   表示列出本機全部進程的內存利用率狀況,結果中第一行帶"%MEM"字符
ps auxw|awk '{if (NR>1){print $4}}  表示將"ps auxw"結果中的第一行過濾(NR>1)掉,而後打印第4行
相關文章
相關標籤/搜索