使用 dd 檢查儲存效能
本文包含一些示例命令,向你展示如何使用 dd
命令粗略估計硬碟驅動器和 RAID 陣列的效能。準確的測量必須考慮諸如寫入放大和系統呼叫開銷之類的事情,本指南不會考慮這些。對於可能提供更準確結果的工具,你可能需要考慮使用 hdparm。
為了分解與檔案系統相關的效能問題,這些示例顯示瞭如何通過直接讀取和寫入塊裝置來在塊級測試驅動器和陣列的效能。警告:寫入測試將會銷燬用來執行測試的塊裝置上的所有資料。不要對包含你想要保留的資料的任何裝置執行這些測試!
四個測試
下面是四個示例 dd
命令,可用於測試塊裝置的效能:
1、 從 $MY_DISK
讀取的一個程式:
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
2、寫入到 $MY_DISK
的一個程式:
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
3、從 $MY_DISK
併發讀取的兩個程式:
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
4、 併發寫入到 $MY_DISK
的兩個程式:
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
- 執行讀寫測試時,相應的
iflag=nocache
和oflag=direct
引數非常重要,因為沒有它們,dd
命令有時會顯示從記憶體中傳輸資料的結果速度,而不是從硬碟。 bs
和count
引數的值有些隨意,我選擇的值應足夠大,以便在大多數情況下為當前硬體提供合適的平均值。null
和zero
裝置在讀寫測試中分別用於目標和源,因為它們足夠快,不會成為效能測試中的限制因素。- 併發讀寫測試中第二個
dd
命令的skip=200
引數是為了確保dd
的兩個副本在硬碟驅動器的不同區域上執行。
16 個示例
下面是演示,顯示針對以下四個塊裝置中之一執行上述四個測試中的各個結果:
MY_DISK=/dev/sda2
(用在示例 1-X 中)MY_DISK=/dev/sdb2
(用在示例 2-X 中)MY_DISK=/dev/md/stripped
(用在示例 3-X 中)MY_DISK=/dev/md/mirrored
(用在示例 4-X 中)
首先將計算機置於救援模式,以減少後臺服務的磁碟 I/O 隨機影響測試結果的可能性。警告:這將關閉所有非必要的程式和服務。在執行這些命令之前,請務必儲存你的工作。你需要知道 root
密碼才能進入救援模式。passwd
命令以 root
使用者身份執行時,將提示你(重新)設定 root
帳戶密碼。
$ sudo -i
# passwd
# setenforce 0
# systemctl rescue
你可能還想暫時禁止將日誌記錄到磁碟:
# sed -r -i.bak 's/^#?Storage=.*/Storage=none/' /etc/systemd/journald.conf
# systemctl restart systemd-journald.service
如果你有交換裝置,可以暫時禁用它並用於執行後面的測試:
# swapoff -a
# MY_DEVS=$(mdadm --detail /dev/md/swap | grep active | grep -o "/dev/sd.*")
# mdadm --stop /dev/md/swap
# mdadm --zero-superblock $MY_DEVS
示例 1-1 (從 sda 讀取)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.7003 s, 123 MB/s
示例 1-2 (寫入到 sda)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67117 s, 125 MB/s
示例 1-3 (從 sda 併發讀取)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.42875 s, 61.2 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.52614 s, 59.5 MB/s
示例 1-4 (併發寫入到 sda)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.2435 s, 64.7 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.60872 s, 58.1 MB/s
示例 2-1 (從 sdb 讀取)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67285 s, 125 MB/s
示例 2-2 (寫入到 sdb)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67198 s, 125 MB/s
示例 2-3 (從 sdb 併發讀取)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.52808 s, 59.4 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.57736 s, 58.6 MB/s
示例 2-4 (併發寫入到 sdb)
# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.7841 s, 55.4 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.81475 s, 55.0 MB/s
示例 3-1 (從 RAID0 讀取)
# mdadm --create /dev/md/stripped --homehost=any --metadata=1.0 --level=0 --raid-devices=2 $MY_DEVS
# MY_DISK=/dev/md/stripped
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.837419 s, 250 MB/s
示例 3-2 (寫入到 RAID0)
# MY_DISK=/dev/md/stripped
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.823648 s, 255 MB/s
示例 3-3 (從 RAID0 併發讀取)
# MY_DISK=/dev/md/stripped
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.31025 s, 160 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.80016 s, 116 MB/s
示例 3-4 (併發寫入到 RAID0)
# MY_DISK=/dev/md/stripped
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.65026 s, 127 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.81323 s, 116 MB/s
示例 4-1 (從 RAID1 讀取)
# mdadm --stop /dev/md/stripped
# mdadm --create /dev/md/mirrored --homehost=any --metadata=1.0 --level=1 --raid-devices=2 --assume-clean $MY_DEVS
# MY_DISK=/dev/md/mirrored
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.74963 s, 120 MB/s
示例 4-2 (寫入到 RAID1)
# MY_DISK=/dev/md/mirrored
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.74625 s, 120 MB/s
示例 4-3 (從 RAID1 併發讀取)
# MY_DISK=/dev/md/mirrored
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67171 s, 125 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67685 s, 125 MB/s
示例 4-4 (併發寫入到 RAID1)
# MY_DISK=/dev/md/mirrored
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 4.09666 s, 51.2 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 4.1067 s, 51.1 MB/s
恢復交換裝置和日誌配置
# mdadm --stop /dev/md/stripped /dev/md/mirrored
# mdadm --create /dev/md/swap --homehost=any --metadata=1.0 --level=1 --raid-devices=2 $MY_DEVS
# mkswap /dev/md/swap
# swapon -a
# mv /etc/systemd/journald.conf.bak /etc/systemd/journald.conf
# systemctl restart systemd-journald.service
# reboot
結果解讀
示例 1-1、1-2、2-1 和 2-2 表明我的每個驅動器以大約 125 MB/s 的速度讀寫。
示例 1-3、1-4、2-3 和 2-4 表明,當在同一驅動器上並行完成兩次讀取或寫入時,每個程式的驅動器頻寬大約為一半(60 MB/s)。
3-X 示例顯示了將兩個驅動器放在 RAID0(資料條帶化)陣列中的效能優勢。在所有情況下,這些數字表明 RAID0 陣列的執行速度是任何一個驅動器能夠獨立提供的速度的兩倍。相應的是,丟失所有內容的可能性也是兩倍,因為每個驅動器只包含一半的資料。一個三個驅動器陣列的執行速度是單個驅動器的三倍(所有驅動器規格都相同),但遭受災難性故障的可能也是三倍。
4-X 示例顯示 RAID1(資料映象)陣列的效能類似於單個磁碟的效能,除了多個程式同時讀取的情況(示例4-3)。在多個程式讀取的情況下,RAID1 陣列的效能類似於 RAID0 陣列的效能。這意味著你將看到 RAID1 的效能優勢,但僅限於程式同時讀取時。例如,當你在前臺使用 Web 瀏覽器或電子郵件客戶端時,程式會嘗試訪問後臺中的大量檔案。RAID1 的主要好處是,如果驅動器出現故障,你的資料不太可能丟失。
故障排除
如果上述測試未按預期執行,則可能是驅動器壞了或出現故障。大多數現代硬碟都內建了自我監控、分析和報告技術(SMART)。如果你的驅動器支援它,smartctl
命令可用於查詢你的硬碟驅動器的內部統計資訊:
# smartctl --health /dev/sda
# smartctl --log=error /dev/sda
# smartctl -x /dev/sda
另一種可以調整 PC 以獲得更好效能的方法是更改 I/O 排程程式。Linux 系統支援多個 I/O 排程程式,Fedora 系統的當前預設值是 deadline 排程程式的 multiqueue 變體。預設情況下它的整體效能非常好,並且對於具有許多處理器和大型磁碟陣列的大型伺服器,其擴充套件性極為出色。但是,有一些更專業的排程程式在某些條件下可能表現更好。
要檢視驅動器正在使用的 I/O 排程程式,請執行以下命令:
$ for i in /sys/block/sd?/queue/scheduler; do echo "$i: $(<$i)"; done
你可以通過將所需排程程式的名稱寫入 /sys/block/<device name>/queue/scheduler
檔案來更改驅動器的排程程式:
# echo bfq > /sys/block/sda/queue/scheduler
你可以通過為驅動器建立 udev 規則來永久更改它。以下示例顯示瞭如何建立將所有的旋轉式驅動器設定為使用 BFQ I/O 排程程式的 udev 規則:
# cat << END > /etc/udev/rules.d/60-ioscheduler-rotational.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
END
這是另一個設定所有的固態驅動器使用 NOOP I/O 排程程式的示例:
# cat << END > /etc/udev/rules.d/60-ioscheduler-solid-state.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
END
更改 I/O 排程程式不會影響裝置的原始吞吐量,但通過優先考慮後臺任務的頻寬或消除不必要的塊重新排序,可能會使你的 PC 看起來響應更快。
via: https://fedoramagazine.org/check-storage-performance-with-dd/
作者:Gregory Bartholomew 選題:lujun9972 譯者:wxy 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- Linux 下使用 dd 命令進行硬碟 I/O 效能檢測Linux硬碟
- Netapp儲存日常檢查及資訊收集APP
- 物件儲存服務的完整性檢查物件
- 使用外部表儲存巡檢日誌
- 資料的儲存和查詢分離不利查詢效能 - thenewstack
- JPA 實體髒檢查與儲存同步(Dirty & Flush)
- Mongo效能檢查Go
- SQLServer查詢使用者儲存過程SQLServer儲存過程
- 常用查詢Oracle的表,檢視,儲存過程,使用者等SQL命令Oracle儲存過程SQL
- 使用dbms_profiler測試儲存過程效能儲存過程
- 使用零複製技術提高儲存系統效能
- 如何使用Amazon S3儲存和檢索資料S3
- 儲存過程中查詢資料字典檢視(v$或dba)儲存過程
- 檢查 os 效能(linux)Linux
- 【TUNE_ORACLE】Oracle檢查點(二)檢查點效能Oracle
- dd工具使用
- 【PDB】Oracle資料庫如何檢查和設定pdb最大儲存大小Oracle資料庫
- Postmark測試後端儲存效能後端
- 【效能優化】增量檢查點優化
- 阿里雲物件儲存服務,OSS使用經驗總結,圖片儲存,分頁查詢阿里物件
- oralce 壓縮表與heap表儲存空間與查詢效能比較
- 本地儲存localStorage使用
- 使用儲存過程儲存過程
- 儲存過程模糊查詢(like)儲存過程
- 基礎——使用檢視和儲存過程的優缺點儲存過程
- Memcache 記憶體分配策略和效能(使用)狀態檢查記憶體
- MySQL儲存過程使用if子查詢判斷需要注意MySql儲存過程
- MySQL null值儲存,null效能影響MySqlNull
- 《MySQL 效能優化》之 InnoDB 儲存引擎MySql優化儲存引擎
- Greenplum 效能優化之路 --(二)儲存格式優化
- SAN儲存交換機效能之fill word
- MySQL 高效能儲存引擎:TokuDB初探MySql儲存引擎
- 高效能Sqlite儲存模型物件解密SQLite模型物件解密
- [原創]儲存過程效能測試儲存過程
- SQL Server2008儲存結構之物件儲存檢視SQLServer物件
- MySQL--儲存過程與檢視MySql儲存過程
- 怎麼檢視mysql的儲存引擎MySql儲存引擎
- mybatis呼叫檢視和儲存過程MyBatis儲存過程