服務(wù)器性能查看

概述

什么是性能诈悍?

性能最通俗的衡量指標就是“時間”简珠,CPU的使用率指的是CPU用于計算的時間占比潜叛,磁盤使用率指的是磁盤操作的時間占比。
當CPU使用率100%時趴酣,意味著有部分請求來不及計算,響應(yīng)時間增加或者超時坑夯;
當磁盤使用率100%時岖寞,意味著有部分請求需要等待IO操作,響應(yīng)時間也會增加或者超時渊涝。
換言之慎璧,所有的操作都在理想的時間內(nèi)床嫌,就不存在“性能優(yōu)化“的問題跨释。我們在分析性能的時候,總是會首先要找到是什么引起響應(yīng)時間變慢了厌处,對應(yīng)單機性能的分析鳖谈,一般我們會將目光鎖定在CPU和IO上,因為對于應(yīng)用程序一般分為CPU bound型和IO阔涉。
bound型缆娃,即計算密集型或者讀寫密集型;至于內(nèi)存瑰排,其性能因素往往也會反映到CPU或者IO上贯要,因為內(nèi)存的設(shè)計初衷就是提高內(nèi)核指令和應(yīng)用程序的讀寫性能。
當內(nèi)存不足椭住,系統(tǒng)可能進行大量的交換操作崇渗,這時候磁盤可能成為瓶頸;而缺頁京郑、內(nèi)存分配宅广、釋放、復(fù)制些举、內(nèi)存地址空間映射等等問題又可能引起CPU的瓶頸跟狱;更嚴重的情況是直接影響功能,這個就不僅僅是性能的問題了户魏。
性能優(yōu)化并不是一個孤立的課題驶臊,除了響應(yīng)時間的考慮,我們往往還需要綜合功能完整性叼丑、安全性等等方面的問題关翎。

性能分析的基礎(chǔ)

性能優(yōu)化需要厚實的基礎(chǔ)知識:

  • 操作系統(tǒng)
    操作系統(tǒng)管理著應(yīng)用程序所需要的所有資源,例如CPU和IO幢码,當任何一個組件出現(xiàn)問題笤休,我們的分析也是基于操作系統(tǒng)的,例如文件系統(tǒng)類型症副,磁盤類型店雅,磁盤raid類型都需要操作系統(tǒng)管理和支持政基。
  • 系統(tǒng)編程技術(shù)
    系統(tǒng)編程技術(shù)涉及到我們?nèi)绾问褂孟到y(tǒng)資源,例如對IO的操作我們可以使用buffering I/O闹啦,也可以使用Direct IO沮明,可以采用同步的方式,也可以采用異步的方式窍奋,可以使用多進程荐健,也可以使用多線程的方式。懂得不同編程技術(shù)的原理琳袄,有利于問題的分析江场。
  • 應(yīng)用程序
    例如數(shù)據(jù)庫組件的數(shù)據(jù)類型、引擎窖逗、索引址否、復(fù)制、配置參數(shù)碎紊、備份佑附、高可用等等都可能是性能問題的元兇。

性能分析的方法論

問題分析方面仗考,各類方法論如金字塔思維音同、5W2H、麥肯錫七步法等等秃嗜。套用5W2H方法权均,可以提出性能分析的幾個問題

  • What-現(xiàn)象的表現(xiàn)是什么樣的
  • When-什么時候發(fā)生
  • Why-為什么會發(fā)生
  • Where-哪個地方發(fā)生的問題
  • How much-耗費了多少資源,問題解決后能減少多少資源耗用
  • How to do-怎么解決問題
    但是這些只能給出方向痪寻,性能分析需要找到原因需要更具體的方法螺句,怎么解決一個問題也需要更加具體的方式。
    Brendan Gregg在《性能之巔:洞悉系統(tǒng)橡类、企業(yè)與云計算》第二章中講到大量的方法蛇尚,比較突出的如Use方法、負載特征歸納顾画、性能監(jiān)控取劫、靜態(tài)性能調(diào)優(yōu)、延時分析研侣、工具法等等谱邪。
    其中工具法最具體,但是工具法也有自己的限制庶诡,如磁盤的飽和度惦银,在磁盤使用率100%的時候,磁盤的負載可能還可以繼續(xù)增加。在實際分析問題中扯俱,負載特征歸納更有指導(dǎo)意義书蚪,靜態(tài)跟蹤和動態(tài)跟蹤讓我們更容易更直觀發(fā)現(xiàn)問題。

CPU

認識CPU

