Schreibzyklus SD Karte mit Datenbank und Sensor

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo zusammen,


    anscheinend bin ich zu blöd, um zu verstehen was Schreibzyklen bei einer SD Karte bedeuten. Deshalb mal hier meine Frage bzw. Anliegen.


    Ist ein Schreibzyklus sobald irgendetwas auf die SD karte geschrieben wird oder einmal die SD Karte komplett voll schreiben?


    Meine Situation:


    Ich habe einen Raspberry 3 B+ (Raspbian Buster) inkl. 7" Touch-Display mit einer ScanDisk ultra 32GB in betrieb. Es besteht keine Internetverbindung. Ein Sensor ist mit der GPIO Anschlussleiste verbunden.

    Folgendes wurde installiert:

    • log2ram
    • Apache
    • PHP
    • Datenbank MySQL (MariaDB)
    • phpMyAdmin


    Der Raspberry wird im Kiosk Modus gestartet und zeigt eine php Seite. Auf dieser Seite werden 3 Werte angezeigt.

    1. Temperatur vom Raspberry (z.B. 50.1°)

    2. Auswertung Sensor (z.B. 1468)

    3. Uhrzeit (z.B. 14:30)


    Sobald der Sensor anspricht (ca. alle 25 Sekunden), also der GPIO ein 3,3V Signal bekommt, wird mit einem Python Script in die Datenbank dieser Wert gespeichert inkl. der Temperatur und Uhrzeit. Wobei die "alten" Werte überschrieben werden. In der Datenbank Tabelle ist also nur ein Eintrag (eine Zeile) vorhanden.


    Findet jetzt alle 25 Sekunden ein Schreibzyklus statt?

    Wenn ja, dann wären das am Tag 3.456 Schreibzyklen. Wenn man von ca. 100.000 Schreibzyklen pro SD Karte ausgeht, dann hält diese nur ca. 29 Tage (100.000/3456). Verstehe ich das richtig?

    Mich wundert das, denn es werden ja "nur" 3 Werte überschrieben, kein Vergleich zu einem Foto oder Video. Die Datenbank Tabelle hat eine Größe von 2kb, diese wird auch nicht größer, da die Werte ja überschrieben werden.


    Vielen Dank für Eure Hilfe. :saint:


    Gruß

    Tamia

  • Hallo tamiasunchild,


    unter einem Schreibzyklus versteht man bei Datenträgern, wie oft die identische Speicherzelle beschrieben werden darf, bevor diese Zelle ausfällt. Beim Schreiben wird die Speicherzelle einer Spannung ausgesetzt, wobei immer ein paar nm der informationstragenden Schicht abgetragen wird. Irgendwann ist die Schicht nicht mehr verwendbar. (Mal ganz laienhaft - aber hoffentlich verständlich - ausgedrückt.


    Bei SD-Karten gibt bzw. gab es mal Vorstellungen, dass diese Speicherzyklen irgendwo zwischen 10.000 und 100.000 liegen sollten. Das mit den 10.000 ist wohl schon sehr lange her.


    Der Kauf einer SD-Karte ist Vertrauenssache - es gab ja schon Berichte, dass nach wenigen Formatierungen auf einer SD-Karte nichts mehr ging. (Auch Formatierungen zählen zu den Schreibzyklen - uns das für jede Speicherzelle!)


    Daher solltest Du bei der Wahl der SD-Kartengröße immer berücksichtigen:

    • welche Datenmengen kommen regelmäßig dazu.
    • werden Daten oder Log-Dateien auch mal wieder zyklisch gelöscht


    Ein gutes Betriebssystem sorgt dafür, dass alle zur Verfügung stehenden Speicherzellen gleichermaßen belastet werden.

    Eine Speicherzelle, die einmal beschrieben wird und nicht regelmäßig überschrieben wird, hält "ewig".


    Eine SD-Karte, die du immer fast vollkommen voll geschrieben hast und immer wieder die gleichen neuen Daten überschrieben werden, wird eher den Geist aufgeben, als eine extrem große ohne nennenswerte Datenbewegungen. Beispiel: Programmierung direkt auf einer fast vollen SD-Karte...



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,


    vielen Dank für die schnelle und ausführliche Erklärung.

    Wie schätzt Du das in meinem Beispiel ein, belastet das die SD Karte sehr?


    df -h

    cat /sys/fs/ext4/mmcblk0p2/lifetime_write_kbytes bringt folgendes:

    Ein gutes Betriebssystem sorgt dafür, dass alle zur Verfügung stehenden Speicherzellen gleichermaßen belastet werden.

    Eine Speicherzelle, die einmal beschrieben wird und nicht regelmäßig überschrieben wird, hält "ewig".

    Was kann ich da in meinem Fall machen, dass sie Speicherzellen gleichmäßig belastet werden und nicht regelmäßig überschrieben werden?


    Eine SD-Karte, die du immer fast vollkommen voll geschrieben hast und immer wieder die gleichen neuen Daten überschrieben werden, wird eher den Geist aufgeben, als eine extrem große ohne nennenswerte Datenbewegungen. Beispiel: Programmierung direkt auf einer fast vollen SD-Karte...

    Meine SD ist noch ziemlich leer, wird auch so bleiben da eben nur die 3 Werte jeweils überschrieben werden.

    Kann man das jetzt als große Datenbewegungen nennen oder eher nicht?


    Gruß

    Tamia

  • Was kann ich da in meinem Fall machen, dass sie Speicherzellen gleichmäßig belastet werden und nicht regelmäßig überschrieben werden?

    Normalerweise kümmerst sich ein vorhandener Algorithmus der SD Karte darum. Meistens weiss man das aber nicht.

    Kann man das jetzt als große Datenbewegungen nennen oder eher nicht?

    Das würde ich als vernachlässigbar bezeichnen.

  • wird mit einem Python Script in die Datenbank dieser Wert gespeichert inkl. der Temperatur und Uhrzeit. Wobei die "alten" Werte überschrieben werden. In der Datenbank Tabelle ist also nur ein Eintrag (eine Zeile) vorhanden.

    Warum eine Datenbank, wenn diese nur eine Zeile Daten vorliegen?

    Wenn du das in eine Datei schreibst, kann das System das besser "wearleveln", bei einer Datenbank könnte es sein, dass das System die Schreibzugriffe nicht so gut über die Speicherzellen verteilen kann.

    Computer ..... grrrrrr

  • Warum eine Datenbank, wenn diese nur eine Zeile Daten vorliegen?

    Weil ich im internen Netzwerk bei anderen PC´s auch den Sensor Wert anzeigen lasse, bzw. die Möglichkeit dazu habe.

    Dies mache ich so:

    Es finden somit auch Lesezugriffe auf die SD Karte am Raspberry statt. Da ich aber gelesen habe, dass diese nicht relevant sind habe ich dies nicht erwähnt.


    Gruß

    Tamia

  • Hallo Tamia,


    in dem Fall hätte ich die Daten über temporäre Speicher bereitgestellt. Dann hast du überhaupt keinen schreibenden Zugriff auf die SD-Karte. Und Deine Bedenken haben sich erledigt.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Tamia,


    schau mal hier.


    Du hast nichts zum Sensor geschrieben. Die gängigen Temperatur-Sensoren DS18B20 schreiben ihre Werte in ein virtuelles Dateisystem (also nicht auf die SD-Karte). Somit kann jedes andere Programm die Daten auch dort abholen.


    Ein gutes Stichwort ist z.B. RAM-Disk (die es auch für den Raspberry Pi gibt)

    Oder auch FIFO-Dateien (named pipes).


    Oder Du lässt es, wie es ist - denn bei dem geringen Datenaufkommen wird die SD-Karte so schnell nicht ihr Lebensende erreichen.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,


    danke für den Link. Du kennst Dich wohl sehr gut mit dem Raspberry und programmieren aus. :thumbup:


    "Mein" Sensor ist in einer Anlage in unserem Betrieb verbaut. Das ist ein ganz normaler Festo Näherungsschalter der mit 24V läuft.

    Dieses Signal greife ich ab und gebe es in ein Relais. Jedes Mal wenn der Sensor an ist, schaltet das Relais.

    Vom Raspberry geht von einem 3.3V GPIO ein Kabel in das Relais. Vom Relais weg geht wiederum ein Kabel zu einem GPIO im Raspberry, wenn dann das Signal kommt, wird eben mit einem Python Skript in die Datenbank geschrieben.

    Das ganze eben darum, weil ich nicht mit 24V auf die GPIOS schalten sollte. ;)


    Ich hoffe das ist Verständlich erklärt, ist eigentlich ganz einfach.


    Oder Du lässt es, wie es ist - denn bei dem geringen Datenaufkommen wird die SD-Karte so schnell nicht ihr Lebensende erreichen.

    Wahrscheinlich versuche ich es mal so. Hätte kein Problem die SD Karte einmal im Jahr auszutauschen und 1 Jahr sollte es hoffentlich halten.


    Man kann ja den Raspberry auch über das Netzwerk booten. Das wäre auch noch eine Lösung, aber das habe ich nicht nicht ganz verstanden. Vor allem weil es einige Raspberry´s sind. Wenn ich das mal in Angriff nehmen sollte und Hilfe benötige, weiß ich ja in welchen Forum man Hilfe bekommt. :)


    Gruß

    Tamia

  • Sobald der Sensor anspricht (ca. alle 25 Sekunden), also der GPIO ein 3,3V Signal bekommt, wird mit einem Python Script in die Datenbank dieser Wert gespeichert inkl. der Temperatur und Uhrzeit. Wobei die "alten" Werte überschrieben werden. In der Datenbank Tabelle ist also nur ein Eintrag (eine Zeile) vorhanden.


    Findet jetzt alle 25 Sekunden ein Schreibzyklus statt?

    Ich weiß nicut, wie Python das macht, aber ich denke, dass zunächst immer in irgendeinen Puffer des Block Device Treibers geschrieben wird, sofern das Programm nicht immer gleich ein "sync" hinterherschickt, oder die Datenbank explizit öffnet, schreibt und wieder schließt.

  • Man könnte die Datenbank in /tmp erstellen. Das ist die RAM-Disk (tmpfs) und es wird nur auf die SD-Karte geschrieben, wenn kein RAM mehr vorhanden ist. Da die DB nicht wächst, sondern ein Wert nur überschieben wird, ändert sich die Größe zur Laufzeit kaum. Wenn man den RPi dann neu startet, ist die Datenbank weg. So kann man das Schreiben auf die SD-Karte minimieren.


    Das kann man natürlich nur machen, wenn man die alten Messwerte nicht mehr benötigt.