前言java
關於本章內容,設計的東西比較多。這裏會有關於文件系統、磁盤、CPU等方面的知識,以及涉及到關於這方面的性能排查等。node
術語ios
文件系統經過緩存和緩衝以及異步I/O等手段來緩和磁盤的延時對應用程序的影響。爲了更詳細的瞭解文件系統,如下就簡單介紹一些相關術語:apache
磁盤相關術語:bootstrap
相關概念緩存
文件系統延時
文件系統延時是文件系統性能一項主要的指標,指的是一個文件系統邏輯請求從開始到結束的時間。它包括消耗在文件系統、內核磁盤I/O子系統以及等待磁盤設備——物理I/O的時間。應用程序的線程一般在請求時阻塞,等地文件系統請求的結束。這種狀況下,文件系統的延時與應用程序的性能直接和成正比關係。在某些狀況下,應用程序並不受文件系統的直接影響,例如非阻塞I/O或者I/O由一個異步線程發起。tomcat
緩存bash
文件系統啓動以後會使用主存(RAM)當緩存以提供性能。緩存大小隨時間增加而操做系統的空餘內存不斷減少,當應用程序須要更多內存時,內核應該迅速從文件系統緩存中釋放一些內存空間。文件系統用緩存(caching)提升讀性能,而用緩衝(buffering)提升寫性能。文件系統和塊設備子系統通常使用多種類型的緩存。數據結構
隨機I/O與順序I/O
一連串的文件系統邏輯I/O,按照每一個I/O的文件偏移量,能夠分爲隨機I/O與順序I/O。順序I/O裏每一個I/O都開始於上一個I/O結束的地址。隨機I/O則找不出I/O之間的關係,偏移量隨機變化。隨機的文件系統負載也包括存取隨機的文件。因爲存儲設備的某些性能特徵的緣故,文件系統一直以來在磁盤上順序和連續的存放文件數據,以努力減少隨機I/O的數目。當文件系統未能達到這個目標時,文件的擺放變得雜亂無章,順序的邏輯I/O被分解成隨機的物理I/O,這種狀況被稱爲碎片化。架構
提示:關於文件系統更多內容,還請自行查閱相關理論。好比你還須要瞭解文件系統的預讀、預取、寫回緩存、同步寫、裸I/O、直接I/O、內存映射文件、元數據等相關知識。
性能分析
具有背景知識是分析性能問題時須要瞭解的。好比硬件 cache;再好比操做系統內核。應用程序的行爲細節每每是和這些東西互相牽扯的,這些底層的東西會以意想不到的方式影響應用程序的性能,好比某些程序沒法充分利用 cache,從而致使性能降低。好比沒必要要地調用過多的系統調用,形成頻繁的內核 / 用戶切換等。若是想深刻了解Linux系統,建議購買相關書籍進行系統的學習。下面咱們介紹如何分析磁盤性能工具(其實準確來講,不僅是磁盤):
iostat
彙總了單個磁盤的統計信息,爲磁盤負載、使用率和飽和度提供了指標。默認顯示一行系統總結信息,包括內核版本、主機名、日誌、架構和CPU數量等,每一個磁盤設備都佔一行。
[root@localhost ~]# iostat Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月18日 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.74 0.00 1.24 1.35 0.00 96.67 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 14.43 456.85 60.82 218580 29098 scd0 0.02 0.09 0.00 44 0 dm-0 13.65 404.58 56.50 193571 27030 dm-1 0.27 2.23 0.00 1068 0
參數說明
以下想輸出更詳細的內容,能夠試試下面這個命令組合:
[root@localhost ~]# iostat -xkdz 1 Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月18日 _x86_64_ (1 CPU) 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 2.43 13.81 2.32 510.51 67.96 71.74 0.22 13.94 8.72 44.95 2.37 3.82 scd0 0.00 0.00 0.03 0.00 0.10 0.00 8.00 0.00 0.27 0.27 0.00 0.27 0.00 dm-0 0.00 0.00 10.52 4.73 452.10 63.13 67.56 0.44 28.56 10.41 68.93 2.47 3.76 dm-1 0.00 0.00 0.30 0.00 2.49 0.00 16.69 0.00 1.50 1.50 0.00 1.38 0.04
參數說明
既然avgrq-sz是合併以後的數字,小尺寸(16個扇區或者更小)能夠視爲沒法合併的實際I/O負載的跡象。大尺寸有多是大I/O,或者是合併的連續負載。輸出性能裏最重要的指標是await。若是應用程序和文件系統使用了下降寫延時的方法,w_await可能不那麼重要,而更應該關注r_await。
對於資源使用和容量規劃,%util仍然很重要,不過記住這只是繁忙度的一個度量(非空閒時間),對於後面有多塊磁盤支持的虛擬設備意義不大。能夠經過施加負載更好地瞭解這些設備:IOPS(r/s + w/s)以及吞吐量(rkB/s + wkB/s)。
iotop
包含磁盤I/O的top工具。
批量模式(-b)能夠提供滾動輸出。下面的演示僅僅顯示I/O進程(-o),每5秒輸出一次(-d5):
[root@localhost ~]# iotop -bod5
Total DISK READ : 0.00 B/s | Total DISK WRITE : 8.76 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 24.49 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 21203 be/3 root 0.00 B/s 815.58 B/s 0.00 % 0.01 % [jbd2/dm-2-8] 22069 be/3 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [jbd2/dm-1-8] 1531 be/0 root 0.00 B/s 6.37 K/s 0.00 % 0.01 % [loop0] 3142 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [kworker/7:0] 21246 be/4 root 0.00 B/s 1631.15 B/s 0.00 % 0.00 % java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
提示:
輸出顯示java進程正在以大約1631.15 B/s的速率施加磁盤寫負載。其餘有用的選項有-a,能夠輸出累計I/O而不是一段時間內的平均值,選項-o,只打印那些正在執行的磁盤I/O的進程。
固然顯示磁盤的命令還有例如sar、iosnoop、perf、blktrace等命令,這裏只列舉經常使用命令便可。
性能調優
文件系統優化
關於文件系統優化,並無太多的內容須要說明。就目前的狀況,Redhat Enterprise 7系列默認更換爲性能更好的XFS,這也是因爲XFS在性能表現確實很好的緣由。在咱們使用的過程當中,建議對XFS作一些簡單的優化便可,好比執行格式化時指定額外的一些參數,掛載該分區時指定一些額外的掛載參數,這些都可以提升文件系統的相關性能。
格式化時的參數:
mkfs.xfs -d agcount=256 -l size=128m,lazy-count=1,version=2 /dev/diska1
mount時的參數:
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k
磁盤相關優化
包括ionice、資源控制和內核可調參數。
ionice
Linux中的ionice命令能夠設置一個進程I/O調度級別和優先級。調度級別爲整數,0表示無,不指定級別,內核會挑選一個默認值,優先級根據進程nice值選定;1表示實時,對磁盤的最高級別訪問,若是誤用會致使其餘進程餓死;2表示盡力,默認調度級別,包括優先級 0~7,0爲最高級;3表示空閒,在一段磁盤空閒的期限事後才容許進行I/O。以下:
ionice -c 3 -p 65552
cgroup
經過cgroup爲進程或進程組提供存儲設備資源控制機制。通常不多用到,不用考慮。
可調參數
/sys/block/sda/queue/scheduler:選擇I/O調度器策略,是空操做、最後期限、an仍是cfq;
Linux上的hdparm(磁盤測試工具)工具能夠設置多種磁盤設備的可調參數。