CPU本身的架構(gòu)和內(nèi)核調(diào)度器的架構(gòu)這里不做詳細講述迅栅,具體可以參考操作系統(tǒng)類書籍殊校。但是仍然需要清楚一些概念:

  • 處理器
  • 硬件線程
  • CPU內(nèi)存緩存
  • 時鐘頻率
  • 每指令周期數(shù)CPI和每周期指令數(shù)IPC
  • CPU指令
  • 使用率
  • 用戶時間/內(nèi)核時間
  • 調(diào)度器
  • 運行隊列
  • 搶占
  • 多進程
  • 多線程
  • 字長
    針對應(yīng)用程序,我們通常關(guān)注的是內(nèi)核CPU調(diào)度器功能和性能
    線程的狀態(tài)分析主要是分析線程的時間用在什么地方读存,而線程狀態(tài)的分類一般分為:

on-CPU:執(zhí)行中为流,執(zhí)行中的時間通常又分為用戶態(tài)時間user和系統(tǒng)態(tài)時間sys。

off-CPU:等待下一輪上CPU让簿,或者等待I/O敬察、鎖、換頁等等拜英,其狀態(tài)可以細分為可執(zhí)行静汤、匿名換頁、睡眠居凶、鎖、空閑等狀態(tài)藤抡。

如果大量時間花在CPU上侠碧,對CPU的剖析能夠迅速解釋原因;如果系統(tǒng)時間大量處于off-cpu狀態(tài)缠黍,定位問題就會費時很多弄兜。

分析方法與工具

在觀察CPU性能的時候,按照負載特征歸納的方法瓷式,可以檢查如下清單:

  • 整個系統(tǒng)范圍內(nèi)的CPU負載如何替饿,CPU使用率如何,單個CPU的使用率呢贸典?
  • CPU負載的并發(fā)程度如何视卢?是單線程嗎?有多少線程廊驼?
  • 哪個應(yīng)用程序在使用CPU据过,使用了多少?
  • 哪個內(nèi)核線程在使用CPU妒挎,使用了多少绳锅?
  • 中斷的CPU用量有多少?
  • 用戶空間和內(nèi)核空間使用CPU的調(diào)用路徑是什么樣的酝掩?
  • 遇到了什么類型的停滯周期鳞芙?

要回答上面的問題,使用系統(tǒng)性能分析工具最經(jīng)濟和直接,這里列舉的工具足夠回答上面的問題:
| 工具 | 描述 |
| uptime | 平均負載 |
| vmstat | 包括系統(tǒng)范圍的CPU平均負載 |
| top | 監(jiān)控每個進程/線程CPU用量 |
| pidstat | 每個進程/線程CPU用量分解 |
| ps | 進程狀態(tài) |
| perf | CPU剖析和跟蹤原朝,性能計數(shù)器分析 |

上述問題中闯割,調(diào)用路徑和停滯周期的分析可以使用perf工具,也可以使用DTrace等更靈活的工具竿拆。

其中perf支持對各類內(nèi)核時間的跟蹤計數(shù)統(tǒng)計宙拉,可以使用perf list查看。例如停滯周期分析可能十分復(fù)雜丙笋,需要對CPU和調(diào)度器架構(gòu)有較系統(tǒng)的認識和了解谢澈。

停滯的周期可能發(fā)生在一級、二級或者三級緩存御板,如緩存未命中锥忿,也可能是內(nèi)存IO和資源IO上的停滯周期,perf中有諸如L1-dcahce-loads怠肋,L1-icache-loads等事件的計數(shù)統(tǒng)計敬鬓。
Linux查看CPU
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
(看到有8個邏輯CPU, 也知道了CPU型號)
cat /proc/cpuinfo | grep physical | uniq -c
4 physical id : 0
4 physical id : 1
(說明實際上是兩顆4核的CPU)
getconf LONG_BIT
32
(說明當前CPU運行在32bit模式下, 但不代表CPU不支持64bit)
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
8
(結(jié)果大于0, 說明支持64bit計算. lm指long mode, 支持lm則是64bit)
再完整看cpu詳細信息, 不過大部分我們都不關(guān)心而已.
dmidecode | grep 'Processor Information'
查看內(nèi)存信息
cat /proc/meminfo
uname -a
[Linux] euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux
(查看當前操作系統(tǒng)內(nèi)核信息)
cat /etc/issue | grep Linux
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
(查看當前操作系統(tǒng)發(fā)行版信息)
查看機器型號
dmidecode | grep "Product Name"

內(nèi)存

認識內(nèi)存

