當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]free是查看內(nèi)存使用情況,包括物理內(nèi)存、交換內(nèi)存(swap)和內(nèi)核緩沖區(qū)內(nèi)存。


作者:xiaolyuh ,本文來源:http://r6d.cn/b97q7

內(nèi)存瓶頸

free

free是查看內(nèi)存使用情況,包括物理內(nèi)存、交換內(nèi)存(swap)和內(nèi)核緩沖區(qū)內(nèi)存。

free -h -s 3表示每隔三秒輸出一次內(nèi)存情況,命令如下

[1014154@cc69dd4c5-4tdb5 ~]$ free
              total        used        free      shared  buff/cache   available
Mem:      119623656    43052220    45611364     4313760    30960072    70574408
Swap:             0           0           0
[1014154@cc69dd4c5-4tdb5 ~]$ free -h -s 3
              total        used        free      shared  buff/cache   available
Mem:           114G         41G         43G        4.1G         29G         67G
Swap:            0B          0B          0B

              total        used        free      shared  buff/cache   available
Mem:           114G         41G         43G        4.1G         29G         67G
Swap:            0B          0B          0B
  • Mem:是內(nèi)存的使用情況。
  • Swap:是交換空間的使用情況。
  • total:系統(tǒng)總的可用物理內(nèi)存和交換空間大小。
  • used:已經(jīng)被使用的物理內(nèi)存和交換空間。
  • free:還有多少物理內(nèi)存和交換空間可用使用, 是真正尚未被使用的物理內(nèi)存數(shù)量。
  • shared:被共享使用的物理內(nèi)存大小。
  • buff/cache:被 buffer(緩沖區(qū)) 和 cache(緩存) 使用的物理內(nèi)存大小。
  • available:還可以被應(yīng)用程序使用的物理內(nèi)存大小, 它是從應(yīng)用程序的角度看到的可用內(nèi)存數(shù)量,available ≈ free + buffer + cache。

交換空間(swap space)

swap space 是磁盤上的一塊區(qū)域,當(dāng)系統(tǒng)物理內(nèi)存吃緊時,Linux 會將內(nèi)存中不常訪問的數(shù)據(jù)保存到 swap 上,這樣系統(tǒng)就有更多的物理內(nèi)存為各個進(jìn)程服務(wù),而當(dāng)系統(tǒng)需要訪問 swap 上存儲的內(nèi)容時,再將 swap 上的數(shù)據(jù)加載到內(nèi)存中,這就是常說的換出和換入。交換空間可以在一定程度上緩解內(nèi)存不足的情況,但是它需要讀寫磁盤數(shù)據(jù),所以性能不是很高。

vmstat(推薦)

vmstat(VirtualMeomoryStatistics,虛擬內(nèi)存統(tǒng)計)是Linux中監(jiān)控內(nèi)存的常用工具,可對操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU等的整體情況進(jìn)行監(jiān)視,推薦使用。

vmstat 5 3表示每隔5秒統(tǒng)計一次,一共統(tǒng)計三次。

[1014154@cc69dd4c5-4tdb5 ~]$ vmstat 5 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 8  0      0 45453212 374768 30763728    0    0    14    99    1    1 11 10 78  0  1
10  0      0 45489232 374768 30763360    0    0     2  1275 95118 97908 13 11 75  0  1
 6  0      0 45452908 374768 30765148    0    0     0  3996 89924 92073 12 10 78  0  1

procs

r:表示運(yùn)行和等待CPU時間片的進(jìn)程數(shù)(就是說多少個進(jìn)程真的分配到CPU),這個值如果長期大于系統(tǒng)CPU個數(shù),說明CPU不足,需要增加CPU。b:表示在等待資源的進(jìn)程數(shù),比如正在等待I/O或者內(nèi)存交換等。

memory

swpd:表示切換到內(nèi)存交換區(qū)的內(nèi)存大小,即虛擬內(nèi)存已使用的大?。▎挝籏B),如果大于0,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器。free:表示當(dāng)前空閑的物理內(nèi)存。buff:表示緩沖大小,一般對塊設(shè)備的讀寫才需要緩沖Cache:表示緩存大小,一般作為文件系統(tǒng)進(jìn)行緩沖,頻繁訪問的文件都會被緩存,如果cache值非常大說明緩存文件比較多,如果此時io中的bi比較小,說明文件系統(tǒng)效率比較好。

swap

si:表示數(shù)據(jù)由磁盤讀入內(nèi)存;通俗的講就是每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。so:表示由內(nèi)存寫入磁盤,也就是由內(nèi)存交換區(qū)進(jìn)入內(nèi)存的數(shù)據(jù)大小。

!! 注意:一般情況下si、so的值都為0,如果si、so的值長期不為0,則說明系統(tǒng)內(nèi)存不足,需要增加系統(tǒng)內(nèi)存

io

bi:表示由塊設(shè)備讀入數(shù)據(jù)的總量,即讀磁盤,單位kb/sbo:表示寫到塊設(shè)備數(shù)據(jù)的總量,即寫磁盤,單位kb/s

!! 注意:如果bi+bo的值過大,且wa值較大,則表示系統(tǒng)磁盤IO瓶頸。

system

in:表示某一時間間隔內(nèi)觀測到的每秒設(shè)備終端數(shù)。cs:表示每秒產(chǎn)生的上下文切換次數(shù),這個值要越小越好,太大了,要考慮調(diào)低線程或者進(jìn)程的數(shù)目。例如在apache和nginx這種web服務(wù)器中,我們一般做性能測試時會進(jìn)行幾千并發(fā)甚至幾萬并發(fā)的測試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào),壓測,直到cs到一個比較小的值,這個進(jìn)程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會進(jìn)入內(nèi)核空間,導(dǎo)致上下文切換,這個是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過多表示你的CPU大部分浪費(fèi)在上下文切換,導(dǎo)致CPU干正經(jīng)事的時間少了,CPU沒有充分利用,是不可取的。

