性能分析之分析決策樹3與4
- 2019 年 12 月 11 日
- 筆記
背景
初學者對性能分析是個《橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。》那麼應該怎麼學習才能建立起自己的知識體系,才能做到《千山同一月,萬戶盡皆春。千江有水千江月,萬里無雲萬里天》今天咱們談談7DGroup創始人高樓老師的性能分析之決策樹分析法。
分析決策樹圖一

當物理記憶體不夠時,linux 觸發oom,將進程殺掉;可以使用vmstat可以展現給定時間間隔的伺服器的狀態值,包括Linux的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況,用於分析磁碟的壓力在哪裡,在swap,還是在load文件等
想深入了解記憶體工作原理可以查找資料繼續學習與深造。
分析決策樹圖二

在分析CPU的時候咱們需要了解下,CPU可以做什麼事情:
- First, it can be idle, which means that the processor is not actually doing any work and is waiting for something to do.
- Second, the CPU can be running user code, which is specified as "user" time.
- Third, the CPU can be executing code in the Linux kernel on behalf of the application code. This is "system" time.
- Fourth, the CPU can be executing user code that has been "nice"ed or set to run at a lower priority than normal processes.
- Fifth, the CPU can be in iowait, which mean the system is spending its time waiting for I/O (such as disk or network) to complete.
- Sixth, the CPU can be in irq state, which means it is in high-priority kernel code handling a hardware interrupt.
- Finally, the CPU can be in softirq mode, which means it is executing kernel code that was also triggered by an interrupt, but it is running at a lower priority (the bottom-half code).
If a system is spending most of its time iowait when it should be doing work, it is most likely waiting for I/O from a device. It may be a disk, network card, or something else causing the slowdown.
分析決策樹圖二

在學習Linux disk I/O 先聊下磁碟系統結構:
- 如果是IDE驅動器,磁碟命名為:hda、hdb、hdc等;
- 如果是SCSI驅動器,磁碟命名為:sda、sdb、sdc等
磁碟通常被分成多個分區,分區設備的名稱是通過將分區號添加到基本設備名稱的末尾來創建的,每個單獨的分區通常包含一個文件系統或一個交換分區,按照/etc/fstab中的指定,這些分區被裝載到Linux根文件系統中。這些掛載的文件系統包含應用程式讀寫的文件。
當應用程式執行讀或寫操作時,Linux內核可能會將文件的副本存儲在其快取或緩衝區中,並在不訪問磁碟的情況下返回所請求的資訊。但是,如果Linux內核沒有存儲在記憶體中的數據副本,它會向磁碟的I/O隊列添加一個請求。如果Linux內核注意到多個請求請求磁碟上的連續位置,它會將它們合併為一個大請求。這種合併消除了第二個請求的尋道時間,從而提高了總體磁碟性能。當請求被放入磁碟隊列時,如果磁碟當前不忙,它將開始為I/O請求提供服務。如果磁碟正忙,請求將在隊列中等待,直到驅動器可用,然後對其進行服務。
分析工具:
vmstat [-D] [-d] [-p partition]

- -d:顯示磁碟相關統計資訊。
- -D: 顯示Linux I/O子系統的總統計資訊,統計數據是自系統啟動以來的總數
- – p: 統計數據是自系統啟動以來的總數,而不僅僅是此示例和上一個示例之間發生的總數。
使用vmstat 中關於磁碟也就是 bo/bi/wa
- bo 這表示在前一間隔內寫入磁碟的塊總數。(在vmstat中,磁碟的塊大小通常為1024位元組。)
- bi 顯示在上一間隔中從磁碟讀取的塊數。(在vmstat中,磁碟的塊大小通常為1024位元組。)
- wa 表示等待I/O完成所花費的CPU時間。每秒寫入磁碟塊的速率
分析決策樹圖三

參考命令:hostname, ping, ifconfig, iwconfig, netstat, nslookup, traceroute, finger, telnet, ethtool
在學習網路層這一層需要了解下網路的七層協議:
圖片來自互聯網

作為一名未來的全棧工程師,還是有必要了解每一層做什麼,這樣在解決性能問題能如魚得水,如果想深入學習可以參加高老師課程,老師可以把大家講明白。
命令:
- ip -s [-s] link
- sar [-n DEV | EDEV | SOCK | FULL ] [DEVICE] [interval] [count]
ip -s link

簡單解釋:
- bytes 發送或接收的位元組總數。
- packets 發送或接收的數據包總數。
- errors 發送或接收時發生的錯誤數。
- dropped 由於網卡資源不足而未發送或接收的數據包數。
- overruns 網路沒有足夠緩衝空間發送或接收更多數據包的次數。
- mcast 已接收的多播數據包數。
- carrier 由於鏈路媒體故障(如電纜故障)而丟棄的數據包數。
- collsns 這是設備在傳輸時遇到的衝突數。當兩台設備試圖同時使用網路時,就會發生這種情況。
sar -n DEV 1 2
sar -n SOCK 1 2

具體什麼意思大家可以百度查詢
也可使用命令:yum install iptraf
執行:iptraf-ng -d eth0 -t 1 就能看到相關資訊

通過 iptraf-ng -s eth0 -t 10 命令就知道那個埠進出流量是多少

netstat
[-p] [-c] [–interfaces=<name>] [-s] [-t] [-u] [-w]

netstat -t -c

netstat -t -p

netstat -s -u

還有很多用法,大家可以參看幫助文檔
第一層是業務指標,
- 響應時間
- TPS
- 錯誤率
第二層是作業系統
- CPU
- IO
- MEM
- NET
分析
在這一層咱們主要關注MEM ,既然是關注MEN,如果MEN高應該怎麼去分析?怎麼定位?
linux命令 free

說明:
- total:總計物理記憶體的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多個進程共享的記憶體總額。
- Buffers/cached:磁碟快取的大小。
In addition to the CPU statistics vmstat can provide, you can invoke vmstat with the following command-line options when investigating memory statistics:
複習觀察Linux 記憶體資訊命令
vmstat [-a] [-s] [-m] [-d] [-p] [n] [-f] [-v]
解釋
- -a:顯示活躍和非活躍記憶體
- -f:顯示從系統啟動至今的fork數量 。
- -m:顯示slabinfo
- -n:只在開始時顯示一次各欄位名稱。
- -s:顯示記憶體相關統計資訊及多種系統活動數量。
- delay:刷新時間間隔。如果不指定,只顯示一條結果。
- count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。
- -d:顯示磁碟相關統計資訊。
- -p:顯示指定磁碟分區統計資訊
- -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576位元組(byte)。默認單位為K(1024 bytes)
- -V:顯示vmstat版本資訊。
下面具體每個資訊代表什麼,大家百度查下,知識需要不斷重複學習才能記住,網上有很多,只是把知識搬運過來,給大複習。

vmstat -m 顯示的資訊與cat /proc/slabinfo顯示的資訊相同

This describes in detail how the kernel's memory is allocated and can be helpful to determine what area of the kernel is consuming the most memory.
意思就是說:通過這個命令就能知道記憶體在那個區域消耗最多。
在學一個命令:vmstat -s

以上資訊可以:準確跟蹤內核如何使用其記憶體時非常有用
top

這一行可以觀察出來記憶體情況

如果想進一步學習可以參考《Optimizing Linux Performance .chm》
總結
想做好一件事,需要很多個知識點,但很多知識點需要不斷學習、複習與思考才能在關鍵的時候用,上面知識相信大家都知道,但是否在關鍵的時候想起使用那個命令解決問題,如果沒有想起,那麼該知識點還是沒有掌握與融匯貫通。