如前所述,內(nèi)存是為提高效率而生笙各,實際分析問題的時候钉答,內(nèi)存出現(xiàn)問題可能不只是影響性能,而是影響服務(wù)或者引起其他問題杈抢。同樣對于內(nèi)存有些概念需要清楚:

  • 主存
  • 虛擬內(nèi)存
  • 常駐內(nèi)存
  • 地址空間
  • OOM
  • 頁緩存
  • 缺頁
  • 換頁
  • 交換空間
  • 交換
  • 用戶分配器libc数尿、glibc、libmalloc和mtmalloc
  • LINUX內(nèi)核級SLUB分配器

分析方法與工具

Brendan在書中給出了一些問題惶楼,比如內(nèi)存總線的平衡性右蹦,NUMA系統(tǒng)中,內(nèi)存是否被分配到合適的節(jié)點中去等等歼捐,這些問題在實際分析問題的時候何陆,并不能作為切入點,需要持續(xù)的分析豹储。因此筆者簡化為如下清單:

  • 系統(tǒng)范圍內(nèi)的物理內(nèi)存和虛擬內(nèi)存使用率
  • 換頁贷盲、交換、oom的情況
  • 內(nèi)核和文件系統(tǒng)緩存的使用情況
  • 進程的內(nèi)存用于何處
  • 進程為何分配內(nèi)存
  • 內(nèi)核為何分配內(nèi)存
  • 哪些進程在持續(xù)地交換
  • 進程或者內(nèi)存是否存在內(nèi)存泄漏颂翼?
    內(nèi)存的分析工具如下:
    | 工具 | 描述 |
    | free | 緩存容量統(tǒng)計信息 |
    | vmstat | 虛擬內(nèi)存統(tǒng)計信息 |
    | top | 監(jiān)視每個進程的內(nèi)存使用情況 |
    | ps | 進程狀態(tài) |
    | Dtrace | 分配跟蹤 |
    除了DTrace晃洒,所有的工具只能回答信息統(tǒng)計,進程的內(nèi)存使用情況等等朦乏,至于是否發(fā)生內(nèi)存泄漏等球及,只能通過分配跟蹤。

但是DTrace需要對內(nèi)核函數(shù)有很深入的了解呻疹,通過D語言編寫腳本完成跟蹤吃引。Perf也有一些諸如cache-miss、page-faults的事件用于跟蹤,但是并不直觀镊尺。

Linux查看內(nèi)存

1. /proc/meminfo

查看RAM使用情況最簡單的方法是通過/proc/meminfo朦佩。這個動態(tài)更新的虛擬文件實際上是許多其他內(nèi)存相關(guān)工具(如:free / ps / top)等的組合顯示。/proc/meminfo列出了所有你想了解的內(nèi)存的使用情況庐氮。進程的內(nèi)存使用信息也可以通過/proc/<pid>/statm 和 /proc/<pid>/status 來查看语稠。
$ cat /proc/meminfo


atop命令是一個終端環(huán)境的監(jiān)控命令。它顯示的是各種系統(tǒng)資源(CPU, memory, network, I/O, kernel)的綜合弄砍,并且在高負載的情況下進行了彩色標注仙畦。

  1. atop
    $ sudo atop
  2. free
    free命令是一個快速查看內(nèi)存使用情況的方法,它是對 /proc/meminfo 收集到的信息的一個概述音婶。
    $ free -h

4. GNOME System Monitor

GNOME System Monitor 是一個顯示最近一段時間內(nèi)的CPU慨畸、內(nèi)存、交換區(qū)及網(wǎng)絡(luò)的使用情況的視圖工具衣式。它還提供了一種查看CPU及內(nèi)存使用情況的方法寸士。
$ gnome-system-monitor

5. htop

htop命令顯示了每個進程的內(nèi)存實時使用率。它提供了所有進程的常駐內(nèi)存大小碴卧、程序總內(nèi)存大小弱卡、共享庫大小等的報告。列表可以水平及垂直滾動螟深。
$ htop
6. KDE System Monitor

  1. KDE System Monitor
    功能同 4 中介紹的GENOME版本谐宙。
    $ ksysguard

7. memstat

memstat是一個有效識別executable(s), process(es) and shared libraries使用虛擬內(nèi)存情況的命令。給定一個進程ID界弧,memstat可以列出這個進程相關(guān)的可執(zhí)行文件、數(shù)據(jù)和共享庫搭综。
$ memstat -p <PID>


