Mac OS XでSSDを検出する方法は?
質問
(すなわち、のないのベンチマーク)信頼性、迅速、決定論的な方法がありますが、
?ソリッドステートドライブでありますどれだけのディスクハンドル並列アクセス他のインジケータがありますか?私は私のプログラムは、ディスクバインド操作に使用しようとしているスレッドの数を調整しようとしています。
私は生の速さに興味を持ったりシーク時間、アクセスの唯一のどのタイプではないよ - シリアルやパラレル - より高速なドライブのためです。私は私のプログラムのユーザーは、iSCSIまたはRAIDを使用することを期待していません。 SSDは、何か他のものがいいツー持っている、私の焦点となっています。
Device Characteristics
の IOAHCIBlockStorageDevice
は、この情報が含まれています。どのように私はプログラム的にそれを読むことができますか?
これまでのところ、私は考え出した、それはこのように書き:(され、以下の擬似コード)
match = IOBSDNameMatching(kIOMasterPortDefault,0,"disk0s2");
IOServiceGetMatchingServices(kIOMasterPortDefault, match, &iterator);
while(entry = IOIteratorNext(iterator)) {
do {
entry = IORegistryEntryGetParentEntry(nextMedia, kIOServicePlane, &entry);
dict = IORegistryEntryCreateCFProperty(nextMedia,
CFSTR(kIOPropertyDeviceCharacteristicsKey), kCFAllocatorDefault, 0);
[dict objectForKey:CFSTR(kIOPropertyMediumTypeKey)];
}
while(!dict && entry);
}
<時間>
編集:ここでの完全なソースコード。私はそれがインテルSSDとOCZ頂点で動作確認しました。
解決
は、あなたがしている最良の推測がIOKitのです。
あなたはのioreg のコマンドラインツールやのIORegistryExplorer の
を使用しての機能のいくつかを試すことができます <時間>ここであなたを助けるかもしれないいくつかのコードです。これは、RAIDではなく、パーティションではありませんすべてのハードドライブを取り出します。これは、あなたが望むものではありませんが、それはあなたが始めるかもしれません。
#import "TWDevice.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <paths.h>
#include <sys/param.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOBSD.h>
#include <IOKit/storage/IOMedia.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/Kext/KextManager.h>
@implementation TWDevice
@synthesize name, devicePath, size, blockSize, writable, icon;
+ (NSArray *)allDevices {
// create matching dictionary
CFMutableDictionaryRef classesToMatch;
classesToMatch = IOServiceMatching(kIOMediaClass);
if (classesToMatch == NULL) {
[NSException raise:@"TWError" format:@"Classes to match could not be created"];
}
// get iterator of matching services
io_iterator_t mediaIterator;
kern_return_t kernResult;
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,
classesToMatch,
&mediaIterator);
if (kernResult != KERN_SUCCESS) {
[NSException raise:@"TWError" format:@"Matching services did not succed."];
}
// iterate over all found medias
io_object_t nextMedia;
NSMutableArray *detectedDevices = [NSMutableArray array];
while (nextMedia = IOIteratorNext(mediaIterator)) {
NSMutableDictionary *properties;
kernResult = IORegistryEntryCreateCFProperties(nextMedia,
(CFMutableDictionaryRef *)&properties,
kCFAllocatorDefault, 0);
if (kernResult != KERN_SUCCESS) {
[NSException raise:@"TWError" format:@"Getting properties threw error."];
}
// is it a whole device or just a partition?
if ([[properties valueForKey:@"Whole"] boolValue] &&
![[properties valueForKey:@"RAID"] boolValue]) {
TWDevice *device = [[[TWDevice alloc] init] autorelease];
device.devicePath = [NSString stringWithFormat:@"%sr%@", _PATH_DEV, [properties valueForKey:@"BSD Name"]];
device.blockSize = [[properties valueForKey:@"Preferred Block Size"] unsignedLongLongValue];
device.writable = [[properties valueForKey:@"Writable"] boolValue];
device.size = [[properties valueForKey:@"Size"] unsignedLongLongValue];
io_name_t name;
IORegistryEntryGetName(nextMedia, name);
device.name = [NSString stringWithCString:name encoding:NSASCIIStringEncoding];
…
[detectedDevices addObject:device];
}
// tidy up
IOObjectRelease(nextMedia);
CFRelease(properties);
}
IOObjectRelease(mediaIterator);
return detectedDevices;
}
@end
他のヒント
実は、私はそれがより正確にあなたの質問に答えるためにあなたは、ベンチマークのルートを行くべきだと思う - ディスクがSSDであることを起こることをあなたないの本当にのケア、あなただけの、そのディスクを気に本当に速いです。どのようなユーザーは、高速RAIDの設定、またはファイバチャネルアレイを使用している、またはiSCSIを使用している場合は?
だけが基本となるの/ dev / diskXからランダムセクタの束を読んで、それはあなたの要件を満たしている場合は、「高速」ドライブ
のように扱うことができますこれは内蔵ドライブのために可能と思われます。私はそのSSDネスのためのサムスンT5外部USB 3 SSD(東芝もCanvioのUSB HDDD)を照会するIOKitのを使用して方法を見つけることができませんでした。私も、私のMBPの内蔵ドライブの管理でした。
それは私が実際のパフォーマンスを測定する以外に方法は、存在しないかもしれないと思わせるように、ディスクユーティリティはまた、サムスンはSSDであるとは思いません。
スレッドの数? 1は、任意のディスク、SSD、RAIDかどうかを圧倒しようとしています。ディスクは、プロセッサが高速で、遅いです。 OSは、とにかくあなたのディスク要求の順序を変更しようとしている(または、それがなければならない、少なくとも)少なくとも頭の動きを取得します。