!! 注意:這兩個值越大,則由內(nèi)核消耗的CPU就越多。

CPU

us:表示用戶進(jìn)程消耗的CPU時間百分比,us值越高,說明用戶進(jìn)程消耗CPU時間越多,如果長期大于50%,則需要考慮優(yōu)化程序或者算法。sy:表示系統(tǒng)內(nèi)核進(jìn)程消耗的CPU時間百分比,一般來說us+sy應(yīng)該小于80%,如果大于80%,說明可能存在CPU瓶頸。id:表示CPU處在空間狀態(tài)的時間百分比。wa:表示IP等待所占用的CPU時間百分比,wa值越高,說明I/O等待越嚴(yán)重,根據(jù)經(jīng)驗(yàn)wa的參考值為20%,如果超過20%,說明I/O等待嚴(yán)重,引起I/O等待的原因可能是磁盤大量隨機(jī)讀寫造成的,也可能是磁盤或者監(jiān)控器的貸款瓶頸(主要是塊操作)造成的

sar

sar和free類似sar -r 3每隔三秒輸出一次內(nèi)存信息:

[root@localhost ~]# sar -r 3
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年04月28日  _x86_64_        (2 CPU)

15時40分10秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
15時40分13秒    106800   1314960     92.49      2144    573248   4110864    116.82    563664    498888        36
15時40分16秒    106816   1314944     92.49      2144    573248   4110864    116.82    563668    498888        36
15時40分19秒    106816   1314944     92.49      2144    573248   4110864    116.82    563668    498888        36

CPU瓶頸

查看機(jī)器cpu核數(shù)

CPU總核數(shù) = 物理CPU個數(shù) * 每顆物理CPU的核數(shù) 
總邏輯CPU數(shù) = 物理CPU個數(shù) * 每顆物理CPU的核數(shù) * 超線程數(shù)

查看CPU信息(型號)

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
     32  Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

查看物理CPU個數(shù)

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
16

查看每個物理CPU中core的個數(shù)(即核數(shù))

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores       : 2

查看邏輯CPU的個數(shù)

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "processor"| wc -l
32

top

在Linux內(nèi)核的操作系統(tǒng)中,進(jìn)程是根據(jù)虛擬運(yùn)行時間(由進(jìn)程優(yōu)先級、nice值加上實(shí)際占用的CPU時間進(jìn)行動態(tài)計算得出)進(jìn)行動態(tài)調(diào)度的。在執(zhí)行進(jìn)程時,需要從用戶態(tài)轉(zhuǎn)換到內(nèi)核態(tài),用戶空間不能直接操作內(nèi)核空間的函數(shù)。通常要利用系統(tǒng)調(diào)用來完成進(jìn)程調(diào)度,而用戶空間到內(nèi)核空間的轉(zhuǎn)換通常是通過軟中斷來完成的。例如要進(jìn)行磁盤操作,用戶態(tài)需要通過系統(tǒng)調(diào)用內(nèi)核的磁盤操作指令,所以CPU消耗的時間被切分成用戶態(tài)CPU消耗、系統(tǒng)(內(nèi)核) CPU 消耗,以及磁盤操作 CPU 消耗。執(zhí)行進(jìn)程時,需要經(jīng)過一系列的操作,進(jìn)程首先在用戶態(tài)執(zhí)行,在執(zhí)行過程中會進(jìn)行進(jìn)程優(yōu)先級的調(diào)整(nice),通過系統(tǒng)調(diào)用到內(nèi)核,再通過內(nèi)核調(diào)用,硬中斷、軟中斷,讓硬件執(zhí)行任務(wù)。執(zhí)行完成之后,再從內(nèi)核態(tài)返回給系統(tǒng)調(diào)用,最后系統(tǒng)調(diào)用將結(jié)果返回給用戶態(tài)的進(jìn)程。

top可以查看CPU總體消耗,包括分項(xiàng)消耗,如User,System,Idle,nice等。Shift + H顯示java線程;Shift + M按照內(nèi)存使用排序;Shift + P按照CPU使用時間(使用率)排序;Shift + T按照CPU累積使用時間排序;多核CPU,進(jìn)入top視圖1,可以看到各各CPU的負(fù)載情況。

top - 15:24:11 up 8 days,  7:52,  1 user,  load average: 5.73, 6.85, 7.33
Tasks:  17 total,   1 running,  16 sleeping,   0 stopped,   0 zombie %Cpu(s): 13.9 us,  9.2 sy,  0.0 ni, 76.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.7 st KiB Mem : 11962365+total, 50086832 free, 38312808 used, 31224016 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 75402760 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   300 ymmapp    20   0 17.242g 1.234g  14732 S   2.3  1.1   9:40.38 java
     1 root      20   0   15376   1988   1392 S   0.0  0.0   0:00.06 sh
    11 root      20   0  120660  11416   1132 S   0.0  0.0   0:04.94 python
    54 root      20   0   85328   2240   1652 S   0.0  0.0   0:00.00 su
    55 ymmapp    20   0   17432   1808   1232 S   0.0  0.0   0:00.00 bash
    56 ymmapp    20   0   17556   2156   1460 S   0.0  0.0   0:00.03 control.sh
    57 ymmapp    20   0   11880    740    576 S   0.0  0.0   0:00.00 tee
   115 ymmapp    20   0   17556   2112   1464 S   0.0  0.0   0:00.02 control_new_war
   133 root      20   0  106032   4240   3160 S   0.0  0.0   0:00.03 sshd
   134 ymmapp    20   0   17080   6872   3180 S   0.0  0.0   0:01.82 ops-updater
   147 ymmapp    20   0   17956   2636   1544 S   0.0  0.0   0:00.07 control.sh
  6538 ymmapp    20   0  115656  10532   3408 S   0.0  0.0   0:00.46 beidou-agent
  6785 ymmapp    20   0 2572996  22512   2788 S   0.0  0.0   0:03.44 gatherinfo4dock
 29241 root      20   0  142148   5712   4340 S   0.0  0.0   0:00.04 sshd
 29243 1014154   20   0  142148   2296    924 S   0.0  0.0   0:00.00 sshd
 29244 1014154   20   0   15208   2020   1640 S   0.0  0.0   0:00.00 bash
 32641 1014154   20   0   57364   2020   1480 R   0.0  0.0   0:00.00 top

