我們聘請了一位顧問來幫助我們增加 MySQL 叢集的容量,他做的第一件事(幾乎是唯一一件事)就是測量我們伺服器的磁碟 I/O 速度。
我感興趣的是類似系統上的磁碟 I/O 與我們現有的系統的比較:
- 我們的 MySQL 伺服器是在具有 SCSI SAN (Raid 5) 的 32 位元 VMWare ESX 3.5 上運行的虛擬伺服器,虛擬伺服器本身運行 Debian Etch 和 MySQL 版本 5.0.32
在 MySQL 機器上執行以下命令會給我這些結果(顧問將其描述為「非常慢」:
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 71.3347 seconds, 14.7 MB/s
real 1m13.596s
user 0m0.052s
sys 0m56.932s
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 21.8202 seconds, 48.1 MB/s
real 0m21.902s
user 0m0.012s
sys 0m7.948s
這些結果真的「非常慢」嗎?
我有興趣比較其他人在他們的專用 MySQL 機器上從這兩個命令獲得的結果 - 特別是如果它是 32 位元虛擬機器。
答案1
需要注意的是,您的 dd 命令不會繞過作業系統的檔案系統快取。這意味著您將獲得不同的結果,具體取決於其他情況,並且當您增加輸出大小(從而耗盡 fs 快取)時,您會注意到顯著的效能變化
新增“oflag=direct”以繞過輸出檔案上的檔案系統緩存,例如
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000 oflag=direct
您可以使用 iflag=direct 繞過檔案系統快取進行讀取
此外,您的效能會因區塊大小而有很大差異。雖然 1M 對於測試順序寫入來說是一個相當好的權衡,但除非您的應用程式寫出 1M 區塊,否則它不能代表您的實際效能。
一般來說,這些吞吐量資料非常糟糕 - 單一SATA磁碟機(例如Seagate ES.2磁碟機)在磁碟機開始時的順序寫入峰值可達105MB/秒,並且在整個過程中將維持約60MB/秒。驅動器。
最後,一般資料庫「最佳實務」建議避免將RAID5/6 作為資料庫的底層系統,因為奇偶校驗寫入會導致相對較高的開銷(不是實際的奇偶校驗計算本身,其硬體相當便宜,但效果寫出新奇偶校驗時必須進行額外的讀取和寫入)。
答案2
這是我的 mysql 伺服器的結果。它是64位元的,不是虛擬機,所以不確定它到底有多大用處,但有一個非常大的差別。
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 5.72139 s, 183 MB/s
0.00s user 1.55s system 27% cpu 5.725 total
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.432328 s, 2.4 GB/s
0.00s user 0.45s system 103% cpu 0.436 total
答案3
在大多數情況下,您還應該比較隨機 io [ 例如與邦妮++] 不僅僅是線性讀/寫。或者也許它是一個大數據接收器,它獲取日誌並將其儲存在未索引的大表中?
dd '基準' 的結果
szcapp1:/mnt/big/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.26186 s, 246 MB/s
real 0m4.563s
user 0m0.001s
sys 0m2.255s
szcapp1:/mnt/big/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.457162 s, 2.3 GB/s
real 0m0.459s
user 0m0.000s
sys 0m0.459s
szcapp1:/mnt/big/tmp#
Dell poweredge 2950 上的 64 位元 Linux,5 個桌面 500GB sata 磁碟上的 perc6 raid 10。 16GB 內存,2 個四核心 2.66GHz。但是嘿!這是沒有意義的 - 該資料適合 raid 控制器的高速緩存記憶體中的 1/4,其餘的 - 位於系統記憶體中。
你的結果確實很慢。上面的 linux 上運行的虛擬機器的結果 [ vmware server 2.0 下的 32 位元 linux guest ]:
vfeed0:/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 15.996 s, 65.6 MB/s
real 0m16.043s
user 0m0.016s
sys 0m13.117s
vfeed0:/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.49413 s, 2.1 GB/s
real 0m0.505s
user 0m0.000s
sys 0m0.500s
vfeed0:/tmp#
請記住,讀取效能是假的 - 它是從快取中讀取的 - 如果不是從 guest 的快取中讀取,那麼肯定是從 vmware 主機的快取中讀取。
答案4
有點偏離你原來的問題;但 SAN 供應商對「RAID 5 速度慢」的反應是轉換為 RAID 1 或 RAID 10。PDF)可能會嚴重影響性能。