10

Mac OS X が搭載されているシステム ドライブがソリッド ステート ドライブであるかどうかを確認するための、信頼性が高く、迅速で、確定的な方法 (つまり、ベンチマークではない方法) はありますか?

ディスクが並列アクセスをどれだけうまく処理できるかを示す他の指標はありますか? プログラムがディスクにバインドされた操作に使用するスレッドの数を調整しようとしています。

私は生の速度やシーク時間には興味がなく、シリアルまたはパラレルのどちらのタイプのアクセスがドライブにとって高速であるかだけに関心があります。私のプログラムのユーザーが iSCSI や RAID を使用することは期待していません。SSD は私の焦点であり、それ以外は何でもあると便利です。

Device CharacteristicsofIOAHCIBlockStorageDeviceには、この情報が含まれています。プログラムで読み取るにはどうすればよいですか?


これまでのところ、次のようになることがわかりました:(以下は擬似コードです)

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); 
}

編集:ここに完全なソース コードがあります。Intel SSD と OCZ Vertex で動作することを確認しました。

4

4 に答える 4

7

実際には、ベンチマーク ルートを使用する必要があると思います。なぜなら、それはあなたの質問により正確に答えるからです。ディスクがたまたま SSD であることはあまり気にせず、ディスクが本当に高速であることだけを気にしますユーザーが高速 RAID セットアップまたはファイバー チャネル アレイを使用している場合、または iSCSI を使用している場合はどうなりますか?

基礎となる /dev/diskX から一連のランダムなセクターを読み取るだけで、要件を満たしていれば、それを「高速」ドライブとして扱うことができます

于 2010-01-17T18:10:54.920 に答える
5

この種の情報を取得しようとしている場合は、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
于 2010-01-17T19:29:00.360 に答える
0

スレッド数?1 は、SSD、RAID、またはその他のディスクを圧倒します。ディスクは遅く、プロセッサは高速です。OS は、頭の動きを最小限に抑えるために、とにかく (または少なくともそうする必要があります) ディスク要求を並べ替えます。

于 2010-01-17T18:29:27.187 に答える