第一行:15:24:11 up 8 days, 7:52, 1 user, load average: 5.73, 6.85, 7.33:15:24:11 系統(tǒng)時間,up 8 days 運(yùn)行時間,1 user 當(dāng)前登錄用戶數(shù),load average 負(fù)載均衡情況,分別表示1分鐘,5分鐘,15分鐘負(fù)載情況。

第二行:Tasks: 17 total, 1 running, 16 sleeping, 0 stopped, 0 zombie:總進(jìn)程數(shù)17,運(yùn)行數(shù)1,休眠 16,停止0,僵尸進(jìn)程0。

第三行:%Cpu(s): 13.9 us, 9.2 sy, 0.0 ni, 76.1 id, 0.1 wa, 0.0 hi, 0.1 si, 0.7 st:用戶空間CPU占比13.9%,內(nèi)核空間CPU占比9.2%,改變過優(yōu)先級的進(jìn)程CPU占比0%,空閑CPU占比76.1,IO等待占用CPU占比0.1%,硬中斷占用CPU占比0%,軟中斷占用CPU占比0.1%,當(dāng)前VM中的cpu 時鐘被虛擬化偷走的比例0.7%。

第四和第五行表示內(nèi)存和swap區(qū)域的使用情況。

第七行表示:

  • PID: 進(jìn)程id
  • USER:進(jìn)程所有者
  • PR:進(jìn)程優(yōu)先級
  • NI:nice值。負(fù)值表示高優(yōu)先級,正值表示低優(yōu)先級
  • VIRT:虛擬內(nèi)存,進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES
  • RES:常駐內(nèi)存,進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA
  • SHR:共享內(nèi)存,共享內(nèi)存大小,單位kb
  • S:進(jìn)程狀態(tài)。D=不可中斷的睡眠狀態(tài) R=運(yùn)行 S=睡眠 T=跟蹤/停止 Z=僵尸進(jìn)程
  • %CPU:上次更新到現(xiàn)在的CPU時間占用百分比
  • %MEM:進(jìn)程使用的物理內(nèi)存百分比
  • TIME+:進(jìn)程使用的CPU時間總計,單位1/100秒
  • COMMAND:進(jìn)程名稱(命令名/命令行)

計算在cpu load里面的uninterruptedsleep的任務(wù)數(shù)量

top -b -n 1 | awk '{if (NR<=7)print;else if($8=="D"){print;count++}}END{print "Total status D:"count}' [root@localhost ~]# top -b -n 1 | awk '{if (NR<=7)print;else if($8=="D"){print;count++}}END{print "Total status D:"count}' top - 15:35:05 up 1 day, 26 min,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.5 us, 10.0 sy,  0.0 ni, 87.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1421760 total,   104516 free,   777344 used,   539900 buff/cache
KiB Swap:  2097148 total,  2071152 free,    25996 used.   456028 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
Total status D:

sar

通過sar -u 3可以查看CUP總體消耗占比:

[root@localhost ~]# sar -u 3
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年05月01日  _x86_64_        (2 CPU)

15時18分03秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
15時18分06秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15時18分09秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15時18分12秒     all      0.17      0.00      0.17      0.00      0.00     99.66
15時18分15秒     all      0.00      0.00      0.00      0.00      0.00    100.00
15時18分18秒     all      0.00      0.00      0.00      0.00      0.00    100.00
  • %user:用戶空間的CPU使用。
  • %nice:改變過優(yōu)先級的進(jìn)程的CPU使用率。
  • %system:內(nèi)核空間的CPU使用率。
  • %iowait:CPU等待IO的百分比 。
  • %steal:虛擬機(jī)的虛擬機(jī)CPU使用的CPU。
  • %idle:空閑的CPU。

在以上的顯示當(dāng)中,主要看%iowait和%idle:

  • 若%iowait的值過高,表示硬盤存在I/O瓶頸;
  • 若%idle的值高但系統(tǒng)響應(yīng)慢時,有可能是 CPU 等待分配內(nèi)存,此時應(yīng)加大內(nèi)存容量;
  • 若%idle的值持續(xù)低于 10,則系統(tǒng)的 CPU 處理能力相對較低,表明系統(tǒng)中最需要解決的資源是 CPU;

定位線上最耗CPU的線程

準(zhǔn)備工作

啟動一個程序。arthas-demo是一個簡單的程序,每隔一秒生成一個隨機(jī)數(shù),再執(zhí)行質(zhì)因數(shù)分解,并打印出分解結(jié)果。