8. nmon
nmon是一個基于ncurses的系統(tǒng)基準測試工具垢箕,它可以監(jiān)控CPU、內(nèi)存兑巾、I/O条获、文件系統(tǒng)及網(wǎng)絡(luò)資源等的互動模式。對于內(nèi)存的使用蒋歌,它可以實時的顯示 總/剩余內(nèi)存帅掘、交換空間等信息。
$ nmon

9. ps

ps命令可以實時的顯示各個進程的內(nèi)存使用情況堂油。Reported memory usage information includes %MEM (percent of physical memory used), VSZ (total amount of virtual memory used), and RSS (total amount of physical memory used)修档。你可以使用 “–sort”選項對進程進行排序,例如按RSS進行排序:
$ ps aux --sort -rss

10. smem

smem命令允許你統(tǒng)計基于/proc信息的不同進程和用戶的內(nèi)存使用情況府框。內(nèi)存使用情況的分析可以導(dǎo)出圖表(如條形圖和餅圖)吱窝。
$ sudo smem --pie name -c "pss"

11. top

top命令提供了實時的運行中的程序的資源使用統(tǒng)計。你可以根據(jù)內(nèi)存的使用和大小來進行排序。
$ top

12. vmstat

vmstat命令顯示實時的和平均的統(tǒng)計院峡,覆蓋CPU兴使、內(nèi)存、I/O等內(nèi)容照激。例如內(nèi)存情況发魄,不僅顯示物理內(nèi)存,也統(tǒng)計虛擬內(nèi)存俩垃。
$ vmstat -s

實際案例

關(guān)于內(nèi)存泄漏励幼,從監(jiān)控和頂層觀察很難發(fā)現(xiàn)問題,一般都是從底層程序代碼來分析吆寨,案例中使用各種觀察工具和跟蹤工具都不能很確定原因所在赏淌,只能通過分析代碼來排查問題。
最終發(fā)現(xiàn)是lua腳本語言分配內(nèi)存速度快啄清,包驅(qū)動的周期性服務(wù)的用法中六水,lua自動回收不能迅速釋放內(nèi)存,而是集中回收辣卒,如果頻繁回收又可能帶來CPU的壓力掷贾。開發(fā)項目組最后采用的解決方式為分步回收,每次回收一部分內(nèi)存荣茫,然后周期性全量回收想帅。

IO

邏輯IO vs 物理IO

通常在討論問題時,總是會分析IO的負載啡莉,IO的負載通常指的是磁盤IO港准,也就是物理IO,例如我們使用iostat獲取的avgqu-sz咧欣、svctm和until等指標浅缸。
因為我們的讀寫最終都是來自或者去往磁盤的,關(guān)注磁盤的IO情況非常正確魄咕。但是我們在進行讀寫操作的時候衩椒,面向的對象大多數(shù)時候并不會直接面向磁盤,而是面向文件系統(tǒng)的哮兰,除非使用raw io的方式毛萌。
如下圖為通用的IO結(jié)構(gòu)圖,如果你想了解更詳細喝滞,可以查看第二張圖片阁将。我們知道LINUX通過文件系統(tǒng)將所有的硬件設(shè)備甚至網(wǎng)絡(luò)都抽象為文件來管理, 例如read()調(diào)用時囤躁,實際就是就是調(diào)用了vfs_read函數(shù)冀痕,文件系統(tǒng)會確認請求的數(shù)據(jù)是否在頁緩存中荔睹,如果不在內(nèi)存中,于是將請求發(fā)送到塊設(shè)備言蛇;
此時內(nèi)核會先獲取到數(shù)據(jù)在物理設(shè)備上的實際位置僻他,然后將讀請求發(fā)送給塊設(shè)備的請求隊列中,IO調(diào)度器會通過一定的調(diào)度算法腊尚,將請求發(fā)送給磁盤設(shè)備驅(qū)動層吨拗,執(zhí)行真正的讀操作。
在這一過程中可能發(fā)生哪些情況呢婿斥?如果應(yīng)用程序執(zhí)行的是大量的順序讀會怎樣劝篷?隨機讀又會怎樣?如果是順序讀民宿,正確的做法就是進行預(yù)讀娇妓,讓請求的數(shù)據(jù)落到內(nèi)存中,提升讀效率活鹰。所以在應(yīng)用程序發(fā)起一次讀哈恰,從文件系統(tǒng)到磁盤的過程中,存在讀放大的問題志群。
在寫操作時同樣存在類似的情況着绷,應(yīng)用程序發(fā)起對文件系統(tǒng)的IO操作,物理IO與應(yīng)用程序之間锌云,有時候會顯得無關(guān)荠医、間接、放大或者縮小桑涎。
無關(guān):

  • 其他的應(yīng)用程序:磁盤IO來自其他的應(yīng)用程序彬向,如監(jiān)控,agent等
  • 其他用戶:如同虛擬機母機下的其他用戶
  • 其他內(nèi)核任務(wù):如重建raid攻冷,校驗等
    間接:
  • 文件系統(tǒng)預(yù)讀:增加額外的IO幢泼,但是可能預(yù)讀的數(shù)據(jù)無用
  • 文件系統(tǒng)緩沖:寫緩存推遲或者合并回寫磁盤,造成磁盤瞬時IO壓力
    放大:
  • 文件系統(tǒng)元數(shù)據(jù):增大額外的IO
  • 文件系統(tǒng)記錄尺寸:向上對齊等增加了IO大小
    縮薪采馈:
  • 文件系統(tǒng)緩存:直接讀取緩存,而不需要操作磁盤
  • 合并:一次性回寫磁盤
  • 文件系統(tǒng)抵消:同一地址更新多次孵班,回寫磁盤時只保留最后一次修改
  • 壓縮:減少數(shù)據(jù)量

