Home | 簡體中文 | 繁體中文 | 雜文 | 打賞(Donations) | ITEYE 博客 | OSChina 博客 | Facebook | Linkedin | 知乎專欄 | Search | About

第 90 章 sar - System Activity Reporter

		
sar 是 System Activity Reporter(系統活動情況報告)的縮寫。

sar工具將對系統當前的狀態進行取樣,然後通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣數據;取樣數據和分析的結果都可以存入檔案,所需的負載很小。sar是目前Linux上最為全面的系統性能分析工具之一,可以從14個大方面對系統的活動進行報告,包括檔案的讀寫情況、系統調用的使用情況、串口、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,使用也是較為複雜。

sar命令常用格式
sar [options] [-A] [-o file] t [n]

其中:
    t為採樣間隔,n為採樣次數,預設值是1;

    -o file表示將命令結果以二進制格式存放在檔案中,file 是檔案名。

options 為命令行選項,sar命令常用選項如下:

    -A:所有報告的總和

    -u:輸出CPU使用情況的統計信息

    -v:輸出inode、檔案和其他內核表的統計信息

    -d:輸出每一個塊設備的活動信息

    -r:輸出內存和交換空間的統計信息

    -b:顯示I/O和傳送速率的統計信息

    -a:檔案讀寫情況

    -c:輸出進程統計信息,每秒創建的進程數

    -R:輸出內存頁面的統計信息

    -y:終端設備活動情況

    -w:輸出系統交換活動信息

> Report CPU utilization


[root@netkiller ~]# sar -u 1 3
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時05分29秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
15時05分30秒     all      0.00      0.00      0.00      0.00      0.00    100.00
15時05分31秒     all      0.00      0.00      0.50      0.00      0.00     99.50
15時05分32秒     all      0.50      0.00      0.00      0.50      0.00     99.00
平均時間:     all      0.17      0.00      0.17      0.17      0.00     99.50

%user:  顯示在用戶級別(application)運行使用 CPU 總時間的百分比.
%nice:  顯示在用戶級別,用於nice操作,所占用CPU總時間的百分比.
%system:在核心級別(kernel)運行所使用 CPU 總時間的百分比.
%iowait:顯示用於等待I/O操作占用CPU總時間的百分比.
%steal: 管理程序(hypervisor)為另一個虛擬進程提供服務而等待虛擬CPU的百分比.
%idle:  顯示CPU空閒時間占用CPU總時間的百分比.

> Report status of inode, file and other kernel tables


[root@netkiller ~]# sar -v  1 3
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時07分57秒 dentunusd   file-nr  inode-nr    pty-nr
15時07分58秒     47524       640     46025         2
15時07分59秒     47524       640     46025         2
15時08分00秒     47524       640     46025         2
平均時間:     47524       640     46025         2

dentunusd: 目錄緩存中未使用的緩存條目數
file-nr:   由系統使用的檔案數
inode-nr: 由系統使用的inode數 
pty-nr:   系統所使用的偽終端數

> 查看平均負載


sar -q: 查看平均負載

指定-q後,就能查看運行隊列中的進程數、系統上的進程大小、平均負載等;與其它命令相比,它能查看各項指標隨時間變化的情況;

[root@netkiller ~]# sar -q 1 3
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時24分06秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
15時24分07秒         0       204      0.00      0.01      0.05
15時24分08秒         1       204      0.00      0.01      0.05
15時24分09秒         0       204      0.00      0.01      0.05
平均時間:         0       204      0.00      0.01      0.05

runq-sz: 運行隊列的長度(等待運行的進程數)
plist-sz:進程列表中進程(processes)和綫程(threads)的數量
ldavg-1: 最後1分鐘的系統平均負載 
ldavg-5: 過去5分鐘的系統平均負載
ldavg-15:過去15分鐘的系統平均負載

> Report memory statistics


[root@kvm ~]# sar -R 1 5
Linux 2.6.32-358.11.1.el6.x86_64 (kvm)  11/04/2013      _x86_64_        (24 CPU)

04:12:49 PM   frmpg/s   bufpg/s   campg/s
04:12:50 PM   -174.00      0.00      0.00
04:12:51 PM    -27.08      0.00      0.00
04:12:52 PM    -73.27      0.00      0.00
04:12:53 PM   -498.00      0.00      0.00
04:12:54 PM    322.00      0.00      0.00
Average:       -90.54      0.00      0.00

