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行
6)其他系統性能指標采集
1)通過free命令查看內存剩余可用情況
==================================================================================
-b:以Byte為單位顯示內存使用情況。
-k:以KB為單位顯示內存使用情況。
-m:以MB為單位顯示內存使用情況。
-g 以GB為單位顯示內存使用情況。
-o:不顯示緩沖區調節列。
-s<間隔秒數>:持續觀察內存使用狀況。
-t:顯示內存總和列。
-V:顯示版本信息。
-h:centos7系統下,可以使用該參數進行查看
[root@kevin ~]# free -m
total used free shared buff/cache available
Mem: 3774 1155 591 291 2027 1962
Swap: 2048 901 1147
頁面顯示參數解釋:
total: 總計物理內存的大小。
used: 已使用多大。
free: 可用有多少。
Shared: 多個進程共享的內存總額。
Buffers/cached: 磁盤緩存的大小
Swap:交換分區(虛擬內存)情況;
Mem:實際內存的使用情況
2)查看和設置服務器最大進程數
==================================================================================
查看系統允許的當前最大進程數
查看本服務器進程數
[root@kevin ~]# ps -eLf | wc -l
263
主要是看pid_max指標的值,pid_max是Linux內核用來限制進程數的一個最大指標。
換言之,即最大允許進程就這么多,超過了這個設定值,服務器就掛了("ps -eLf | wc -l"查看本機器的進程數)
[root@kevin ~]# sysctl kernel.pid_max # centos7系統執行"systemctl kernel.pid_max"命令
kernel.pid_max = 32768
或者
[root@kevin ~]# cat /proc/sys/kernel/pid_max
32768
一般出現 -bash: fork: Cannot allocate memory 本機的進程數應該接近或等於pid_max指標值的。
[root@kevin ~]# echo 65536 > /proc/sys/kernel/pid_max # 臨時修改
[root@kevin ~]# echo "kernel.pid_max=65536" >> /etc/sysctl.conf # 永久修改
[root@kevin ~]# sysctl -p
kernel.pid_max = 65536
如上設置就可以了,保險起見,最好找到占用空間最大的進程,然后把它干掉就解決了!如下使用top命令分析:
3)top:展示進程視圖,監控服務器進程數值默認進入top時,各進程是按照CPU的占用量來排序的
==================================================================================
[root@kevin ~]# top
top - 15:46:45 up 581 days, 22:30, 5 users, load average: 0.00, 0.02, 0.05
Tasks: 133 total, 2 running, 130 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7994044 total, 1227680 free, 3499004 used, 3267360 buff/cache
KiB Swap: 2097148 total, 1708072 free, 389076 used. 3954372 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
48085 root 20 0 4172780 814536 6236 S 0.7 21.1 8353:58 mongod
12670 root 20 0 703816 41532 924 S 0.3 1.1 331:29.13 glusterfs
55185 root 20 0 157724 2240 1548 R 0.3 0.1 0:00.03 top
1 root 20 0 51656 2496 1352 S 0.0 0.1 94:14.96 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.87 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 2:32.08 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 1:16.86 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 R 0.0 0.0 358:31.04 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 5:39.75 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 4:54.62 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 1:17.38 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 2:26.26 ksoftirqd/1
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 root 20 0 0 0 0 S 0.0 0.0 0:26.52 khungtaskd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
針對以上的top命令顯示的結果,逐行說明:
第一行:
15:46:45 — 當前系統時間
581 days, 22:30 — 系統已經運行了581天22小時30分鍾(在這期間沒有重啟過)
5 users — 當前有5個用戶登錄系統
lload average: 0.00, 0.02, 0.05 — load average后面的三個數分別是1分鍾、5分鍾、15分鍾的負載情況
這里需要注意:
load average數據是每隔5秒鍾檢查一次活躍的進程數,然后按特定算法計算出的數值。
如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。
第二行:
Tasks — 任務(進程),系統現在共有133個進程,其中處於運行中的有2個,130個在休眠(sleep),stoped狀態的有1個,zombie狀態(僵屍)的有0個。
第三行:cpu狀態
0.3% us — 用戶空間占用CPU的百分比。
0.3% sy — 內核空間占用CPU的百分比。
0.0% ni — 改變過優先級的進程占用CPU的百分比
99.3% id — 空閑CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中斷(Hardware IRQ)占用CPU的百分比
0.0% si — 軟中斷(Software Interrupts)占用CPU的百分比
0.0% st — 虛擬機偷取占用CPU的百分比
第四行:內存狀態(k)
7994044 total — 物理內存總量(8GB)
1227680 free — 使用中的內存總量(12.2GB)
3499004 used — 空閑內存總量(350M)
3267360 buff/cache — 緩存的內存量 (326M)
第五行:swap交換分區(k)
2097148 tota — 交換區總量(2GB)
1708072 free — 空閑交換區總量(1.7G)
389076 used — 使用的交換區總量(390M)
3954372 avail Mem — 目前可用的內存總量(4GB)。剩余內存+剩余的swap內存
第六行以下:各進程(任務)的狀態監控
PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程
%CPU — 上次更新到現在的CPU時間占用百分比
%MEM — 進程使用的物理內存百分比
TIME+ — 進程使用的CPU時間總計,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)
-------------------------------------
擴展:top命令的多U多核CPU監控
1. 在top基本視圖中,按鍵盤數字"1",可監控每個邏輯CPU的狀況:
top - 18:04:41 up 85 days, 3:25, 3 users, load average: 0.11, 0.13, 0.13
Tasks: 128 total, 2 running, 126 sleeping, 0 stopped, 0 zombie
%Cpu0 : 2.0 us, 0.7 sy, 0.0 ni, 97.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 2.7 us, 0.7 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 3.7 us, 0.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu3 : 2.3 us, 0.3 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7994044 total, 1179668 free, 3552276 used, 3262100 buff/cache
KiB Swap: 2097148 total, 1708072 free, 389076 used. 3900944 avail Mem
.......
.......
2. 敲擊鍵盤"b", 可以"打開/關閉"top視圖的加亮效果。
3. 敲擊鍵盤"x", 可以"打開/關閉"top視圖的排序列的加亮效果。
4. 如果要在基本視圖中顯示"CODE"和"DATA"兩個字段,可以通過敲擊"r"和"s"鍵。
4)Linux查看進程、CPU、內存、IO相關信息
==================================================================================
1. 監控java線程數:
# ps -eLf | grep java | wc -l
2. 監控網絡客戶連接數:
# netstat -n | grep tcp | grep 偵聽端口 | wc -l
3. 進程相關
# cat /proc/your_PID/status
通過"top"或"ps -ef |grep '進程名'" 得到進程的PID。然后執行上面命令可以提供進程狀態、文件句柄數、內存使用情況等信息。
4. 內存相關
# vmstat -s -S M
該可以查看包含內存每個項目的報告,通過-S M或-S k可以指定查看的單位,默認為kb。結合watch命令就可以看到動態變化的報告了。
也可用 cat /proc/meminfo
5. 查看cpu的配置信息
# cat /proc/cpuinfo
它能顯示諸如CPU核心數,時鍾頻率、CPU型號等信息。
6. 要查看cpu波動情況的,尤其是多核機器上,可以使用下面命令:
# mpstat -P ALL 10
該命令可間隔10秒鍾采樣一次CPU的使用情況,每個核的情況都會顯示出來,例如,每個核的idle情況等。
如果只是需查查看看均值的CPU,可以使用下面命令:
# iostat -c
7. IO相關
# iostat -P ALL
該命令可查看所有設備使用率、讀寫字節數等信息。
5)Linux查看物理CPU個數、核數、邏輯CPU個數
==================================================================================
總核數 = 物理CPU個數 * 每顆物理CPU的核數
總邏輯CPU數 = 物理CPU個數 * 每顆物理CPU的核數 * 超線程數
1. 查看物理CPU個數
# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2. 查看每個物理CPU中core的個數(即核數)
# cat /proc/cpuinfo| grep "cpu cores"| uniq
3. 查看邏輯CPU的個數
# cat /proc/cpuinfo| grep "processor"| wc -l
4. 查看CPU信息(型號)
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