文件系統(tǒng)分析與工具

與文件系統(tǒng)相關(guān)的術(shù)語如下:

  • 文件系統(tǒng)
  • VFS
  • 文件系統(tǒng)緩存
  • 頁緩存page cache
  • 緩沖區(qū)高速緩存buffer cache
  • 目錄緩存
  • inode
  • inode緩存
    如下圖為文件系統(tǒng)緩存的結(jié)構(gòu)圖涉兽,頁緩存緩存了虛擬內(nèi)存的頁面,包括文件系統(tǒng)的頁面篙程,提升了文件和目錄的性能枷畏。Linux將緩沖區(qū)高速緩存放入到了頁緩存中,即page cache包含buffer cache虱饿。
    文件系統(tǒng)使用的內(nèi)存臟頁由內(nèi)核線程寫回磁盤拥诡,如圖中的頁面掃描器kswapd為后臺的頁面換出進程触趴,當內(nèi)存不足,超過一定時間(30s)或者有過多的臟頁時都會觸發(fā)磁盤回寫渴肉。
    文件系統(tǒng)延時指的是一個文件系統(tǒng)邏輯請求從開始到結(jié)束的時間冗懦,包括在文件系統(tǒng)、內(nèi)核磁盤IO子系統(tǒng)以及等待磁盤設(shè)備響應(yīng)的時間仇祭。同步訪問時披蕉,應(yīng)用程序會在請求時阻塞,等待文件系統(tǒng)請求結(jié)束乌奇,異步方式下没讲,文件系統(tǒng)對其并無直接影響。
    但是異步訪問也分select礁苗、poll爬凑、epoll等方式,也就是所謂的異步阻塞试伙、異步非阻塞嘁信。在異步方式下,一般是打印出用戶層發(fā)起文件系統(tǒng)邏輯IO的調(diào)用棧迁霎,得到調(diào)用了哪個函數(shù)產(chǎn)生了IO吱抚。
    Linux未提供查看文件系統(tǒng)延時的工具和接口,但是磁盤的指標信息卻比較豐富考廉,但是很多情況下秘豹,文件系統(tǒng)IO和磁盤IO之間并沒有直接關(guān)系,例如應(yīng)用程序?qū)懳募到y(tǒng)昌粤。
    但是根本不關(guān)心數(shù)據(jù)什么時候?qū)懙酱疟P了既绕,而后臺刷數(shù)據(jù)到磁盤時,可能造成磁盤IO負載增加涮坐,從磁盤角度凄贩,應(yīng)用程序的寫入可能受到影響了,而實際上應(yīng)用程序并沒有等待袱讹。
    文件系統(tǒng)的分析可以試著回答下面的問題:
  • 哪個應(yīng)用程序在使用文件系統(tǒng)疲扎?
  • 在對哪些文件進行操作?
  • 在進行什么樣的操作捷雕,讀寫比是多少椒丧,同步還是異步?
  • 文件系統(tǒng)的緩存有多大救巷,目前的使用情況壶熏?
  • 有遇到什么錯誤嗎?是請求不合法浦译,還是文件系統(tǒng)自身的問題棒假?
    其實上面的問題溯职,除了能夠看到系統(tǒng)的內(nèi)存情況,頁緩存和buffer cache大小帽哑,能夠看到哪些進程在進行讀寫操作谜酒,在讀哪些文件,其他的比如應(yīng)用程序?qū)ξ募到y(tǒng)的讀寫比祝拯,同步還是異步甚带,這些問題沒有工具能給出明確的信息。當然我們可以通過跟蹤應(yīng)用程序的內(nèi)核調(diào)用棧來發(fā)現(xiàn)問題佳头,也可以在應(yīng)用程序中輸出日志來幫助分析鹰贵。

