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 回答
2

这似乎只适用于内部驱动器。我找不到使用 IOKit 来查询三星 T5 外置 USB 3 SSD 的 SSD 特性(也不是东芝 Canvio USB HDDD)的方法。不过,我确实管理了 MBP 中的内部驱动器。

磁盘实用程序也不认为三星是 SSD,所以这让我认为除了测量实际性能之外可能没有其他办法。

于 2019-08-12T23:08:34.077 回答
0

线程数?1 是否会压倒任何磁盘、SSD、RAID。磁盘慢,处理器快。操作系统将无论如何(或至少应该)重新排序您的磁盘请求,以获得最少的磁头移动。

于 2010-01-17T18:29:27.187 回答