Vitesse d’écriture constante sur le disque

J’écris séquentiellement des données en temps réel sur un disque rotatif vide. ( EDIT: il n’a pas besoin d’être séquentiel, tant que je peux le lire comme s’il était séquentiel. ) Les données arrivent à un débit de 100 Mo / s et les disques ont une vitesse d’écriture moyenne de 120 Mo / s. s.

Parfois (en particulier lorsque l’espace libre commence à diminuer), la vitesse du disque est inférieure à 100 Mo / s, selon l’endroit où le disque est en cours d’écriture, et je dois supprimer des données vitales.

Existe-t-il un moyen d’écrire sur le disque dans un modèle (ou d’une autre manière) pour assurer une vitesse d’écriture constante proche du débit moyen? Indépendamment de la quantité de données présentes sur le disque.

MODIFIER:

Quelques notes sur pourquoi je pense que cela devrait être possible.

Lorsque vous écrivez généralement sur le disque, il commence dans la partie rapide du plateau et écrit ensuite vers les parties les plus lentes. Cependant, si je pouvais écrire la moitié des données dans la partie rapide et la moitié des données dans la partie lente (pendant 1 seconde, il pourrait écrire 50 Mo dans la partie rapide et 50 Mo dans la partie lente). Je pourrais éventuellement atteindre un taux constant?