磁盤分析與工具

在理解磁盤IO之前,同樣我們需要理解一些概念康嘉,例如:

  • 虛擬磁盤
  • 扇區(qū)
  • I/O請求
  • 磁盤命令
  • 帶寬
  • 吞吐
  • I/O延時
  • 服務(wù)時間
  • 等待時間
  • 隨機IO/連續(xù)IO
  • 同步/異步
  • 磁盤接口
  • Raid
    對于磁盤IO碉输,我們可以列出如下等問題來幫助我們分析性能問題:
  • 每塊磁盤的使用率是多少?
  • 每塊磁盤上有多長等待隊列亭珍?
  • 平均服務(wù)時間和等待時間時多少敷钾?
  • 是哪個應(yīng)用程序或者用戶正在使用磁盤?
  • 應(yīng)用程序讀寫的方式是怎樣的肄梨?
  • 為什么會發(fā)起磁盤IO阻荒,內(nèi)核調(diào)用路徑是什么樣的?
  • 磁盤上的讀寫比是多少众羡?
  • 隨機IO還是順序IO侨赡?

Linux對磁盤的性能分析工具主要如下:
| 工具 | 描述 |
| iostat | 各種單個磁盤統(tǒng)計信息 |
| iotop、pidstat | 按進程列出磁盤IO的使用情況 |
| perf粱侣、Dtrace | 跟蹤工具 |

磁盤上是隨機IO還是順序IO羊壹,很多時候我們并沒有很好的方式去判斷,因為塊設(shè)備回寫磁盤的時候齐婴,隨機IO可能已經(jīng)被整理為順序IO了油猫。對于磁盤的分析同樣可以使用perf跟蹤事件或者DTrace設(shè)置探針。
在分析mysql在某機型上做非全cache非原地更新時柠偶,為什么單實例無法將機器性能壓滿的時候情妖,我們在分析的過程中跟蹤了塊設(shè)備的內(nèi)核事件。我們對比了多實例非原地更新和單實例非原地更新的時候诱担,磁盤的操作情況鲫售。如下為非原地更新時跟蹤的結(jié)果。
對結(jié)果分析后看到该肴,單實例非原地更新時,將近30%是blk_finish_plug藐不,有70%是blk_queue_bio,而多實例時正好相反嘶朱,大量的blk_finish_plug和少量的blk_queue_bio(當然立哑,這不是為什么性能壓不滿的原因)诈茧。

Linux查看IO

1 系統(tǒng)級IO監(jiān)控

iostat

iostat -xdm 1 # 個人習慣


%util 代表磁盤繁忙程度这嚣。100% 表示磁盤繁忙, 0%表示磁盤空閑吏垮。但是注意,磁盤繁忙不代表磁盤(帶寬)利用率高
argrq-sz 提交給驅(qū)動層的IO請求大小,一般不小于4K,不大于max(readahead_kb, max_sectors_kb)
可用于判斷當前的IO模式,一般情況下,尤其是磁盤繁忙時, 越大代表順序,越小代表隨機
svctm 一次IO請求的服務(wù)時間,對于單塊盤,完全隨機讀時,基本在7ms左右,既尋道+旋轉(zhuǎn)延遲時間
注: 各統(tǒng)計量之間關(guān)系
=======================================
%util = ( r/s + w/s) * svctm / 1000 # 隊列長度 = 到達率 * 平均服務(wù)時間
avgrq-sz = ( rMB/s + wMB/s) * 2048 / (r/s + w/s) # 2048 為 1M / 512
=======================================
總結(jié):
iostat 統(tǒng)計的是通用塊層經(jīng)過合并(rrqm/s, wrqm/s)后,直接向設(shè)備提交的IO數(shù)據(jù),可以反映系統(tǒng)整體的IO狀況,但是有以下2個缺點:
1 距離業(yè)務(wù)層比較遙遠,跟代碼中的write,read不對應(yīng)(由于系統(tǒng)預(yù)讀 + pagecache + IO調(diào)度算法等因素, 也很難對應(yīng))
2 是系統(tǒng)級,沒辦法精確到進程,比如只能告訴你現(xiàn)在磁盤很忙,但是沒辦法告訴你是誰在忙,在忙什么旅敷?