frmpg/s :每秒鐘系統釋放的內存頁數. 如果是負值,表示每秒鐘被系統分配的內存頁數.
bufpg/s :每秒鐘系統分配多少內存頁作為buffer使用. 如果是負值,表示系統在回收一定的buffer空間.
campg/s :每秒鐘系統分配多少內存頁作為bcached使用. 如果是負值,表示系統在回收一定的cached空間.

> 查看頁面交換髮生狀況


[root@kvm ~]# sar -W
Linux 2.6.32-358.11.1.el6.x86_64 (kvm)  11/04/2013      _x86_64_        (24 CPU)

12:00:01 AM  pswpin/s pswpout/s
12:10:01 AM      0.00      0.00
12:20:01 AM      0.00      0.00
12:30:01 AM      0.00      0.00
12:40:01 AM      0.00      0.00
12:50:01 AM      0.00      0.00

pswpin/s
    Total number of swap pages the system brought in per second.

pswpout/s
    Total number of swap pages the system brought out per second.

> Report task creation and system switching activity


[root@kvm ~]# sar -w 1 5
Linux 2.6.32-358.11.1.el6.x86_64 (kvm) 	11/05/2013 	_x86_64_	(24 CPU)

03:09:01 PM    proc/s   cswch/s
03:09:02 PM      1.00  21017.00
03:09:03 PM      1.02  18507.14
03:09:04 PM      1.00  20803.00
03:09:05 PM      0.99  17787.13
03:09:06 PM      1.04  22041.67
Average:         1.01  20016.57

proc/s: 每秒創建的任務的總數.
cswch/s:每秒上下文切換的總數.

> Report I/O and transfer rate statistics.


[root@kvm ~]# sar -b 1 5
Linux 2.6.32-358.11.1.el6.x86_64 (kvm) 	11/05/2013 	_x86_64_	(24 CPU)

03:20:15 PM       tps      rtps      wtps   bread/s   bwrtn/s
03:20:16 PM     18.00      0.00     18.00      0.00    383.00
03:20:17 PM      5.05      0.00      5.05      0.00     72.73
03:20:18 PM      0.00      0.00      0.00      0.00      0.00
03:20:19 PM      0.00      0.00      0.00      0.00      0.00
03:20:20 PM      0.00      0.00      0.00      0.00      0.00
Average:         4.60      0.00      4.60      0.00     91.00

tps:    每秒鐘向物理設備發出請求(讀與寫)的總數
rtps:    每秒鐘向物理設備發出讀請求的總數
wtps:    每秒鐘向物理設備發出寫請求的總數
bread/s: 每秒從塊設備中讀取的數據總數
bwrtn/s: 每秒向塊設備中寫入的數據總數

> Report paging statistics


[root@kvm ~]# sar -B 1 5
Linux 2.6.32-358.11.1.el6.x86_64 (kvm) 	11/05/2013 	_x86_64_	(24 CPU)

03:36:32 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
03:36:33 PM    192.00    384.00   1125.00      0.00   1709.00      0.00      0.00      0.00      0.00
03:36:34 PM      0.00     16.16    240.40      0.00    935.35      0.00      0.00      0.00      0.00
03:36:35 PM      0.00      1.01    273.74      0.00   1009.09      0.00      0.00      0.00      0.00
03:36:36 PM      0.00    396.04   1052.48      0.00    878.22      0.00      0.00      0.00      0.00
03:36:37 PM      0.00      0.00    228.00      0.00    997.00      0.00      0.00      0.00      0.00
Average:        38.48    160.52    586.17      0.00   1105.81      0.00      0.00      0.00      0.00

pgpgin/s:  每秒從磁碟或SWAP置換到內存的位元組數
pgpgout/s: 每秒從內存置換到磁碟或SWAP的位元組數
fault/s:   每秒鐘系統產生的缺頁數,即主缺頁與次缺頁之和(major + minor)
majflt/s: 每秒鐘產生的主缺頁數
pgfree/s:  每秒被放入空閒隊列中的頁個數
pgscank/s: 每秒被kswapd掃瞄的頁個數
pgscand/s: 每秒直接被掃瞄的頁個數
pgsteal/s: 每秒鐘從cache中被回收來滿足內存需要的頁個數
%vmeff:    每秒回收的頁(pgsteal)占總掃瞄頁(pgscank+pgscand)的百分比

缺頁異常:
	major(內存中沒有需要的數據)
	minor (內存中有這樣的數據,單最先不是該進程的)

> Report network statistics


