Question

Je suis prêt à libérer un outil qui est efficace avec des disques durs réguliers, et non SSD (lecteur à l'état solide). En fait, il ne doit pas être utilisé avec SSD, car cela se traduira par beaucoup de lecture / écriture sans efficacité réelle.

Tout le monde connaît un moyen de détecter si un lecteur donné est à l'état solide?

Était-ce utile?

La solution

Détection n'est pas SSDs aussi impossible que dseifert fait sortir. Il y a déjà des progrès dans le libata de linux ( http: // linux .derkeiler.com / listes de diffusion / kernel / 2009-04 / msg03625.html ), mais il ne semble pas encore prêt à utiliser.

Et je comprends vraiment pourquoi cela doit être fait. Il est fondamentalement la différence entre une liste, et un tableau. Défragmentation et tel est généralement contre-productif sur un SSD.

Autres conseils

Enfin une solution fiable! Deux d'entre eux, en fait!

Vérifier / sys / block / sdX / file d'attente / rotation, où sdX est le nom du lecteur. Si c'est 0, vous avez affaire à un SSD et 1 signifie bon vieux disque dur.

Je ne peux pas mettre mon doigt sur la version Linux où il a été introduit, mais il est présent dans Linux Ubuntu 3.2 et la vanille Linux 3.6 et non présent dans la vanille 2.6.38. Oracle a également rétroportés à leur Unbreakable Enterprise noyau 5.5, qui est basé sur 06.02.32.

Il y a aussi un ioctl pour vérifier si le lecteur est en rotation depuis Linux 3.3, introduit par ce commit . L'utilisation sysfs est généralement plus pratique, cependant.

Vous pouvez réellement déterminer assez facilement le temps de latence de rotation - Je l'ai fait une fois dans le cadre d'un projet universitaire. Il est décrit dans ce rapport . Vous voulez aller à la page 7 où vous voyez des graphiques agréables de la latence. Il va d'environ 9,3 ms à 1,1 ms - une baisse de 8,2 ms. Cela correspond directement à 60 s / 8.2 ms = 7317 RPM.

Il a été fait avec code simple C - voici la partie que les mesures les positions entre aand b dans un fichier zéro. Nous l'avons fait avec les valeurs de b plus grandes et plus grandes jusqu'à ce que nous avons erré tout le chemin autour d'un cylindre:

/* Measure the difference in access time between a and b.  The result
 * is measured in nanoseconds. */
int measure_latency(off_t a, off_t b) {
  cycles_t ta, tb;

  overflow_disk_buffer();

  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 to %i KiB: %i nsec\n", a / KiB, b / KiB, diff);
  return diff;
}

Cette commande lsblk -d -o name,rota répertorie vos lecteurs et a un 1 à ROTA si elle est un disque de rotation et un 0 si c'est un SSD. Exemple de sortie:

NAME ROTA
sda     1
sdb     0

Vous pourriez avoir de la chance en exécutant

smartctl -i sda

Smartmontools . Presque tous les disques SSD a SSD dans le domaine du modèle. Aucune garantie cependant.

périphériques SSD émulent une interface de périphérique de disque dur, de sorte qu'ils peuvent simplement être utilisés comme des disques durs. Cela signifie également qu'il n'y a pas de façon générale pour détecter ce qu'ils sont.

Vous pouvez probablement utiliser certaines caractéristiques du lecteur (temps d'attente, la vitesse, la taille), bien que cela ne sera pas précis pour tous les lecteurs. Une autre possibilité pourrait être de regarder le S.M.A.R.T. les données et voir si vous pouvez déterminer le type de disque à travers ce (par nom du modèle, certaines valeurs), mais à moins que vous gardez une base de données de tous les lecteurs là-bas, cela ne va pas être soit précis à 100%.

Mes deux cents à répondre à cette ancienne mais très importante question ... Si un disque est accessible via SCSI, alors vous (potentiellement) être en mesure d'utiliser la commande SCSI demande à demander son taux de rotation. VPD Page (Product Data Vital) pour que l'on appelle Block Device Characteristics et a un certain nombre 0xB1. Octets 4 et 5 de cette page contiennent un certain nombre de sens:

  • 0000h "taux de rotation moyen est pas signalé"
  • 0001h "moyen anti-rotation (par exemple, à l'état solide)"
  • 0002h - 0400h "réservé"
  • 0401h - FFFEh « vitesse de rotation nominale moyenne en tours par minute (à savoir, rpm) (par exemple, 7 200 tours par minute = 1C20h, 10 000 rpm = 2710h, et 15 000 tours par minute = 3A98h) "
  • FFFFh "réservé"

Alors, SSD doit avoir 0001h dans ce domaine. Le document T10.org de cette page se trouve .

Toutefois, l'état de mise en œuvre de cette norme n'est pas clair pour moi.

J'ai écrit le code javascript suivant. Je avais besoin pour déterminer si la machine a été Ussing disque SSD et s'il était disque de démarrage. La solution utilise l'interface MSFT_PhysicalDisk WMI.

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

fichier texte d'écriture
lire le fichier texte

répéter 10000 fois ...

10000/elapsed

pour un ssd sera beaucoup plus élevé, 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top