1. 程式人生 > >Linux效能優化之磁碟優化(三)

Linux效能優化之磁碟優化(三)

前言

關於本章內容,設計的東西比較多。這裡會有關於檔案系統、磁碟、CPU等方面的知識,以及涉及到關於這方面的效能排查等。

術語

檔案系統通過快取和緩衝以及非同步I/O等手段來緩和磁碟的延時對應用程式的影響。為了更詳細的瞭解檔案系統,以下就簡單介紹一些相關術語:

  • 檔案系統:一種把資料組織成檔案和目錄的儲存方式,提供了基於檔案的存取介面,並通過檔案許可權控制訪問。另外,一些表示裝置、套接字和管道的特殊檔案型別,以及包含檔案訪問時間戳的元資料。
  • 檔案系統快取:主存(通常是DRAM) 的一塊區域,用來快取檔案系統的內容,可能包含各種資料和元資料。
  • 操作:檔案系統的操作是對檔案系統的請求,包括讀、寫、開啟、關閉、建立以及其他操作。
  • I/O:輸入/輸出。檔案系統I/O有多種定義,這裡僅指直接讀寫(執行I/O)的操作,包括讀、寫、狀態統計、建立。I/O不包括開啟檔案和關閉檔案。
  • 邏輯I/O:由應用程式發給檔案系統的I/O。
  • 物理I/O:由檔案系統直接發給磁碟的I/O。
  • 吞吐量:當前應用程式和檔案系統之間的資料傳輸率,單位是B/S。
  • inode:一個索引節點時一種含有檔案系統物件元資料的資料結構,其中有訪問許可權、時間戳以及資料指標。
  • VFS:虛擬檔案系統,一個為了抽象與支援不同檔案系統型別的核心介面。

磁碟相關術語:

  • 儲存裝置的模擬。在系統看來,這是一塊物理磁碟,但是,它可能由多塊磁碟組成。
  • 傳輸匯流排:用來通訊的物理匯流排,包括資料傳輸以及其他磁碟命令。
  • 扇區:磁碟上的一個儲存塊,通常是512B的大小。
  • I/O:對於磁碟,嚴格地說僅僅指讀、寫,而不包括其他磁碟命令。I/O至少由方向(讀或寫)、磁碟地址(位置)和大小(位元組數)組成。
  • 磁碟命令:除了讀寫之外,磁碟還會被指派執行其他非資料傳輸的命令(例如快取寫回)。
  • 頻寬:儲存傳輸或者控制器能夠達到的最大資料傳輸速率。
  • I/O延時:一個I/O操作的執行時間,這個詞在作業系統領域廣泛使用,早已超出了裝置層。

相關概念

  檔案系統延時
       檔案系統延時是檔案系統性能一項主要的指標,指的是一個檔案系統邏輯請求從開始到結束的時間。它包括消耗在檔案系統、核心磁碟I/O子系統以及等待磁碟裝置——物理I/O的時間。應用程式的執行緒通常在請求時阻塞,等地檔案系統請求的結束。這種情況下,檔案系統的延時與應用程式的效能直接和成正比關係。在某些情況下,應用程式並不受檔案系統的直接影響,例如非阻塞I/O或者I/O由一個非同步執行緒發起。

  快取

       檔案系統啟動之後會使用主存(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數量等,每個磁碟裝置都佔一行。

[[email protected] ~]# 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

引數說明

  • tps: 每秒事物數(IOPS)。
  • kB_read/s、kB_wrtn/s: 每秒讀取KB數和每秒寫入KB數。
  • kB_read、kB_wrtn: 總共讀取和寫入的KB數。

如下想輸出更詳細的內容,可以試試下面這個命令組合:

[[email protected] ~]# 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

引數說明

  • rrqm/s:每秒合併放入驅動請求佇列的讀請求數(當系統呼叫需要讀取資料的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的資料,FS會將這個請求合併Merge)。
  • wrqm/s:每秒合併放入驅動請求佇列的寫請求數。
  • rsec/s:每秒發給磁碟裝置的讀請求數。
  • wsec/:每秒發給磁碟裝置的寫請求數。
  • rKB/s:每秒從磁碟裝置讀取的KB數。
  • wKB/s:每秒向磁碟裝置寫入的KB數。
  • avgrq-sz 平均每次請求大小,單位為扇區(512B)。
  • avgqu-sz 在驅動請求佇列和在裝置中活躍的平均請求數。
  • await: 平均I/O響應時間,包括在驅動請求佇列裡等待和裝置的I/O響應時間(ms)。一般地系統I/O響應時間應該低於5ms,如果大於10ms就比較大了。這個時間包括了佇列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明佇列時間越短,反之差值越大,佇列時間越長,說明系統出了問題。
  • svctm:磁碟裝置的I/O平均響應時間(ms)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁碟效能很好,如果await的值遠高於svctm的值,則表示I/O佇列等待太長系統上執行的應用程式將變慢。
  • %util: 裝置忙處理I/O請求的百分比(使用率)。在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度。一般地,如果該引數是100%表示裝置已經接近滿負荷運行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。

      既然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):

