Laden...

Festplatte aktiv halten

Erstellt von mkoehler vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.093 Views
Thema geschlossen
M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren
Festplatte aktiv halten

Hallo an alle,

Hintergrund ist folgender: Ich habe mir einen Homeserver gebaut, der einen Festplattenverbund mit 8 TB im RAID5 an einem eSATA-Port hat. Das RAID-Case schaltet sich allerdings bei Inaktivität ab. Das heißt, wenn ich mal Daten vom Homeserver brauche, oder anfange Musik zu hören, wie auch immer, stürzen meine Programme ab, weil sie die Daten nicht bekommen. Das RAID-Case braucht dann geschätzt 5 Sekunden zum Hochfahren (bin mir nicht sicher, ob es an dem Parken des Lese-/Schreibkopfes von Western Digital liegen könnte (8 Sekunden), Platten von WD sind auch mit drin).

Nun schwebt mir vor, eine Anwendung zu schreiben, die die Festplatten aktiv hält, in der Art, dass sie zufällig irgendwo auf der Platte 1 Byte große Dateien platziert, und wieder entfernt, so dass die Festplatten eben immer aktiv sind und das Raid-Case nicht in den Idle-Modus geht. Ich bitte um eure Einschätzung dazu. Ist das machbar? Oder muss ich mir ein anderes Konzept zurechtlegen?

MfG Markus Köhler

1.346 Beiträge seit 2008
vor 11 Jahren

Vielleicht einfach mal gucken ob man bei dem Gerät einstellen kann ob die Platten bei Inaktivität ausgeschaltet werden sollen oder nicht.

Wenn das nicht so geht kannst du das machen. Vielleicht alle 2 Minuten ein Byte in einer dummy Datei ändern.

LG pdelvo

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Also am Gerät kann man nichts einstellen, nur die Art der Zusammenschaltung der Festplatten (RAID0, RAID1, RAID5 usw.)...

MfG Markus Köhler

C
2.121 Beiträge seit 2010
vor 11 Jahren

Das heißt, wenn ich mal Daten vom Homeserver brauche, oder anfange Musik zu hören, wie auch immer, stürzen meine Programme ab, weil sie die Daten nicht bekommen. Das RAID-Case braucht dann geschätzt 5 Sekunden zum Hochfahren

Ich würde eher annehmen dass das Programm dann 5 Sekunden "steht" bis die Daten ankommen. Stürzt das wirklich gleich ab?
Wenn man im Explorer ein nicht vorhandenes Netzlaufwerk anfragt weil kein Netz da ist oder so, braucht der 30 Sekunden bis er merkt dass was nicht stimmt.

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Also mein Winamp ist gestern abgestürzt. Aber stimmt, der Explorer brauch noch länger. Darum wäre eine Lösung, die einfach die Festplatten am Laufen hält, (und eine Softwareseitige Lösung sein muss) wohl das beste...

MfG Markus Köhler

C
2.121 Beiträge seit 2010
vor 11 Jahren

Ich würd erst mal rausfinden obs wirklich immer Abstürze gibt. Eigentlich kriegt ein Programm ja nicht mit ob ne Platte grad aus ist, das sollte doch warten bis es die Daten kriegt. Zumindest kann ich mir einen Timeout von ein paar wenigen Sekunden nicht vorstellen.

Und wenns wirklich nötig ist, ist so ein Programm auch schnell geschrieben.
Es muss ja nicht mal zufällig sein. Schreib alle paar Minuten ein paar Bytes in eine Datei. Das kann ja die selbe sein, da muss nicht zufällig irgendwas passieren.
Wobei hast du da ein Problem?

16.807 Beiträge seit 2008
vor 11 Jahren

Also ein Programm weiß beim Zugriff nicht, ob eine Platte aktiv ist oder nicht - das macht alles Windows vollautomatisch.

Der Windows Media Player stürzt nicht ab; jedenfalls nicht bei meinem Homeserver-System. Es braucht zwar auch ma gern 10 sekunden wenn grad Idle angesagt ist. Aber der Fehler ist eher Winamp als die Tatsache, dass sich gewisse Dinge einfach nach einer Zeit zum Ressourcensparen ausschalten.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo mkoehler,

dass man bei einem Homeserver nicht konfigurieren können soll, ob bzw. wann sich die Platten abschalten, wundert mich. Auf der anderen Seite ist es natürlich wirklich keine große Sache, ein Programm zu schreiben, das durch regelmäßig Zugriffe ein Abschalten verhindert. Ich würde aber nichts schreiben, sondern einfach nur von immer neuen Stellen der Festplatte Dateien oder Sektoren lesen.

herbivore

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Also ich hab gestern folgendes versucht, scheint nicht so ganz zu funktioniere irgendwie...

private void Form1_Load(object sender, EventArgs e)
        {
            notifyIcon1.Text = "HDD No Idle";
            System.Timers.Timer myTimer = new System.Timers.Timer(120000);
            while (true)
            {
                myTimer.Elapsed += new System.Timers.ElapsedEventHandler(DisplayTimeEvent);
                myTimer.Interval = 120000; // 1000 ms is one second
                myTimer.Start();

            }
        }

        public static void DisplayTimeEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            var path = @"F:\hdd_no_idle";
            System.IO.File.WriteAllText(path, ".");
            System.IO.File.Delete(path);
        }

MfG Markus Köhler

C
2.121 Beiträge seit 2010
vor 11 Jahren

Du machst da eine Schleife die in maximaler Geschwindigkeit immer wieder Eventhandler zuweist und den Timer startet?!

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Sorry, war ein Leichtsinnsfehler. Hab das nochmal etwas überarbeitet. Müsste doch jetzt besser funktionieren, oder?