sar命令使用-n選項可以彙報網絡相關信息,可用的參數包括:DEV、EDEV、SOCK和FULL。

1) 如果你使用DEV關鍵字,那麼sar將彙報和網絡設備相關的信息,如lo,eth0或eth1等

[root@netkiller ~]# sar -n DEV 1 1
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時30分12秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
15時30分13秒       br0      3.03      1.01      0.14      0.16      0.00      0.00      0.00
15時30分13秒      eth0      3.03      1.01      0.18      0.16      0.00      0.00      0.00
15時30分13秒        lo      2.02      2.02      0.09      0.09      0.00      0.00      0.00
15時30分13秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

平均時間:     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
平均時間:       br0      3.03      1.01      0.14      0.16      0.00      0.00      0.00
平均時間:      eth0      3.03      1.01      0.18      0.16      0.00      0.00      0.00
平均時間:        lo      2.02      2.02      0.09      0.09      0.00      0.00      0.00
平均時間:   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

IFACE:就是網絡設備的名稱;

rxpck/s:每秒鐘接收到的包數目

txpck/s:每秒鐘發送出去的包數目

rxbyt/s:每秒鐘接收到的位元組數

txbyt/s:每秒鐘發送出去的位元組數

rxcmp/s:每秒鐘接收到的壓縮包數目

txcmp/s:每秒鐘發送出去的壓縮包數目

txmcst/s:每秒鐘接收到的多播包的包數目

2) 如果你使用EDEV關鍵字,那麼會針對網絡設備彙報其失敗情況,例如:
[root@netkiller ~]# sar -n EDEV 1  1
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時31分29秒     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
15時31分30秒       br0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
15時31分30秒      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
15時31分30秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
15時31分30秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

平均時間:     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
平均時間:       br0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

rxerr/s:每秒鐘接收到的損壞的包的數目

txerr/s:當發送包時,每秒鐘發生的錯誤數

coll/s: 當發送包時,每秒鐘發生的衝撞(collisions)數(這個是在半雙工模式下才有)

rxdrop/s:由於緩衝區滿,網絡設備接收端,每秒鐘丟掉的網絡包的數目

txdrop/s:由於緩衝區滿,網絡設備發送端,每秒鐘丟掉的網絡包的數目

txcarr/s:當發送數據包時,每秒鐘載波錯誤發生的次數

rxfram/s:在接收數據包時,每秒鐘發生的幀對齊錯誤的次數

rxfifo/s:在接收數據包時,每秒鐘緩衝區溢出錯誤發生的次數

txfifo/s:在發送數據包時,每秒鐘緩衝區溢出錯誤發生的次數


3) 如果你使用SOCK關鍵字,則會針對socket連接進行彙報,例如:
[root@netkiller ~]# sar -n SOCK 1  1
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月08日 	_x86_64_	(2 CPU)

15時33分29秒    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
15時33分30秒        86        47         0         0         0        67
平均時間:        86        47         0         0         0        67

totsck:被使用的socket的總數目

tcpsck:當前正在被使用於TCP的socket數目

udpsck:當前正在被使用於UDP的socket數目

rawsck:當前正在被使用於RAW的socket數目

ip-frag:當前的IP分片的數目

## iostat


通過iostat方便查看CPU、網卡、tty設備、磁碟、CD-ROM 等等設備的活動情況, 負載信息。

命令格式
iostat[參數][時間][次數]

-C 顯示CPU使用情況
-d 顯示磁碟使用情況
-k 以 KB 為單位顯示
-m 以 M 為單位顯示
-N 顯示磁碟陣列(LVM) 信息
-n 顯示NFS 使用情況
-p[磁碟] 顯示磁碟和分區的情況
-t 顯示終端和CPU的信息
-x 顯示詳細信息
-V 顯示版本信息



[root@netkiller ~]# iostat  -k
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月07日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.14    0.00    0.23    0.39    0.00   99.25

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               8.65        28.46        95.63   54368942  182705652
dm-0              0.01         0.01         0.19      21684     366024

[root@netkiller ~]# iostat -x
Linux 3.10.5-3.el6.x86_64 (test23) 	2017年03月07日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.14    0.00    0.23    0.39    0.00   99.25

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     3.31    0.49    8.16    56.95   191.26    28.70     0.03    3.95    1.85    4.07   0.95   0.82
dm-0              0.00     0.00    0.00    0.01     0.02     0.38    40.84     0.00   24.60    8.99   25.69   0.77   0.00

>cpu屬性值說明