[[email protected] ~]# 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(磁碟測試工具)工具可以設定多種磁碟裝置的可調引數。

  • 磁碟控制器可調引數

相關推薦

linux程序管理程序建立

在linux系統中,許多程序在誕生之初都與其父程序共同用一個儲存空間。但是子程序又可以建立自己的儲存空間,並與父程序“分道揚鑣”,成為與父程序一樣真正意義上的程序。  linux系統執行的第一個程序是在初始化階段“捏造出來的”。而此後的執行緒或程序都是由一個已存在的程序像細胞分裂一樣通過系統呼叫複

linux學習筆記shell程式設計流程控制3---for迴圈

for迴圈 語法格式1:指定迴圈範圍 for 變數 in value1 value2... do something done 指令碼例項1 #!/bin/bash for i in 1 2

linux學習筆記shell程式設計流程控制4while迴圈和until迴圈

while迴圈和until迴圈 ###、 while迴圈 不定迴圈,程式碼格式: while [判斷] do something done 指令碼例項1: #!/bin/bash #從1加到

linux系統程式設計基礎必備:檔案描述符file descriptor與inode的相關知識

       每個程序在Linux核心中都有一個task_struct結構體來維護程序相關的 資訊,稱為程序描述符(Process Descriptor),而在作業系統理論中稱為程序控制塊 (PCB,Process Control Block)。task_struct中有一

Linux效能優化磁碟優化

前言 關於本章內容,設計的東西比較多。這裡會有關於檔案系統、磁碟、CPU等方面的知識,以及涉及到關於這方面的效能排查等。 術語 檔案系統通過快取和緩衝以及非同步I/O等手段來緩和磁碟的延時對應用程式的影響。為了更詳細的瞭解檔案系統,以下就簡單介紹一些相關術語: 檔案系統:一種把資料組織成檔案和目錄的儲存方式

MySQL效能管理及架構設計:SQL查詢優化、分庫分表 - 完結篇

一、SQL查詢優化(重要) 1.1 獲取有效能問題SQL的三種方式 通過使用者反饋獲取存在效能問題的SQL; 通過慢查日誌獲取存在效能問題的SQL; 實時獲取存在效能問題的SQL; 1.1.2 慢查日誌分析工具 相關配置引數: slow

linux基本服務系列智慧DNS

前言 上一期講了利用bind+mysql的結合,打造一個數據庫管理的一個DNS系統,從而能減少運維的維護量;這期再講講增加dns遠端管理的功能和外部解析能力,可以進一步舒服的維護DNS系統。 rndc遠端控制服務 1、在被管理的伺服器上生成金鑰 # cd /var/named/chroo

Linux學習程序通訊

言之者無罪,聞之者足以戒。 ——《詩序》 二、訊號的接收 接收訊號的程序,需要的條件:要想使接收的程序能收到訊號,這個程序就不能結束 接收訊號的函式:sleep()、while(1)、pause() sleep()函式使程序進入睡眠狀態(S) pause()函式使程