curl -O https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
[root@localhost ~]# curl -O https://alibaba.github.io/arthas/arthas-demo.jar % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3743  100  3743    0     0   3022      0  0:00:01  0:00:01 --:--:--  3023
[root@localhost ~]# java -jar arthas-demo.jar 1813=7*7*37
illegalArgumentCount:  1, number is: -180005, need >= 2
illegalArgumentCount:  2, number is: -111175, need >= 2
18505=5*3701
166691=7*23813
105787=11*59*163
60148=2*2*11*1367
196983=3*3*43*509
illegalArgumentCount:  3, number is: -173479, need >= 2
illegalArgumentCount:  4, number is: -112840, need >= 2
39502=2*19751
....

通過top命令找到最耗時的進(jìn)程

[root@localhost ~]# top
top - 11:11:05 up 20:02,  3 users,  load average: 0.09, 0.07, 0.05
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie %Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st KiB Mem :  1421760 total,   135868 free,   758508 used,   527384 buff/cache
KiB Swap:  2097148 total,  2070640 free,    26508 used.   475852 avail Mem
Change delay from 3.0 to
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 98344 root      20   0 2422552  23508  12108 S   0.7  1.7   0:00.32 java
     1 root      20   0  194100   6244   3184 S   0.0  0.4   0:20.41 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.12 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:20.25 ksoftirqd/0

找到進(jìn)程號是98344。

找到進(jìn)程中最耗CUP的線程

使用ps -Lp #pid cu命令,查看某個進(jìn)程中的線程CPU消耗排序:

[root@localhost ~]# ps -Lp 98344 cu
USER        PID    LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      98344  98344  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 java
root      98344  98345  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:04 java
root      98344  98346  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:01 VM Thread
root      98344  98347  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Reference Handl
root      98344  98348  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Finalizer
root      98344  98349  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Signal Dispatch
root      98344  98350  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:05 C2 CompilerThre
root      98344  98351  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 C1 CompilerThre
root      98344  98352  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Service Thread
root      98344  98353  0.1   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:19 VM Periodic Tas

看TIME列可以看出那個線程耗費(fèi)CUP多,根據(jù)LWP列可以看到線程的ID號,但是需要轉(zhuǎn)換成16進(jìn)制才可以查詢線程堆棧信息。

獲取線程id的十六進(jìn)制碼

使用printf '%x\n' 98345命令做進(jìn)制轉(zhuǎn)換:

[root@localhost ~]# printf '%x\n' 98345
18029

查看線程堆棧信息

使用jstack獲取堆棧信息jstack 98344 | grep -A 10 18029:

[root@localhost ~]# jstack 98344 | grep -A 10 18029
"main" #1 prio=5 os_prio=0 tid=0x00007fb88404b800 nid=0x18029 waiting on condition [0x00007fb88caab000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at demo.MathGame.main(MathGame.java:17)

"VM Thread" os_prio=0 tid=0x00007fb8840f2800 nid=0x1802a runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007fb884154000 nid=0x18031 waiting on condition

通過命令我們可以看到這個線程的對應(yīng)的耗時代碼是在demo.MathGame.main(MathGame.java:17)

grep -C 5 foo file 顯示file文件里匹配foo字串那行以及上下5行
grep -B 5 foo file 顯示foo及前5行
grep -A 5 foo file 顯示foo及后5行

網(wǎng)絡(luò)瓶頸

定位丟包,錯包情況

watch more /proc/net/dev用于定位丟包,錯包情況,以便看網(wǎng)絡(luò)瓶頸,重點(diǎn)關(guān)注drop(包被丟棄)和網(wǎng)絡(luò)包傳送的總量,不要超過網(wǎng)絡(luò)上限:

[root@localhost ~]# watch -n 2 more /proc/net/dev
Every 2.0s: more /proc/net/dev                                                                                                                                                   Fri May  1 17:16:55 2020

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:   10025     130    0    0    0     0          0         0    10025     130    0    0    0     0       0          0
 ens33: 759098071  569661    0    0    0     0          0         0 19335572  225551    0    0    0     0       0          0
  • 最左邊的表示接口的名字,Receive表示收包,Transmit表示發(fā)送包;
  • bytes:表示收發(fā)的字節(jié)數(shù);
  • packets:表示收發(fā)正確的包量;
  • errs:表示收發(fā)錯誤的包量;
  • drop:表示收發(fā)丟棄的包量;

查看路由經(jīng)過的地址

traceroute ip可以查看路由經(jīng)過的地址,常用來統(tǒng)計網(wǎng)絡(luò)在各個路由區(qū)段的耗時,如:

[root@localhost ~]# traceroute 14.215.177.38
traceroute to 14.215.177.38 (14.215.177.38), 30 hops max, 60 byte packets
 1  CD-HZTK5H2.mshome.net (192.168.137.1)  0.126 ms * *
 2  * * *
 3  10.250.112.3 (10.250.112.3)  12.587 ms  12.408 ms  12.317 ms
 4  172.16.227.230 (172.16.227.230)  2.152 ms  2.040 ms  1.956 ms
 5  172.16.227.202 (172.16.227.202)  11.884 ms  11.746 ms  12.692 ms
 6  172.16.227.65 (172.16.227.65)  2.665 ms  3.143 ms  2.923 ms
 7  171.223.206.217 (171.223.206.217)  2.834 ms  2.752 ms  2.654 ms
 8  182.150.18.205 (182.150.18.205)  5.145 ms  5.815 ms  5.542 ms
 9  110.188.6.33 (110.188.6.33)  3.514 ms 171.208.199.185 (171.208.199.185)  3.431 ms 171.208.199.181 (171.208.199.181)  10.768 ms
