SSD(ソリッドステートドライブ)ではなく、通常のハードドライブでのみ有効なツールをリリースする準備をしています。実際、SSDと一緒に使用しないでください。多くの読み取り/書き込みが発生し、実際の効果が得られないためです。
特定のドライブがソリッドステートであるかどうかを検出する方法を知っている人はいますか?
SSD(ソリッドステートドライブ)ではなく、通常のハードドライブでのみ有効なツールをリリースする準備をしています。実際、SSDと一緒に使用しないでください。多くの読み取り/書き込みが発生し、実際の効果が得られないためです。
特定のドライブがソリッドステートであるかどうかを検出する方法を知っている人はいますか?
最後に、信頼できるソリューションです!そのうちの2つ、実際に!
/ sys / block / sdX / queue/rotationalを確認します。sdXはドライブ名です。0の場合はSSDを扱っており、1は普通の古いHDDを意味します。
導入されたLinuxバージョンに指を置くことはできませんが、UbuntuのLinux3.2とvanillaLinux 3.6には存在し、vanilla2.6.38には存在しません。オラクルはまた、2.6.32に基づくUnbreakableEnterpriseカーネル5.5にバックポートしました。
このコミットによって導入された、Linux3.3以降のドライブが回転しているかどうかを確認するioctlもあります。ただし、通常はsysfsを使用する方が便利です。
実際には、回転待ち時間をかなり簡単に決定できます。これは、大学のプロジェクトの一環として一度行ったものです。このレポートで説明されています。レイテンシーのいくつかの素晴らしいグラフが表示されている7ページにスキップすることをお勧めします。それは約9.3ミリ秒から1.1ミリ秒になります-8.2ミリ秒の低下。これはに直接対応し60 s / 8.2 ms = 7317 RPM
ます。
これは単純なCコードa
で行われました。これが位置間とb
スクラッチファイルを測定する部分です。b
円柱の周りをずっとさまよっているまで、これをどんどん大きな値で行いました。
/*aとbのアクセス時間の差を測定します。結果 *はナノ秒単位で測定されます。* / int measure_latency(off_t a、off_t b){ Cycles_t ta、tb; オーバーフローディスクバッファ(); lseek(work_file、a、SEEK_SET); read(work_file、buf、KiB / 2); ta = get_cycles(); lseek(work_file、b、SEEK_SET); read(work_file、buf、KiB / 2); tb = get_cycles(); int diff =(tb --ta)/ cycles_per_ns; fprintf(stderr、 "%i KiBから%i KiB:%i nsec \ n"、a / KiB、b / KiB、diff); 差分を返す; }
このコマンドlsblk -d -o name,rota
はドライブを一覧表示し、回転ディスクの場合はROTAに1、SSDの場合は0になります。出力例:
NAME ROTA sda 1 sdb 0
SSDの検出は、dseifertが理解しているほど不可能ではありません。Linuxのlibata(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html)にはすでにある程度の進歩がありますが、まだユーザーの準備ができているようには見えません。
そして、私はこれがなぜ行われる必要があるのかをはっきりと理解しています。これは基本的に、リンクリストと配列の違いです。最適化などは通常、SSDでは逆効果です。
あなたは走ることによって幸運を得ることができます
smartctl -i sda
Smartmontoolsから。ほとんどすべてのSSDのモデルフィールドにSSDがあります。ただし、保証はありません。
この古いが非常に重要な質問に答えるのに2セント...ディスクがSCSI経由でアクセスされる場合、(潜在的に)SCSIINQUIRYコマンドを使用してその回転速度を要求できるようになります。そのためのVPD(Vital Product Data)ページが呼び出されBlock Device Characteristics
、番号が付けられ0xB1
ます。このページのバイト4と5には、次の意味を持つ数字が含まれています。
したがって、SSDは0001h
このフィールドに含まれている必要があります。このT10.org
ページに関するドキュメントはここにあります。
しかし、この規格の実装状況は私にはわかりません。
私は次のjavascriptコードを書きました。マシンがSSDドライブを使用しているかどうか、およびそれがブートドライブであるかどうかを判断する必要がありました。このソリューションは、MSFT_PhysicalDiskWMIインターフェイスを使用します。
function main()
{
var retval= false;
// MediaType - 0 Unknown, 3 HDD, 4 SSD
// SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD)
// DeviceID - 0 boot device
var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage");
var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk");
var enumItems = new Enumerator(colItems);
for (; !enumItems.atEnd(); enumItems.moveNext())
{
var objItem = enumItems.item();
if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0)
{
if (objItem.DeviceID ==0)
{
retval=true;
}
}
}
if (retval)
{
WScript.Echo("You have SSD Drive and it is your boot drive.");
}
else
{
WScript.Echo("You do not have SSD Drive");
}
return retval;
}
main();
SSDデバイスはハードディスクデバイスインターフェイスをエミュレートするため、ハードディスクのように使用できます。これは、それらが何であるかを検出する一般的な方法がないことも意味します。
ドライブのいくつかの特性(遅延、速度、サイズ)を使用できる可能性がありますが、これはすべてのドライブで正確であるとは限りません。もう1つの可能性は、SMARTデータを調べて、これを介してディスクのタイプを判別できるかどうかを確認することです(モデル名、特定の値によって)。ただし、すべてのドライブのデータベースを保持しない限り、これは100%にはなりません。どちらか正確です。
テキストファイルを書くテキストファイル
を読む
10000回繰り返す...
10000/elapsed
SSDの場合ははるかに高くなります、python3:
def ssd_test():
doc = 'ssd_test.txt'
start = time.time()
for i in range(10000):
with open(doc, 'w+') as f:
f.write('ssd test')
f.close()
with open(doc, 'r') as f:
ret = f.read()
f.close()
stop = time.time()
elapsed = stop - start
ios = int(10000/elapsed)
hd = 'HDD'
if ios > 6000: # ssd>8000; hdd <4000
hd = 'SSD'
print('detecting hard drive type by read/write speed')
print('ios', ios, 'hard drive type', hd)
return hd