.linux開發uboot移植——.基礎shell和Makefile回顧

一.補基礎之shell 1.shell程式執行的執行有多種方法,這裡介紹三種方法: 第一種:./xx.sh,和執行二進位制可執行程式方法一樣。這樣執行shell要求shell程式必須具有可執行許可權。chmod a+x xx.sh來新增可執行許可權。 第二

Android ListView優化區域性重新整理更新非notifyDataSetChanged

在Android開發中我們經常會用到listview的資料和介面重新整理動作,我們每次可能會用到的都是Adapter.notifyDataSetChanged()方法。這個方法的原理是利用觀察者模式對我們的資料來源進行監聽,當我們的資料來源發生變化

Linux效能及調優指南翻譯Linux程序管理

本文為IBM RedBook的Linux Performanceand Tuning Guidelines的1.1節的翻譯原文地址:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf原文作者:Eduardo Cili

Linux 檔案程式設計

Linux之檔案程式設計中軟連結和硬連結的用法和區別前言:在Linux中使用什麼來識別一個檔案呢?我們先在終端上輸入命令: ls -i 看看會有什麼資訊出現。[email protected]:~$ ls -i顯示的資訊1048577    bin        5

《資料庫索引設計優化》讀書筆記

分析: 如圖6.5所示,TABLE上欄位A有主鍵聚簇索引,欄位C有非聚簇索引。查詢謂詞中有欄位C的範圍條件,並且結果集按C排序。因為謂詞中只有欄位C有索引,所以在不新增新索引的前提下,不可能建立三星理想索引(不滿足第一顆星)。掃描現有的欄位C上的索引,可以消除排序,所以C上的索引本身滿足第二顆星。不增加額外的

MySQL優化索引原理

一,前言  ​ 上一篇內容說到了MySQL儲存引擎的相關內容,及資料型別的選擇優化。下面再來說說索引的內容,包括對B-Tree和B+Tree兩者的區別。 1.1,什麼是索引 ​ 索引是儲存引擎用於快速找到記錄的一種資料結構, 對效能的提升有很大的幫助,尤其當表中數量較大的情況下,索引正確的使用可以對效能提升幾

爬蟲庫BeautifulSoup學習

子節點 rom lac repr 文檔 strong 爬蟲 time contents 遍歷文檔樹:   1、查找子節點   .contents     tag的.content屬性可以將tag的子節點以列表的方式輸出。   print soup.body.cont

MVC系列博客排球計分模型類的實現

layers 自動生成 ext alt 感覺 名稱 數據 string 後來 最初我使用的是連接數據庫的方法來建立數據連接的,後來聽了同學用EF框架來生成數據庫自動連接,感覺很好用,然後我就重新用EF框架生成數據庫 使用EF框架生成數據庫,要有相應的模型類,模型類如下:

LINUX設備驅動程序筆記字符設備驅動程序

準備 p s con 文件系統 write post container form nod <一>.主設備號和次設備號 對字符設備的訪問時通過文件系統內的設備名稱進行的。那些設備名稱簡單稱之為文件系統樹的節點,它們通常位於/dev文

Solr基礎教程solrconfig.xml

配置文件 multi listener 了無 files content esc lte 存儲 前面介紹過schema.xml的一些配置信息,本章介紹solrconfig.xml的配置,以及怎樣安裝smartcn分詞器和IK分詞器,並介紹主要的查詢語法。

solr搜索solrJ語法

solr語法 solrj語法 1.1 solr語法一.基本查詢q 查詢的關鍵字,此參數最為重要,例如,q=id:1,默認為q=*:*,fl 指定返回哪些字段,用逗號或空格分隔,註意:字段區分大小寫,例如,fl= id,title,sortstart 返回結果的第幾條記錄開始,一般分頁用

小白學習Code First

數據庫 change chang chan inf 模型 code test nbsp 上下文Context類中的base構造器的幾個方法重置(1、無參 2、database name 3 、 連接字符串) 無參:如果基類base方法中無參,code first將會以 :{