%user:  CPU處在用戶模式下的時間百分比
%nice:  CPU處在帶NICE值的用戶模式下的時間百分比
%system:CPU處在系統模式下的時間百分比
%iowait:CPU等待輸入輸出完成時間的百分比
%steal: 管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比
%idle:  CPU空閒時間百分比

> disk屬性值說明


rrqm/s:     每秒進行 merge 的讀操作數目.即 delta(rmerge)/s
wrqm/s:     每秒進行 merge 的寫操作數目.即 delta(wmerge)/s
r/s:        每秒完成的讀 I/O 設備次數.即 delta(rio)/s
w/s:        每秒完成的寫 I/O 設備次數.即 delta(wio)/s
rsec/s:     每秒讀扇區數.即 delta(rsect)/s
wsec/s:     每秒寫扇區數.即 delta(wsect)/s
rkB/s:      每秒讀K位元組數.是 rsect/s 的一半,因為每扇區大小為512位元組.(需要計算)
wkB/s:      每秒寫K位元組數.是 wsect/s 的一半.(需要計算)
avgrq-sz:   平均每次設備I/O操作的數據大小 (扇區).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:   平均I/O隊列長度.即 delta(aveq)/s/1000 (因為aveq的單位為毫秒).
await:      平均每次設備I/O操作的等待時間 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm:      平均每次設備I/O操作的服務時間 (毫秒).即 delta(use)/delta(rio+wio)
%util:      一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的.即 delta(use)/s/1000 (因為use的單位為毫秒)

如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸.

idle小於70% IO壓力就較大了,一般讀取速度有較多的wait.同時可以結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所占用的CPU時間的百分比,高過30%時IO壓力高)

另外 await 的參數也要多和 svctm 來參考.差的過高就一定有 IO 的問題.一般地系統IO響應時間(await)應該低於5ms,如果大於10ms就比較大了.

avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的數據的大小,如果次數多,但數據拿的小的話,其實 IO 也會很小.如果數據拿的大,才IO 的數據會高.也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是講,讀定速度是這個來決定的.

一個不錯的例子.(I/O 系統 vs. 超市排隊)

舉一個例子,我們在超市排隊 checkout 時,怎麼決定該去哪個交款台呢?
    首當是看排的隊人數,5個人總比20人要快吧?
    除了數人頭,我們也常常看看前面人購買的東西多少,如果前面有個採購了一星期食品的大媽,那麼可以考慮換個隊排了.
    還有就是收銀員的速度了,如果碰上了連 錢都點不清楚的新手,那就有的等了.
    另外,時機也很重要,可能 5 分鐘前還人滿為患的收款台,現在已是人去樓空,這時候交款可是很爽啊,當然,前提是那過去的 5 分鐘裡所做的事情比排隊要有意義

I/O 系統也和超市排隊有很多類似之處:
    r/s+w/s 類似於交款人的總數

    平均隊列長度(avgqu-sz)類似於單位時間裡平均排隊人的個數

    平均服務時間(svctm)類似於收銀員的收款速度

    平均等待時間(await)類似於平均每人的等待時間

    平均I/O數據(avgrq-sz)類似於平均每人所買的東西多少

    I/O 操作率 (%util)類似於收款台前有人排隊的時間比例.

我們可以根據這些數據分析出 I/O 請求的模式,以及 I/O 的速度和響應時間.

> 下面是別人寫的這個參數輸出的分析


// # iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device:              rrqm/s wrqm/s r/s   w/s    rsec/s wsec/s rkB/s  wkB/s  avgrq-sz  avgqu-sz await svctm %util
/dev/cciss/c0d0      0.00   44.90 1.02  27.55    8.16  579.59 4.08   289.80  20.57      22.35  78.21  5.00 14.29

上面的 iostat 輸出表明秒有 28.57 次設備 I/O 操作: 總IO(io)/s = r/s(讀) +w/s(寫) = 1.02+27.55 = 28.57 (次/秒) 其中寫操作占了主體 (w:r = 27:1).

平均每次設備 I/O 操作只需要 5ms 就可以完成,但每個 I/O 請求卻需要等上 78ms,為什麼? 因為發出的 I/O 請求太多 (每秒鐘約 29 個),假設這些請求是同時發出的,那麼平均等待時間可以這樣計算:

平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + … + 請求總數-1) / 請求總數

應用到上面的例子: 平均等待時間 = 5ms * (1+2+…+28)/29 = 70ms,和 iostat 給出的78ms 的平均等待時間很接近.這反過來表明 I/O 是同時發起的.