10  202.97.29.17 (202.97.29.17)  29.574 ms 202.97.30.146 (202.97.30.146)  32.619 ms *
11  113.96.5.126 (113.96.5.126)  36.062 ms 113.96.5.70 (113.96.5.70)  35.940 ms 113.96.4.42 (113.96.4.42)  45.859 ms
12  90.96.135.219.broad.fs.gd.dynamic.163data.com.cn (219.135.96.90)  35.680 ms  35.468 ms  35.304 ms
13  14.215.32.102 (14.215.32.102)  35.135 ms 14.215.32.110 (14.215.32.110)  35.613 ms 14.29.117.242 (14.29.117.242)  54.712 ms
14  * 14.215.32.134 (14.215.32.134)  49.518 ms 14.215.32.122 (14.215.32.122)  47.652 ms
15  * * *
...

查看網(wǎng)絡(luò)錯誤

netstat -i可以查看網(wǎng)絡(luò)錯誤:

[root@localhost ~]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33            1500   570291      0      0 0        225897      0      0      0 BMRU
lo              65536      130      0      0 0           130      0      0      0 LRU
  • Iface: 網(wǎng)絡(luò)接口名稱;
  • MTU: 最大傳輸單元,它限制了數(shù)據(jù)幀的最大長度,不同的網(wǎng)絡(luò)類型都有一個上限值,如:以太網(wǎng)的MTU是1500;
  • RX-OK:接收時,正確的數(shù)據(jù)包數(shù)。
  • RX-ERR:接收時,產(chǎn)生錯誤的數(shù)據(jù)包數(shù)。
  • RX-DRP:接收時,丟棄的數(shù)據(jù)包數(shù)。
  • RX-OVR:接收時,由于過速(在數(shù)據(jù)傳輸中,由于接收設(shè)備不能接收按照發(fā)送速率傳送來的數(shù)據(jù)而使數(shù)據(jù)丟失)而丟失的數(shù)據(jù)包數(shù)。
  • TX-OK:發(fā)送時,正確的數(shù)據(jù)包數(shù)。
  • TX-ERR:發(fā)送時,產(chǎn)生錯誤的數(shù)據(jù)包數(shù)。
  • TX-DRP:發(fā)送時,丟棄的數(shù)據(jù)包數(shù)。
  • TX-OVR:發(fā)送時,由于過速而丟失的數(shù)據(jù)包數(shù)。
  • Flg:標(biāo)志,B 已經(jīng)設(shè)置了一個廣播地址。L 該接口是一個回送設(shè)備。M 接收所有數(shù)據(jù)包(混亂模式)。N 避免跟蹤。O 在該接口上,禁用ARP。P 這是一個點(diǎn)到點(diǎn)鏈接。R 接口正在運(yùn)行。U 接口處于“活動”狀態(tài)。

包的重傳率

cat /proc/net/snmp用來查看和分析240秒內(nèi)網(wǎng)絡(luò)包量,流量,錯包,丟包。通過RetransSegs和OutSegs來計算重傳率tcpetr=RetransSegs/OutSegs。

[root@localhost ~]# cat /proc/net/snmp
Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
Ip: 1 64 241708 0 0 0 0 0 238724 225517 15 0 0 0 0 0 0 0 0
Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
Icmp: 149 0 0 50 99 0 0 0 0 0 0 0 0 0 147 0 147 0 0 0 0 0 0 0 0 0 0
IcmpMsg: InType3 InType11 OutType3
IcmpMsg: 50 99 147
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
Tcp: 1 200 120000 -1 376 6 0 0 4 236711 223186 292 0 4 0
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors
Udp: 1405 438 0 1896 0 0 0
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors
UdpLite: 0 0 0 0 0 0 0

重傳率=292/223186≈0.13%

  • 平均每秒新增TCP連接數(shù):通過/proc/net/snmp文件得到最近240秒內(nèi)PassiveOpens的增量,除以240得到每秒的平均增量;
  • 機(jī)器的TCP連接數(shù) :通過/proc/net/snmp文件的CurrEstab得到TCP連接數(shù);
  • 平均每秒的UDP接收數(shù)據(jù)報:通過/proc/net/snmp文件得到最近240秒內(nèi)InDatagrams的增量,除以240得到平均每秒的UDP接收數(shù)據(jù)報;
  • 平均每秒的UDP發(fā)送數(shù)據(jù)報:通過/proc/net/snmp文件得到最近240秒內(nèi)OutDatagrams的增量,除以240得到平均每秒的UDP發(fā)送數(shù)據(jù)報;

磁盤瓶頸

查磁盤空間

查看磁盤剩余空間

查看磁盤剩余空間使用df -hl命令:

[root@localhost ~]# df -hl
文件系統(tǒng)                       容量  已用  可用 已用% 掛載點(diǎn)
devtmpfs                       678M     0  678M    0% /dev
tmpfs                          695M     0  695M    0% /dev/shm
tmpfs                          695M   28M  667M    4% /run
tmpfs                          695M     0  695M    0% /sys/fs/cgroup
/dev/mapper/centos_aubin-root   27G  5.6G   22G   21% /
/dev/sda1                     1014M  211M  804M   21% /boot

查看磁盤已使用空間

du -sh命令是查看磁盤已使用空間的情況,這里的“已使用的磁盤空間”意思是指定的文件下的整個文件層次結(jié)構(gòu)所使用的空間,在沒給定參數(shù)的情況下,du報告當(dāng)前目錄所使用的磁盤空間。其實(shí)就是顯示文件或目錄所占用的磁盤空間的情況

[root@localhost ~]# du -sh
64K
  • -h:輸出文件系統(tǒng)分區(qū)使用的情況,例如:10KB,10MB,10GB等。
  • -s:顯示文件或整個目錄的大小,默認(rèn)單位是KB。