private void Form1_Load(object sender, EventArgs e)
        {
            notifyIcon1.Text = "HDD No Idle";
            System.Timers.Timer myTimer = new System.Timers.Timer(120000);
            DateTime startTime = new DateTime();
            startTime = DateTime.Now;
            TimeSpan elapsed = new TimeSpan();
            myTimer.Interval = 120000; // 1000 ms is one second
            int secs = Convert.ToInt16(myTimer.Interval / 1000);
            int mins = (secs >= 60) ? (secs / 60) : 0;
            while (true)
            {
                myTimer.Elapsed += new System.Timers.ElapsedEventHandler(DisplayTimeEvent);
                myTimer.Start();
                string[] nitp = notifyIcon1.Text.Split(new string[] {" - "}, 2, StringSplitOptions.None);
                elapsed = (DateTime.Now - startTime);
                notifyIcon1.Text = nitp[0] + " - " + (myTimer.Interval/1000 - elapsed.Seconds) + "s";
                System.Threading.Thread.Sleep(1000);
            }
        }

        public static void DisplayTimeEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            var path = @"F:\hdd_no_idle";
            if (System.IO.File.Exists(path) == false) System.IO.File.CreateText(path);
            System.IO.File.ReadAllText(path);
            //System.IO.File.Delete(path);
        }

MfG Markus Köhler

190 Beiträge seit 2012
vor 11 Jahren

Bitte den Beitrag von chilic richtig lesen!!! Und dann das lesen:
Das Timer-Steuerelement

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Okay, noch eine komplette Überarbeitung. Kommt das dem Sinn des Programmes jetzt näher?

namespace hdd_no_idle
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string path = @"F:\hdd_no_idle";

        private void Form1_Load(object sender, EventArgs e)
        {
                notifyIcon1.Text = "HDD No Idle";
                timer1.Enabled = true;
                timer1.Interval = 10000;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                if (System.IO.File.Exists(path) == false) System.IO.File.CreateText(path);
                System.IO.File.ReadAllText(path);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace);
            }
        }
    }
}

MfG Markus Köhler

16.807 Beiträge seit 2008
vor 11 Jahren

Windows merkt sich gewisse Ordnerstrukturen im Cache.
Es bringt also nichts, wenn Du nicht auf ein File aktiv zugreifst.

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Genau das habe ich nämlich auch schon festgestellt. Nur wusste ich nicht, wie ich dagegen vorgehen sollte. Also meinst du, ich müsste wirklich ein Zeichen oder so in die Datei schreiben, das würde dann helfen?

MfG Markus Köhler

C
2.121 Beiträge seit 2010
vor 11 Jahren

== false ist mal wirklich übel!
Schreib doch !System.IO.File.Exists(path)

Hinweis von herbivore vor 11 Jahren

... siehe [Tipp] Anfängerfehler == true / == false

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Okay, werde ich bei der nächsten Überarbeitung berücksichtigen. Momentan stehe ich glaube ich noch vor dem Problem, dass alle 10 Sekunden (also pro Intervall) die Speichernutzung um 8 KB zunimmt. Logischerweise gäbe es dann irgendwann einen Overflow. Wie löse ich das am Besten? So gut kenne ich mich nun noch nicht aus in C#...

MfG Markus Köhler

16.807 Beiträge seit 2008
vor 11 Jahren

dass alle 10 Sekunden (also pro Intervall) die Speichernutzung um 8 KB zunimmt. Logischerweise gäbe es dann irgendwann einen Overflow.

Du solltest Dich vielleicht erst mal informieren, wie zB .NET funktioniert. Java ist hier übrigens sehr ähnlich.
Der sogenannte Garbage Collector räumt nicht mehr verwendete Variablen etc erst dann weg, wenn es auch wirklich sein muss. Speicher frei räumen kostet schließlich auch Ressourcen.
Nur weil der dermaßen ungenaue Task-Manager meint, dass Du mehr Speicher belegst, heißt das noch lange nicht, dass in einen Überlauf rennen wirst.

Dein Problem hier ist die CreateText-Methode, die Du verwendest. Diese öffnet einen Stream, den Du nirgend schließt.
Hättest Du [Hinweis] Wie poste ich richtig? Punkt 1.1 befolgt und die MSDN benutzt, dann hättest Du das selbst gesehen.

Solangsam rutschen wir hier aber sehr in die Grundlagen-Geschichte....

== false ist mal wirklich übel!

Ist übrigens auf [Tipp] Anfängerfehler == true / == false bezogen;
meiner Ansicht nach aber ein völlig überbewerteter Hinweis, da a) eine solche Schreibweise der gewöhnlichen menschlichen Sprache näher kommt (jaja bla bla mathematische Logik...) und b) der Kompiler sowieso optimiert.
Aber das muss hier nicht behandelt werden.. und soll auch nicht!!

76 Beiträge seit 2008
vor 11 Jahren

Hallo,

ich platze ja ungern in die Programmier-Künste, um eine Festplatte am laufen zu halten, aber du solltest unter den Energieoptionen (erweitert) folgendes Fenster mit diesem Eintrag finden:

M
mkoehler Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Hab ich gemacht, werde ich morgen Abend etwas testen. Danke schonmal.

MfG Markus Köhler

Hinweis von herbivore vor 11 Jahren

Über weite Strecken fällt der Thread unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1. Bitte eigne dir die Grundlagen an und schau vor der Benutzung unbekannter Klassen in die MSDN Doku. Außerdem wurde alles wesentliche schon gesagt. Den Rest solltest du alleine hinbekommen. Lies im Zweifel den Thread nochmal komplett durch.

Thema geschlossen