Hard-Disk
連接到 Raspberry Pi 的外部 WD Red 磁碟過快旋轉
我有 2 個外部 WD Red 硬碟連接到 Raspberry Pi。
它們在 2 分鐘後減速,速度快得令人討厭,我總是要等待它們加速。
我讀過這
hdparm
不適用於 WD 磁碟。我已經測試過hdparm -I | grep level
,沒有得到任何輸出。我已經閱讀過
hd-idle
,但據我了解,它有助於磁碟永遠不會進入待機狀態。我可以做些什麼來增加待機超時?
編輯:我已經測試過
hdparm -S
,零效應。
您可以編寫您自己的 hd-idle 版本,它會做相反的事情,即在磁碟驅動器通常想要空閒之前通過對磁碟驅動器進行一些訪問來保持喚醒。但是您顯然需要區分何時真正放手並使光碟進入睡眠狀態。
這是一個使用 perl 腳本的嘗試。你不需要是 root 來執行它,但你需要在光碟上設置一些文件,你可以讀取這些文件來保持喚醒。與 hd-idle 一樣,它會從
/sys/
. 當在適當的時間內沒有完成 i/o 時,使用 flag 從 keep-awake 文件中進行少量讀取O_DIRECT
以確保完成真正的 i/o。這應該只是將讀/寫統計資訊總數加 1,這樣我們就可以檢測下一次輪詢是否也發生了其他一些真實的 i/o。#!/usr/bin/perl # stop standby of idle disc which doesnt support hdparm -S 12 # for stat fields see kernel src Documentation/iostats.txt # https://unix.stackexchange.com/a/422138/119298 use strict; use Fcntl; my $device = 'sda'; my $filename = '/mnt/myfs/lost+found/tickle'; # create tickle file for test. or use any readonly non-empty file if(! -s $filename){ open(FILE,">$filename") or die $!; print FILE "used to keep disk from sleeping\n" or die $!; close(FILE) or die $!; } sysopen(FILE,$filename,O_RDONLY|O_DIRECT) or die $!; my $minidle = 2*60; # seconds of real idle before need to tweak awake my $maxidle = 10*60; # seconds of false idle before allow to sleep open(STAT,"/sys/block/$device/stat") or die; my ($lasttot,$timechanged,$done); # create block aligned buffer for O_DIRECT read my $bufsize = 4096; my $align = 512; my $buf = 'x' x ($align+$bufsize); my $offset = unpack("J", pack "p", $buf) % $align; $offset = $align-$offset if $offset; while(){ my @fields = split(' ',<STAT>); # fields: 0 reads completed ok, 4 writes completed ok. may wrap my $tot = $fields[0]+$fields[4]; if($tot==$lasttot){ my $idle = time()-$timechanged; print "$device idle $idle secs\n"; if($done){ # let it sleep some more }elsif($idle>=$maxidle){ # let it really sleep now print "$device sleep now after $idle secs\n"; $done = 1; }elsif($idle>=$minidle){ # tickle to stay awake sysseek(FILE,0,Fcntl::SEEK_SET)==0 or die $!; sysread(FILE,$buf,$bufsize,$offset)>0 or die $!; $lasttot++; } # else builtin hardware timeout not reached yet }else{ $timechanged = time(); $lasttot = $tot; $done = 0; } seek(STAT,0,0); sleep(55); }
您需要設置
$device
為光碟$filename
的名稱,以及現有的非空文件或可以在光碟上創建的文件的名稱。在$minidle
我們需要光碟通常自行空閒$maxidle
的時間,以及我們希望強制它保持活動的時間。輪詢時間設置在
sleep()
最後。