!! du的詳細(xì)信息可以通過man du查看。

查看磁盤讀寫情況

查看磁盤總體讀寫情況

通iostat查看磁盤總體的讀寫情況:

[root@localhost ~]# iostat
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年05月02日  _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.17    0.00    0.20    0.46    0.00   99.17

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.56        30.45        39.61    4659620    6060644
scd0              0.00         0.02         0.00       3102          0
dm-0              1.96        30.01        38.42    4591998    5878155
dm-1              0.09         0.09         0.30      13840      45328
  • tps:該設(shè)備每秒的傳輸次數(shù)。
  • kB_read/s:每秒從設(shè)備(drive expressed)讀取的數(shù)據(jù)量;
  • kB_wrtn/s:每秒向設(shè)備(drive expressed)寫入的數(shù)據(jù)量;
  • kB_read:讀取的總數(shù)據(jù)量;
  • kB_wrtn:寫入的總數(shù)量數(shù)據(jù)量;

查看磁盤詳細(xì)讀寫情況

通過iostat -x 1 3可以看到磁盤詳細(xì)讀寫情況,沒隔一秒輸出一次一共輸出3次,當(dāng)看到I/O等待時間所占CPU時間的比重很高的時候,首先要檢查的就是機(jī)器是否正在大量使用交換空間,同時關(guān)注iowait占比cpu的消耗是否很大,如果大說明磁盤存在大的瓶頸,同時關(guān)注await,表示磁盤的響應(yīng)時間以便小于5ms:

[root@localhost ~]# iostat -x 1 3
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年05月02日  _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.17    0.00    0.20    0.46    0.00   99.16

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.01     0.49    0.63    0.95    30.59    39.78    89.58     0.34  214.23   49.16  323.48   8.55   1.34
scd0              0.00     0.00    0.00    0.00     0.02     0.00    98.48     0.00    1.21    1.21    0.00   0.95   0.00
dm-0              0.00     0.00    0.62    1.35    30.15    38.59    69.70     0.91  460.67   49.12  648.54   6.66   1.31
dm-1              0.00     0.00    0.02    0.07     0.09     0.30     8.52     0.04  442.74   95.43  521.17   6.91   0.06

avg-cpu表示總體cpu使用情況統(tǒng)計信息,對于多核cpu,這里為所有cpu的平均值:

  • %user:CPU處在用戶模式下的時間百分比。
  • %nice:CPU處在帶NICE值的用戶模式下的時間百分比。
  • %system:CPU處在系統(tǒng)模式下的時間百分比。
  • %iowait:CPU等待輸入輸出完成時間的百分比, 如果%iowait的值過高,表示硬盤存在I/O瓶頸。
  • %steal:管理程序維護(hù)另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
  • %idle:CPU空閑時間百分比, 如果%idle值高,表示CPU較空閑;如果%idle值高但系統(tǒng)響應(yīng)慢時,可能是CPU等待分配內(nèi)存,應(yīng)加大內(nèi)存容量;如果%idle值持續(xù)低于10,表明CPU處理能力相對較低,系統(tǒng)中最需要解決的資源是CPU。。

Device表示設(shè)備信息:

  • rrqm/s:每秒對該設(shè)備的讀請求被合并次數(shù),文件系統(tǒng)會對讀取同塊(block)的請求進(jìn)行合并
  • wrqm/s:每秒對該設(shè)備的寫請求被合并次數(shù)
  • r/s:每秒完成的讀次數(shù)
  • w/s:每秒完成的寫次數(shù)
  • rkB/s:每秒讀數(shù)據(jù)量(kB為單位)
  • wkB/s:每秒寫數(shù)據(jù)量(kB為單位)
  • avgrq-sz:平均每次IO操作的數(shù)據(jù)量(扇區(qū)數(shù)為單位)
  • avgqu-sz:平均等待處理的IO請求隊列長度
  • await:平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
  • svctm:平均每次IO請求的處理時間(毫秒為單位)
  • %util:一秒中有百分之多少的時間用于 I/O如果%util接近100%,說明產(chǎn)生的I/O請求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷。idle小于70% IO壓力就較大了,一般讀取速度有較多的wait。

!! iostat -xmd 1 3:新增m選項(xiàng)可以在輸出是使用M為單位。

查看最耗IO的進(jìn)程

一般先通過iostat查看是否存在io瓶頸,再使用iotop命令來定位那個進(jìn)程最耗費(fèi)IO:

[root@localhost ~]# iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
123931 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.02 % [kworker/1:30]
 94208 be/4 xiaolyuh    0.00 B/s    0.00 B/s  0.00 %  0.00 % nautilus-desktop --force [gmain]
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --system --deserialize 62
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
 94211 be/4 xiaolyuh    0.00 B/s    0.00 B/s  0.00 %  0.00 % gvfsd-trash --spawner :1.4 /org/gtk/gvfs/exec_spaw/0
     4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]
     6 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
     7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
     8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]
     9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
    10 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [lru-add-drain]
...

通過iotop -p pid可以查看單個進(jìn)程的IO情況:

[root@localhost ~]# iotop -p 124146
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
124146 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % java -jar arthas-demo.jar

應(yīng)用瓶頸

查看某個進(jìn)程的PID

如查看java的進(jìn)程的pid,ps -ef | grep java:

[root@localhost ~]# ps -ef | grep java
root     124146   1984  0 09:13 pts/0    00:00:06 java -jar arthas-demo.jar
root     125210  98378  0 10:07 pts/1    00:00:00 grep --color=auto java