2 進程級IO監(jiān)控

iotop 和 pidstat (僅rhel6u系列)

iotop 顧名思義, io版的top
pidstat 顧名思義, 統(tǒng)計進程(pid)的stat,進程的stat自然包括進程的IO狀況
這兩個命令,都可以按進程統(tǒng)計IO狀況,因此可以回答你以下二個問題

  1. 當前系統(tǒng)哪些進程在占用IO,百分比是多少?
  2. 占用IO的進程是在讀?還是在寫?讀寫量是多少?
    pidstat 參數(shù)很多,僅給出幾個個人習慣
    pidstat -d 1 #只顯示IO
       pidstat -u -r -d -t 1        # -d IO 信息,

                                           # -r 缺頁及內(nèi)存信息

                                           # -u CPU使用率

                                           # -t 以線程為統(tǒng)計單位

                                           # 1  1秒統(tǒng)計一次

iotop, 很簡單,直接敲命令


block_dump, iodump

iotop 和 pidstat 用著很爽,但兩者都依賴于/proc/pid/io文件導(dǎo)出的統(tǒng)計信息, 這個對于老一些的內(nèi)核是沒有的,比如rhel5u2
因此只好用以上2個窮人版命令來替代:

echo 1 > /proc/sys/vm/block_dump     # 開啟block_dump,此時會把io信息輸入到dmesg中
 # 源碼: submit_bio@ll_rw_blk.c:3213
watch -n 1 "dmesg -c | grep -oP \"\w+\(\d+\): (WRITE|READ)\" | sort | uniq -c"
# 不停的dmesg -c
echo 0 > /proc/sys/vm/block_dump      # 不用時關(guān)閉

也可以使用現(xiàn)成的腳本 iodump, 具體參見 http://code.google.com/p/maatkit/source/browse/trunk/util/iodump?r=5389

iotop.stp

systemtap腳本,一看就知道是iotop命令的窮人復(fù)制版,需要安裝Systemtap, 默認每隔5秒輸出一次信息
stap iotop.stp # examples/io/iotop.stp
總結(jié)
進程級IO監(jiān)控 缔杉,

  1. 可以回答系統(tǒng)級IO監(jiān)控不能回答的2個問題
  2. 距離業(yè)務(wù)層相對較近(例如,可以統(tǒng)計進程的讀寫量)
    但是也沒有辦法跟業(yè)務(wù)層的read,write聯(lián)系在一起,同時顆粒度較粗,沒有辦法告訴你,當前進程讀寫了哪些文件? 耗時? 大小 郭计?

3 業(yè)務(wù)級IO監(jiān)控

ioprofile