En tant que programmeur, je ne sais pas comment je peux décider où les données sont écrites sur le plateau ou même si le système d’exploitation peut réaliser quelque chose de similaire.

    Partitionnez le disque en deux partitions de taille égale. Écrivez quelques secondes de données en alternance entre les partitions. De cette façon, vous obtenez presque toute la vitesse séquentielle habituelle, bien moyennée. Une recherche de disque toutes les quelques secondes ne mange presque pas de temps. Une recherche par seconde réduit la durée d’utilisation de 1000 ms à 990 ms, ce qui représente une réduction de ~ 1% du débit. Plus vous pouvez consacrer de RAM à la mise en mémoire tampon, moins vous devez chercher.

    Utilisez plus de partitions pour augmenter l’effet de moyenne.

    Si je devais le faire sur un système Windows standard, j’utiliserais un périphérique avec une vitesse d’écriture moyenne plus élevée pour me donner plus de marge. S’attendre à une vitesse d’écriture moyenne de 100 Mo / s sur l’ensemble du disque évalué à 120 Mo / s vous causera des problèmes. Les disques durs qui tournent n’ont pas une vitesse d’écriture constante sur l’ensemble du disque.

    La solution habituelle à ce problème consiste à mettre en mémoire tampon la mémoire RAM pour couvrir les ralentissements peu fréquents . Plus vous utilisez de mémoire RAM comme tampon, plus la lenteur que vous pouvez gérer est longue. Ce sont des compromis à faire. Si votre problème est le ralentissement connu des secteurs internes d’un disque rotatif, votre appareil n’est tout simplement pas assez rapide.

    Une autre chose qui pourrait aider est d’accéder au disque aussi directement que possible et de s’assurer qu’il n’est pas partagé par d’autres parties du système. Utilisez un périphérique physique distinct, ne le formatez pas avec un système de fichiers, écrivez directement dans l’espace partitionné. Oui, vous devrez gérer certains des problèmes que le système de fichiers résout pour vous, mais vous ignorez également tout un code que vous ne pouvez pas contrôler. Même dans ce cas, votre application pourrait rencontrer des problèmes de planification avec Windows. Windows n’est pas un RTOS, il n’y a pas de garanties en matière de timing. Encore une fois, cela aiderait davantage avec les ralentissements temporaires du nettoyage du système de fichiers, le vidage des pages sales, etc. Cela ne sera probablement pas très utile avec le problème des “dernières écritures de 100 Go à 80 Mo / s”.

    Si vous êtes vraiment coincé avec un disque allant de 120 Mo / s -> 80 Mo / s à l’extérieur (vous devez tester avec votre propre code et ne pas faire confiance aux spécifications de la fabrication pour que vous sachiez à quoi vous avez affaire) , alors vous devrez jouer à des jeux de partitionnement comme d’autres l’ont suggéré. Sur un disque mécanique, cela introduira une recherche sérieuse de la tête, ce qui pourrait compromettre votre amélioration. Pour minimiser les recherches, il serait encore plus important de s’assurer qu’il s’agit d’un disque dédié que le système d’exploitation n’utilise pas pour autre chose. En outre, utilisez de grands tampons et écrivez plusieurs mégaoctets à la fois avant de chercher à la fin du disque. Au lieu de partitionner, vous pouvez écrire directement sur le périphérique en mode bloc et contrôler les blocs sur lesquels vous écrivez. Je ne sais pas comment faire cela sous Windows.

    Pour résoudre ce problème sous Linux, je serais tenté de tester le raid0 de mdadm sur deux partitions du même lecteur et voir si cela fonctionne. Si c’est le cas, le travail est terminé et vous n’avez pas besoin d’écrire et de tester un mécanisme d’écriture compliqué.

    Je crains que cela soit plus difficile que vous ne le réalisez:

    • Si votre vitesse d’écriture moyenne de 120 Mo / s est la valeur du fabricant, elle est probablement «optimiste» au mieux.
    • Même une vitesse d’écriture testée est généralement effectuée sur un disque non partitionné / formaté et sera plus élevée que ce que vous verriez normalement dans l’utilisation réelle (combien est une bonne question).
    • Une valeur plus importante est la vitesse d’écriture minimale du lecteur. Par exemple, de Tom’s Hardware 2013 HDD Benchmarks, un disque avec une moyenne de 120 Mo / s a ​​un minimum de 76 Mo / s.
    • Un lecteur utilisé par d’autres applications en même temps (par exemple, Windows) aura une vitesse d’écriture beaucoup plus faible.
    • Une valeur encore plus importante est la performance réelle mesurée des disques. Je ferais une application simple similaire à votre cas d’utilisation qui écrit des données sur le lecteur aussi vite que possible jusqu’à ce qu’il remplisse le lecteur. Faites-le quelques dizaines de fois pour obtenir une valeur de vitesse d’écriture moyenne / minimum / maximum plus réaliste … il sera probablement inférieur à ce que vous attendez.
    • Comme vous l’avez noté, même si votre vitesse d’écriture moyenne “réelle” est supérieure à 100 Mo / s, vous rencontrez des problèmes si vous exécutez des vitesses d’écriture lentes juste avant le remplissage du disque, en supposant que vous n’avez pas d’autre endroit pour écrire les données à. L’utilisation d’un tampon n’aide pas dans ce cas.
    • Je ne sais pas si vous pouvez spécifier un emplacement physique sur lequel écrire sur le disque dur de nos jours sans entrer dans le microprogramme du lecteur. Même si vous pouviez, ce serait mon dernier choix pour une solution.

    Quelques points spécifiques que je voudrais examiner pour résoudre votre problème:

    • Mesurez la “vraie” performance en écriture du lecteur pour voir si elle est suffisamment rapide. Cela vous donne une idée de votre retard.
    • Placez le système d’exploitation sur un lecteur distinct pour vous assurer que le lecteur de données n’est pas utilisé par votre application.
    • Obtenez des disques plus rapides (disque dur ou SDD). Il est bon d’utiliser les vitesses d’écriture du fabricant comme guide initial, mais testez-les également.
    • Obtenez plus de disques et placez-les dans une configuration RAID0 (ou similaire) pour un access en écriture plus rapide. Vous voudrez encore tester cela pour confirmer que cela fonctionne pour vous.

    Vous pouvez implémenter la stratégie d’alternance d’écritures entre l’intérieur et l’extérieur en contrôlant directement les emplacements d’écriture du disque. Sous Windows, vous pouvez ouvrir un disque comme “\. \ PhysicalDriveX” et contrôler où il écrit. Pour plus d’infos voir

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

    Tout d’abord, j’espère que vous utilisez des disques bruts et non un système de fichiers. Si vous utilisez un système de fichiers, vous devez:

    1. Créez un fichier vide, non fragmenté, aussi volumineux que le système de fichiers le permet.

    2. Obtenir un mappage des positions du fichier logique aux blocs de disque.

    3. Inversez ce mappage pour que vous puissiez mapper des blocs de disque vers des positions de fichiers logiques. Bien sûr, certains blocs ne sont pas disponibles en raison de l’utilisation propre du système de fichiers.

    À ce stade, le disque ressemble à un disque brut auquel vous accédez par bloc de disque. C’est une hypothèse valable que cet adressage de bloc est principalement monotone au nombre de cylindres physiques. IOW si vous augmentez le numéro de bloc du disque, le nombre de cylindres ne diminuera jamais (ou n’augmentera jamais – selon l’ordre LBA du mappage physique du disque).

    Notez également que la vitesse d’écriture moyenne d’un disque peut être donnée par cylindre ou par unité de stockage . Comment saurais tu? Vous avez besoin de ce dernier numéro, et le seul moyen sûr de l’obtenir est de le comparer vous-même. Vous devez remplir le disque entier avec des données, en écrivant plusieurs fois une page zéro sur le disque, en procédant par bloc et en divisant la quantité totale de données écrites par la quantité nécessaire. Vous devez accéder au disque ou au fichier en mode direct. Cela devrait désactiver la mise en mémoire tampon du système d’exploitation pour les données du fichier, et non pour les métadonnées du système de fichiers (si vous n’utilisez pas un disque brut).

    À ce stade, il vous suffit d’écrire des blocs de données de tailles sensibles aux deux extrémités des numéros de bloc: vous devez remplir le disque des deux extrémités vers l’intérieur. La taille des blocs de données dépend du gaspillage de bande passante que vous pouvez autoriser. Vous devez également supposer que le disque dur peut rechercher de temps en temps pour mettre à jour ses données de maintenance. En supposant une recherche dans le pire des cas prenant 15 ms, vous perdez 1,5% de la bande passante par seconde pour chaque recherche. En supposant que vous ne pouvez pas épargner plus de 5% de la bande passante, avec 1 recherche / s en moyenne pour le lecteur lui-même, vous pouvez rechercher deux fois par seconde. Ainsi, la taille de votre bloc doit être your_bandwith_per_second/2 . Cette bande passante n’est pas la bande passante du disque, mais la bande passante de votre source de données.

    Hélas, si seulement les choses étaient faciles. Il s’avère généralement que la bande passante au milieu du disque n’est pas la bande passante moyenne. Pendant votre test, vous devez également prendre note de la vitesse d’écriture sur de plus petites sections du disque, par exemple tous les 1% du disque. De cette façon, lorsque vous écrivez dans chaque section du disque, vous pouvez déterminer comment diviser les données entre la section “basse” et la section “haute” à laquelle vous écrivez. Supposons que vous commencez à des positions à 0% et 99% sur le disque, et que la position basse a une largeur de bande mean*1.5 et que la position haute a une bande passante mean*0.8 , la mean étant la largeur de bande moyenne souhaitée. Vous devrez ensuite écrire 100% * 1.5/(0.8+1.5) des données dans la position basse et le rest ( 100% * 0.8/(0.8+1.5) ) dans la position la plus lente.

    La taille de votre tampon doit être plus grande que la taille du bloc, car vous devez assumer une latence de pire cas pour le disque dur s’il rencontre de mauvais blocs et doit relocaliser des données, etc. être raisonnable. En option, il peut se développer par lui-même si les latences mesurées pendant que votre logiciel tourne sont plus élevées. Ce tampon doit être verrouillé (“épinglé”) sur la mémoire physique pour qu’il ne soit pas sujet à un échange.

    Une autre option possible consiste à supprimer (ou effectuer une course courte) un disque dur. Si vous commencez avec un disque de 4 To ou plus et que vous le déplacez vers 2 To, seules les parties externes des plateaux seront utilisées, ce qui accélérera le débit. Le problème serait d’obtenir le logiciel qui émet les commandes uniques du fournisseur sur un disque dur pour le désinstaller.