查看特定進(jìn)程的數(shù)量

如查看java進(jìn)程的數(shù)量,ps -ef | grep java| wc -l:

[root@localhost ~]# ps -ef | grep java| wc -l
2

查看線程是否存在死鎖

查看線程是否存在死鎖,jstack -l pid:

[root@localhost ~]# jstack -l 124146
2020-05-02 10:13:38
Full thread dump OpenJDK 64-Bit Server VM (25.252-b09 mixed mode):

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f27f013c000 nid=0x1e4f9 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f27f012d000 nid=0x1e4f8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"main" #1 prio=5 os_prio=0 tid=0x00007f27f004b800 nid=0x1e4f3 waiting on condition [0x00007f27f7274000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at demo.MathGame.main(MathGame.java:17)

   Locked ownable synchronizers:
        - None
...

查看某個進(jìn)程的線程數(shù)

ps -efL | grep [PID] | wc -l,如:

[root@localhost ~]# ps -efL | grep 124146 | wc -l
12

查看具體有哪些線程用ps -Lp [pid] cu:

[root@localhost ~]# ps -Lp 124146 cu
USER        PID    LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     124146 124146  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 java
root     124146 124147  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:01 java
root     124146 124148  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 VM Thread
root     124146 124149  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 Reference Handl
root     124146 124150  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 Finalizer
root     124146 124151  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 Signal Dispatch
root     124146 124152  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 C2 CompilerThre
root     124146 124153  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 C1 CompilerThre
root     124146 124154  0.0   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:00 Service Thread
root     124146 124155  0.1   11  2.5 2489116 35724 pts/0   Sl+  09:13   0:05 VM Periodic Tas
root     124146 125362  0.0   11  2.5 2489116 35724 pts/0   Sl+  10:13   0:00 Attach Listener

統(tǒng)計所有的log文件中,包含Error字符的行

find / -type f -name "*.log" | xargs grep "ERROR",這個在排查問題過程中比較有用:

[root@localhost ~]# find / -type f -name "*.log" | xargs grep "ERROR"
/var/log/tuned/tuned.log:2020-03-13 18:05:59,145 ERROR    tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device'
/var/log/tuned/tuned.log:2020-03-13 18:05:59,145 ERROR    tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor' error: '[Errno 19] No such device'
/var/log/tuned/tuned.log:2020-04-28 14:55:34,857 ERROR    tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device'
/var/log/tuned/tuned.log:2020-04-28 14:55:34,859 ERROR    tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor' error: '[Errno 19] No such device'
/var/log/tuned/tuned.log:2020-04-28 15:23:19,037 ERROR    tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device'
...

應(yīng)用啟動時指定JVM參數(shù)

java -jar -Xms128m -Xmx1024m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=64m -XX:NewSize=64m -XX:MaxNewSize=256m arthas-demo.jar,如:

[root@localhost ~]# java -jar -Xms128m -Xmx1024m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=64m -XX:NewSize=64m -XX:MaxNewSize=256m  arthas-demo.jar
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64m; support was removed in 8.0
157518=2*3*3*3*2917
illegalArgumentCount:  1, number is: -187733, need >= 2
illegalArgumentCount:  2, number is: -102156, need >= 2
173379=3*57793

總結(jié)

在使用linux命令時,如果想看幫助可以使用--help或者man查看幫助信息:

[root@localhost ~]# grep --help
用法: grep [選項(xiàng)]... PATTERN [FILE]...
在每個 FILE 或是標(biāo)準(zhǔn)輸入中查找 PATTERN。
默認(rèn)的 PATTERN 是一個基本正則表達(dá)式(縮寫為 BRE)。
例如: grep -i 'hello world' menu.h main.c
...
[root@localhost ~]# man grep

GREP(1)                                                        General Commands Manual                                                        GREP(1)

NAME
       grep, egrep, fgrep - 打印匹配給定模式的行

總覽 SYNOPSIS
       grep [options] PATTERN [FILE...]
       grep [options] [-e PATTERN | -f FILE] [FILE...]

描述 DESCRIPTION
       Grep    搜索以    FILE    命名的文件輸入   (或者是標(biāo)準(zhǔn)輸入,如果沒有指定文件名,或者給出的文件名是   -   的話),尋找含有與給定的模式   PATTERN
...
類別 監(jiān)控命令 描述 備注
內(nèi)存瓶頸 free 查看內(nèi)存使用

vmstat 3(間隔時間) 100(監(jiān)控次數(shù)) 查看swap in/out詳細(xì)定位是否存在性能瓶頸 推薦使用

sar -r 3 和free命令類似,查看內(nèi)存的使用情況,但是不包含swap的情況
cpu瓶頸 top -H 按照cpu消耗高低進(jìn)行排序

ps -Lp 進(jìn)程號 cu 查看某個進(jìn)程的cpu消耗排序

cat /proc/cpuinfo |grep 'processor'|wc -l 查看cpu核數(shù)

top 查看cpu總體消耗,包括分項(xiàng)消耗如user,system,idle,nice等消耗

top 然后shift+h:顯示java線程,然后shift+M:按照內(nèi)存使用進(jìn)行排序;shift+P:按照cpu時間排序;shift+T:按照cpu累計使用時間排序多核cpu,按“1”進(jìn)入top視圖 專項(xiàng)性能排查,多核CPU主要看CUP各個內(nèi)核的負(fù)載情況

sar -u 3(間隔時間) 查看cpu總體消耗占比

sar -q 查看cpu load