ioprofile 命令本質(zhì)上是 lsof + strace, 具體下載可見 [http://code.google.com/p/maatkit/](http://code.google.com/p/maatkit/)
ioprofile 可以回答你以下三個問題:
1  當前進程某時間內(nèi),在業(yè)務(wù)層面讀寫了哪些文件(read, write)?
2  讀寫次數(shù)是多少?(read, write的調(diào)用次數(shù))
3  讀寫數(shù)據(jù)量多少?(read, write的byte數(shù))
假設(shè)某個行為會觸發(fā)程序一次IO動作,例如: "一個頁面點擊,導(dǎo)致后臺讀取A,B,C文件"

============================================
./io_event # 假設(shè)模擬一次IO行為,讀取A文件一次, B文件500次, C文件500次
ioprofile -ppidof io_event-c count # 讀寫次數(shù)


ioprofile -ppidof io_event-c times # 讀寫耗時

ioprofile -ppidof io_event-c sizes # 讀寫大小

注: ioprofile 僅支持多線程程序,對單線程程序不支持. 對于單線程程序的IO業(yè)務(wù)級分析,strace足以。
總結(jié):
ioprofile本質(zhì)上是strace,因此可以看到read,write的調(diào)用軌跡,可以做業(yè)務(wù)層的io分析(mmap方式無能為力)

4 文件級IO監(jiān)控

   文件級IO監(jiān)控可以配合/補充"業(yè)務(wù)級和進程級"IO分析
   文件級IO分析,主要針對單個文件, 回答當前哪些進程正在對某個文件進行讀寫操作.
   1 lsof   或者  ls /proc/pid/fd
   2 inodewatch.stp

lsof 告訴你 當前文件由哪些進程打開
lsof ../io # io目錄 當前由 bash 和 lsof 兩個進程打開


lsof 命令 只能回答靜態(tài)的信息, 并且"打開" 并不一定"讀取", 對于 cat ,echo這樣的命令, 打開和讀取都是瞬間的,lsof很難捕捉
可以用 inodewatch.stp 來彌補
stap inodewatch.stp major minor inode # 主設(shè)備號, 輔設(shè)備號, 文件inode節(jié)點號
stap inodewatch.stp 0xfd 0x00 523170 # 主設(shè)備號, 輔設(shè)備號, inode號,可以通過 stat 命令獲得

5 磁盤碎片整理

一句話: 只要磁盤容量不常年保持80%以上,基本上不用擔心碎片問題。
如果實在擔心,可以用 defrag 腳本

6 其他IO相關(guān)命令

blockdev 系列

blockdev --getbsz /dev/sdc1 # 查看sdc1盤的塊大小
block blockdev --getra /dev/sdc1 # 查看sdc1盤的預(yù)讀(readahead_kb)大小
blockdev --setra 256 /dev/sdc1 # 設(shè)置sdc1盤的預(yù)讀(readahead_kb)大小,低版的內(nèi)核通過/sys設(shè)置,有時會失敗,不如blockdev靠譜
Linux查看磁盤
df -h:查看磁盤占用情況
df -T:查看所有磁盤的文件系統(tǒng)類型(type)
fdisk -l:查看所有被系統(tǒng)識別的磁盤
mount -t type device dir:掛載device到dir

Linux查看GPU

1. 顯示當前GPU使用情況

Nvidia自帶了一個nvidia-smi的命令行工具,會顯示顯存使用情況:
$ nvidia-smi
輸出:

2. 周期性輸出GPU使用情況

但是有時我們希望不僅知道那一固定時刻的GPU使用情況树绩,我們希望一直掌握其動向渤早,此時我們就希望周期性地輸出扛芽,比如每 10s 就更新顯示登下。 這時候就需要用到 watch命令,來周期性地執(zhí)行nvidia-smi命令了赋朦。
了解一下watch的功能:

$ whatis watch
    watch(1)    - execute a program periodically, showing output fillscreen

作用:周期性執(zhí)行某一命令,并將輸出顯示。
watch的基本用法是:
$ watch [options] command
最常用的參數(shù)是 -n, 后面指定是每多少秒來執(zhí)行一次命令。
監(jiān)視顯存:我們設(shè)置為每 10s 顯示一次顯存的情況:
$ watch -n 10 nvidia-smi
顯示如下:


這樣刃唤,只要開著這個命令行窗口,就可以每十秒刷新一次,是不是很方便呢?
如果我們希望來周期性地執(zhí)行其他命令行操作,那么就可以簡單地更換后面的nvidia-smi即可,So Cool !
具體如下所示:重要的參數(shù)主要是溫度、內(nèi)存使用谤牡、GPU占有率,具體如下紅框所示违诗。

Linux查看網(wǎng)絡(luò)

ifconfig
netstat

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壁公,一起剝皮案震驚了整個濱河市囊陡,隨后出現(xiàn)的幾起案子搪花,更是在濱河造成了極大的恐慌髓需,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僚匆,死亡現(xiàn)場離奇詭異枯跑,居然都是意外死亡,警方通過查閱死者的電腦和手機白热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粗卜,“玉大人屋确,你說我怎么就攤上這事⌒樱” “怎么了攻臀?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纱昧。 經(jīng)常有香客問我刨啸,道長,這世上最難降的妖魔是什么识脆? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任设联,我火速辦了婚禮,結(jié)果婚禮上灼捂,老公的妹妹穿的比我還像新娘离例。我一直安慰自己,他們只是感情好悉稠,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布宫蛆。 她就那樣靜靜地躺著,像睡著了一般的猛。 火紅的嫁衣襯著肌膚如雪耀盗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天卦尊,我揣著相機與錄音叛拷,去河邊找鬼。 笑死猫牡,一個胖子當著我的面吹牛胡诗,可吹牛的內(nèi)容都是我干的邓线。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼煌恢,長吁一口氣:“原來是場噩夢啊……” “哼骇陈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瑰抵,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤你雌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后二汛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿崭,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年肴颊,在試婚紗的時候發(fā)現(xiàn)自己被綠了氓栈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡婿着,死狀恐怖授瘦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竟宋,我是刑警寧澤提完,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站丘侠,受9級特大地震影響徒欣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜗字,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一打肝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽澳,春花似錦闯睹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妄讯,卻和暖如春孩锡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亥贸。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工躬窜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炕置。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓荣挨,卻偏偏與公主長得像男韧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子默垄,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容