Linux下应用进程相关性能指标数据采集 (CPU,内存百分比,运行时长,TIME-WAIT连接数等)...

 

1)如何查看某个服务进程所占本机物理内存及百分比情况?可以使用Linux命令行查看,也可以使用脚本实现。如下以查看本机kube-nginx服务进程为例:

[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百分比和内存百分比

使用"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和内存资源最多的方法

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下查看某些进程的启动时间和运行时长

比如查看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 连接数

查看总的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和内存使用率之和

查看本机所有进程的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行

 

转载于:https://www.cnblogs.com/kevingrace/p/6867820.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值