top -b -n 1 | awk '{if (NR<=7)print;else if($8=="D"){print;count++}}END{print "Total status D:"count}' 計算在cpu load里面的uninterruptedsleep的任務(wù)數(shù)量 uninterruptedsleep的任務(wù)會被計入cpu load,如磁盤堵塞
網(wǎng)絡(luò)瓶頸 cat /var/log/messages 查看內(nèi)核日志,查看是否丟包

watch more /proc/net/dev 用于定位丟包,錯包情況,以便看網(wǎng)絡(luò)瓶頸 重點(diǎn)關(guān)注drop(包被丟棄)和網(wǎng)絡(luò)包傳送的總量,不要超過網(wǎng)絡(luò)上限

sar -n SOCK 查看網(wǎng)絡(luò)流量

netstat -na|grep ESTABLISHED|wc -l 查看tcp連接成功狀態(tài)的數(shù)量 此命令特別消耗cpu,不適合進(jìn)行長時間監(jiān)控數(shù)據(jù)收集

netstat -na|awk'{print $6}'|sort |uniq -c |sort -nr 看tcp各個狀態(tài)數(shù)量

netstat -i 查看網(wǎng)絡(luò)錯誤

ss state ESTABLISHED| wc -l 更高效地統(tǒng)計tcp連接狀態(tài)為ESTABLISHED的數(shù)量

cat /proc/net/snmp 查看和分析240秒內(nèi)網(wǎng)絡(luò)包量,流量,錯包,丟包 用于計算重傳率tcpetr=RetransSegs/OutSegs

ping $ip 測試網(wǎng)絡(luò)性能

traceroute $ip 查看路由經(jīng)過的地址 常用于定位網(wǎng)絡(luò)在各個路由區(qū)段的耗時

dig $域名 查看域名解析地址

dmesg 查看系統(tǒng)內(nèi)核日志
磁盤瓶頸 iostat -x -k -d 1 詳細(xì)列出磁盤的讀寫情況 當(dāng)看到I/O等待時間所占CPU時間的比重很高的時候,首先要檢查的就是機(jī)器是否正在大量使用交換空間,同時關(guān)注iowait占比cpu的消耗是否很大,如果大說明磁盤存在大的瓶頸,同時關(guān)注await,表示磁盤的響應(yīng)時間以便小于5ms

iostat -x 查看系統(tǒng)各個磁盤的讀寫性能 重點(diǎn)關(guān)注await和iowait的cpu占比

iotop 查看哪個進(jìn)程在大量讀取IO 一般先通過iostat查看是否存在io瓶頸,再定位哪個進(jìn)程在大量讀取IO

df -hl 查看磁盤剩余空間

du -sh 查看磁盤使用了多少空間
應(yīng)用瓶頸 ps -ef grep java 查看某個進(jìn)程的id號

ps -ef | grep httpd| wc -l 查看特定進(jìn)程的數(shù)量

cat ***.log | grep ***Exception| wc -l 統(tǒng)計日志文件中包含特定異常數(shù)量

jstack -l pid 用于查看線程是否存在死鎖

awk'{print $8}' 2017-05-22-access_log|egrep '301|302'| wc -l 統(tǒng)計log中301、302狀態(tài)碼的行數(shù),$8表示第八列是狀態(tài)碼,可以根據(jù)實(shí)際情況更改 常用于應(yīng)用故障定位

grep 'wholesaleProductDetailNew' cookie_log | awk '{if($10=="200")}'print}' awk 'print $12' | more 打印包含特定數(shù)據(jù)的12列數(shù)據(jù)

grep "2017:05:22" cookielog | awk '($12>0.3){print 8}' | sort > 目錄地址 對apache或者nginx訪問log進(jìn)行響應(yīng)時間排序,$12表示cookie log中的12列表示響應(yīng)時間 用于排查是否是由于是某些訪問超長造成整體的RT變長

grep -v 'HTTP/1.1" 200' 取出非200響應(yīng)碼的URL

pgm -A -f $應(yīng)用集群名稱 "grep "'301' log文件地址 | wc -l" 查看整個集群的log中301狀態(tài)碼的數(shù)量

ps -efL | grep [PID] | wc -l 查看某個進(jìn)程創(chuàng)建的線程數(shù)

find / -type f -name "*.log" | xargs grep "ERROR" 統(tǒng)計所有的log文件中,包含Error字符的行 這個在排查問題過程中比較有用

jstat -gc [pid] 查看gc情況

jstat -gcnew [pid] 查看young區(qū)的內(nèi)存使用情況,包括MTT(最大交互次數(shù)就被交換到old區(qū)),TT是目前已經(jīng)交換的次數(shù)

jstat -gcold 查看old區(qū)的內(nèi)存使用情況

jmap -J-d64 -dump:format=b,file=dump.bin PID dump出內(nèi)存快照 -J-d64防止jmap導(dǎo)致虛擬機(jī)crash(jdk6有bug)

-XX:+HeapDumpOnOutOfMemeryError 在java啟動時加入,當(dāng)出現(xiàn)內(nèi)存溢出時,存儲內(nèi)存快照

jmap -histo [pid] 按照對象內(nèi)存大小排序 注意會導(dǎo)致full gc

gcore [pid] 導(dǎo)出完成的內(nèi)存快照 通常和jmap -permstat /opt/**/java gcore.bin一起使用,將core dump轉(zhuǎn)換成heap dump

-XX:HeapDumpPath=/home/logs -Xloggc:/home/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps 在Java啟動參數(shù)中加入,打印gc日志

-server -Xms4000m -Xmx4000m -Xmn1500m -Xss256k -XX:PermSize=340m -XX:MaxPermSize=340m -XX:+UseConcMarkSweepGC 調(diào)整JVM堆大小 xss是棧大小


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