每秒發出的 I/O 請求很多 (約 29 個),平均隊列卻不長 (只有 2 個 左右),這表明這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的.

一秒中有 14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裡 I/O 系統無事可做,所有 29 個 I/O 請求都在142毫秒之內處理掉了.

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒內的I/O請求總共需要等待2232.8ms.所以平均隊列長度應為 2232.8ms/1000ms = 2.23,
而 iostat 給出的平均隊列長度 (avgqu-sz) 卻為 22.35,為什麼?! 因為 iostat 中有 bug,avgqu-sz 值應為 2.23,而不是 22.35.


## vmstat

vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可實時動態監視操作系統的虛擬內存、進程、CPU活動.

vmstat的語法
  vmstat [-V] [-n] [delay [count]]
  
r,  可運行隊列的綫程數, 這些綫程都是可運行狀態, 只不過 CPU 暫時不可用.
b,  被 blocked 的進程數, 正在等待 IO 請求;
in, 每秒被處理過的中斷數
cs, 每秒系統上正在做上下文切換的數目
us, 用戶占用 CPU 的百分比
sy, 內核和中斷占用 CPU 的百分比
wa, 所有可運行的綫程被 blocked 以後都在等待 IO, 這時候 CPU 空閒的百分比
id, CPU 完全空閒的百分比

swpd: 使用虛擬內存大小
free: 可用內存大小
buff: 用作緩衝的內存大小
cache: 用作緩存的內存大小

si: 每秒從交換區寫到內存的大小
so: 每秒寫入交換區的內存大小

bi: 每秒讀取的塊數
bo: 每秒寫入的塊數


### badblocks

badblock 命令用於查找磁碟中損壞的區塊.

badblock (options)  (參數)

options:
    -b<區塊大小>: 指定磁碟的區塊大小,單位為位元組 
    -o<輸出檔案>: 將檢查的結果寫入指定的輸出檔案 
    -c: 每個區塊檢查的次數,預設是16次
    -s: 在檢查時顯示進度
    -v: 執行時顯示詳細的信息 
    -w: 在檢查時,執行寫入測試
 
 參數:
    磁碟裝置:  指定要檢查的磁碟裝置 
    磁碟區塊數:指定磁碟裝置的區塊總數 
    啟始區塊:  指定要從哪個區塊開始檢查

// 檢查硬碟是否產生壞道並輸出到badblocks.log中    
badblocks -s -v -o /root/badblocks.log /dev/sda

 
// badblocks以4096位元組為一個“block”,每一個“block”檢查1次, 將結果輸出到“hda-badblocks-list.1”檔案中,由第51000 block開始,到63000 block結束
badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000

> 利用硬碟的重分配特性修復壞道


1) 硬碟上的晶片存有一個GList,裡面存儲着盤面上的壞道信息,當讀寫到其記錄的地址時會自動重映射另一個地址來代替損壞的區域. 
而往其中添加內容很簡單:只要往壞道上寫數據(讀不行),硬碟會自動重映射.

badblocks -w [-f] /dev/sdXX [-s -b4096] end start

    -w:寫入命令, 通過在壞道地址強制寫入來讓硬碟自動重映射.
    -f:強制寫入, 在已確定目標不被系統讀寫而-w仍然拒絶寫入時使用.這個參數應該儘量避免!
    end,start:強制寫入的開始和終止塊地址, 與-b制定的大小相配和.
    
2) 使用fsck -a /dev/sda1


磁碟壞道分為三種:0磁軌壞道,邏輯壞道,硬碟壞道。
    
    其中邏輯壞道可以使用上面的方法修復,0磁軌壞道的修復方法是隔離0磁軌,使用fdsk劃分區的時候從1磁軌開始劃分區。
    
    如果是硬碟壞道的話,只能隔離不能修復。
    
    硬碟壞道的監測方法:使用上述方法檢測修復後,再使用badblocks -s -v -o /root/badblocks.log /dev/sda監測看是否還有壞道存在,如果壞道還是存在的話說明壞道屬於硬碟壞道。
    
    硬碟壞道隔離方法,首先記錄監測出的硬碟壞道,然後分區的時候把硬碟壞道所在的扇區分在一個分區(大小一般大於壞扇區大小),劃分出的壞道分區不使用即可達到隔離的目的。隔離只是暫時方案,建議儘快更換硬碟,因為壞道會擴散,以免以後出現嚴重的數據問題。