Linux 使用軟體陣列做 RAID 1,之前都是硬碟直接掛掉,而這次是硬碟半殘,速度慢到炸掉,應該是快掛了,只是還沒掛,這種時候最麻煩...
所以把遇到的情況、檢測方式形容一下,以防下次再次遇到~
Linux Soft RAID1 硬碟半殘的偵測確認、移除、更換硬碟動作
一直都是正常的,但是突然間發現到編輯檔案的速度非常緩慢,但是其它操作又沒什麼感覺,大致如下:
- Vim 編輯檔案、貼上內容的速度慢到爆炸,砍檔案的速度極慢
- 不過平常 cd 切換,cat / less 速度沒有影響
- 主要是遇到有任何寫入行為,ex: apt install / remove.. 等等,都會爆慢
- 同台機器,到其它顆硬碟的區域,一樣 Vim 編輯、貼上,都很快速 (註:這個當下沒有測試,是在最後測試完速度,在其它硬碟做驗證,就很明顯知道問題點)
猜想是硬碟問題,先做點測試 (下述用 RAID 1:md0 是對照此兩顆硬碟 /dev/sda, /dev/sdb)
確認 RAID 1 兩顆硬碟的情況
- $ cat /proc/mdstat # 看起來都是正常,所以得要強制將有問題的硬碟下掉
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdb1[3] sda1[2] 1913930560 blocks super 1.2 [2/2] [UU] unused devices: <none>
硬碟檢測
- $ sudo smartctl -a /dev/sda | less
- $ sudo smartctl -a /dev/sdb | less
- $ sudo badblocks -v /dev/sda # 這個會跑很久,當最後備案
測試看看硬碟速度
- $ sudo hdparm -Tt /dev/sda # or hdparm -t /dev/sda
/dev/sda:
Timing cached reads: 22328 MB in 1.99 seconds = 11195.77 MB/sec
Timing buffered disk reads: 380 MB in 3.01 seconds = 126.45 MB/sec - $ sudo hdparm -Tt /dev/sdb
/dev/sdb:
Timing cached reads: 2 MB in 41.75 seconds = 49.05 kB/sec
Timing buffered disk reads: 2 MB in 6.81 seconds = 300.65 kB/sec
/dev/sdb:
Timing cached reads: 2 MB in 8.71 seconds = 235.18 kB/sec
Timing buffered disk reads: 2 MB in 24.67 seconds = 83.03 kB/sec - 註:另外遇到的情況,速度一樣快,但是出現下述訊息:
Timing cached reads: 20672 MB in 2.00 seconds = 10345.24 MB/sec
Timing buffered disk reads: read(2097152) returned 1196032 bytes
此時記得 dmesg 看看有沒有更明顯的硬體錯誤訊息
確認 /dev/sdb 不是眼花或者系統偶爾太忙,所以多跑一次,確認真的很慢 (sda 是 MB/sec,sdb 是 kB/sec)
到此幾乎已經確認是硬碟有問題
查看硬碟規格(準備採購硬碟)
- $ sudo smartctl -a /dev/sdb | grep 'SATA'
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s) - $ sudo hdparm -i /dev/sdb
- $ sudo hdparm -I /dev/sdb
- $ sudo hdparm /dev/sdb
從 RAID 1 移除硬碟
下述可以參考此篇:Debian Linux Software RAID 1 還原實作
- cat /proc/mdstat # 查看 RAID 狀態,看起來都是正常,所以得要強制將有問題的硬碟下掉
- mdadm /dev/md0 --fail /dev/sdb1 # 因為硬碟還沒實際掛掉,所以需要先跟他說掛了
註:做完這個動作,速度馬上就快起來 - mdadm /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0 - mdadm /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0 - wipefs -a /dev/sdb1 # 避免系統重新自動掛載
/dev/sdb1: 4 bytes were erased at offset 0x00001000 (linux_raid_member): fc 4e 2b a9 - dmesg 會看到下述訊息:
md/raid1:md0: Disk failure on sdb1, disabling device.
md/raid1:md0: Operation continuing on 1 devices.
RAID1 conf printout:
--- wd:1 rd:2
disk 0, wo:0, o:1, dev:sda1
disk 1, wo:1, o:0, dev:sdb1
RAID1 conf printout:
--- wd:1 rd:2
disk 0, wo:0, o:1, dev:sda1
md: unbind<sdb1>
md: export_rdev(sdb1) - vim /etc/fstab # 若有 swap 單獨磁區,要先註解掉
RAID 1 加入新硬碟
- 將 sda 磁區複製到 sdb
- sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb
- 註:若硬碟不同款,這樣子切完後,可以再 fdisk /dev/sdb 修改容量
- sudo fdisk -l /dev/sda
- sudo fdisk -l /dev/sdb # 檢查看看有沒有一樣
- sudo mdadm --add /dev/md0 /dev/sdb1 # 就會開始 sync 了
- cat /proc/mdstat # 可以看 sync 進度
- sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb
- 剩餘空間給 swap # 這個可以隨興使用,因為兩顆硬碟大小可能不一樣(Soft RAID1)
- sudo mkswap /dev/sdb2 # 建立 swap 空間
- sudo swapon /dev/sdb2
- ls -lh /dev/disk/by-uuid
- vim /etc/fstab # 修改原本損毀的磁區, 改成新的
- 註:通常軟體陣列,我會習慣在後面增加 swap 區域(依靠 swap 區域來做容量調節),避免硬碟大小不同時,會無法做 1:1 的 Raid 1。
相關網頁
- raid1 - Remove drive from soft RAID - Unix & Linux Stack Exchange
- mdadm /dev/md1 --fail /dev/sdc1
- mdadm /dev/md1 --remove /dev/sdc1
- wipefs -a /dev/sdc1
- High IOWait and Slow "Timing cached reads"
- How to check the health of a hard drive
- How to Check Bad Sectors or Bad Blocks on Hard Disk in Linux
- sudo badblocks -v /dev/sda10 > badsectors.txt
- linux - Identifying cause for really slow write speed on SSD during install
- Ext4 - Linux Kernel Newbies barrier 設定為 0 來加速
- mount -oremount,barrier=0 /
- /dev/sda / ext4 relatime,[...your current options...],barrier=0 0 1