Website Performance

  • Guten Tag liebes Forum,



    zur Zeit schreibe ich an meiner Bachelorarbeit, das Thema lautet:



    Wie der Titel schon verlauten lässt, ist Teil meiner Bachelorarbeit die Entwicklung einer Website. (Das Netzwerk ist bereits fertig entwickelt) Die Website soll einem Nutzer verschiedene Messwerte (r. Luftfeuchtigkeit, Temperatur, Luftdruck und Akkustand) auf verschiedene Arten in einem Dashboard wiedergeben. Das Dashboard ist recht aufwändig mit Gauges, Tabellen und Graphen gestaltet. Sobald der User einen Input verändert, werden serverseitig -also auf dem Raspberry Pi- einige Prozesse verarbeitet. ( Userinputs, Datenbank-Querys etc.) Nach der Verarbeitung wird vom Server ein JSON object via AJAX gesendet.

    Da dies meine Bachelorarbeit ist, muss ich mich wohl auch mit den unangenehmen Dingen wie Perfomance und Sicherheit beschäftigen. Nun meine Frage: Wie evaluiere ich die Sicherheitsaspekte oder verbessere sie (Stichwort: DDOS, SQL-Injections, Firewall, Schutz gegen hacking des Webservers, etc.)? Wie evaluiere ich die Performance (Maximale Aufrufe der Website zur gleichen Zeit, Überlastung des Servers bzw. RPi, etc.)? Gibt es da feste Richtlinien und Normen?
    Freundliche Grüße
    Twinzy

    Edited once, last by Twinzy ().

  • Hallo Twinzy,
    Mit den Themen SQL-Injection, Firewall und Hacking des Webservers sehe ich überhaupt keinen Zusammenhang, das ist Aufgabe eines Netzwerkadministrators, bzw. SQL-Injections Sache des Webseitenerstellers (Bei sauberer Implementierung mit prepared Statements sollte das z.B. "unmöglich" sein).


    Einzig DDOS, wobei dies höchstens für die verwendeten Protokolle (SWAP und MQTT) interessant ist. Das ein RaspberryPi nicht ausreichend Rechenpower besitzt, um eine DDOS-Attacke abzuwehren würde ich mal als hardwarebedingt hinnehmen (Beweise habe ich für diese Behauptung nicht, wüsste aber nicht, wie ein Pi sich gegen das fluten des Netzwerkes mit sinnlosem Traffic wehren soll, er hat ja nur ne 100MBit Schnittstelle).


    Gruß
    Chris

  • Danke für die schnelle Antwort.


    Ich bin sowohl Netzwerkadministrator als auch Webseitenersteller (oder meinst du den Hoster der Domain?).


    SQL-Injections wird es auch nicht geben, habe bereits prepare und execute Statements eingebaut. Wie genau kann ich mich denn davor schützen, dass der Server nicht gehackt wird?


    DDOS über SWAP oder MQTT habe ich bisher nicht gehört, habe eher Angst dass die Website überflutet wird. SWAP und MQTT nutze ich nur für die Kommunikation im 868MHz Band mit meinen Sensorknoten (Das ist der andere Teil meiner Arbeit)... Wie genau kann ich denn feststellen, wie viele Nutzer auf die Website können, ohne dass das RPi abschmiert? Gibt es womöglich Tools, die das erfassen können, indem sie den Server bis zur Grenze auslasten und ihn in gewisser Weise bewerten?


    Ich habe absolut wenig Ahnung von Sicherheitsaspekten und Performance brauche allerdings ein paar nette Zahlen für die BA, um auch zu evaluieren, ob das Pi für diesen Dienst geeignet ist.

    Edited once, last by Twinzy ().

  • Also ich sehe nicht das Sicherheit des webservers bei einem Netzwerkadministrator liegt. Der Webserver ist ein paar Layer über dem wo der Nettwerkadmin rum spielt. Der kann auch gar nicht alles wissen um jeden Webserver zukennen und abzusichern. Sprich Updates usw.

  • Linus mit hacken meine ich ungewollten Zugriff mit böser Absicht.


    Allerdings bezog sich meine Frage nicht nur auf Sicherheitsaspekte eines Webservers, sondern auch die Leistungsfähigkeit des Servers und wie ich diese testen kann. Für meine Bachelorarbeit möchte ich gerne evaluieren, ob das RPi, für den Webdienst den ich eingerichtet habe, geeignet ist.


    etwas *Offtopic*: Das Pi steht 24/7 in Kommunikation mit 12 Funksensorknoten, von dem jeder alle 5 min 4 Nachrichten schickt. Diese Nachrichten werden über den Mosquitto Broker an eine SQLite Datenbank weitergegeben.
    Die Problematik: Wird die Datenbank geöffnet, um neue Messwerte rein zu schreiben, ist die Datenbank "gelocked" und serverseitige SQL-Abfragen können nicht ausgeführt. Das ist auf gewisse Weise auch eine Perfomanceschwäche oder? Gibt es Möglichkeiten das zu umgehen?

    • Official Post


    Die Problematik: Wird die Datenbank geöffnet, um neue Messwerte rein zu schreiben, ist die Datenbank "gelocked" und serverseitige SQL-Abfragen können nicht ausgeführt.


    Ich kenne SQLite nur vom Namen her, aber wenn SQLite das wirklich macht, kann man doch gleich in eine Textdatei schreiben? :-/:denker:



    Gibt es Möglichkeiten das zu umgehen?


    Hmm... Du könntest eine Datenbank benutzen z.B. MySQL.

  • Wie sieht denn deine Datenstrucktur aus?
    Jetzt auf MySQL auf dem PI wechseln ist wieder ein Performanceverlust. Die braucht ja schließlich auch wieder RAM usw.
    Wie zeitnah müssten die User die Daten sehen?
    Du könntest zum schreiben einfach das gleiche File benutzen und regelmäßig kopieren für die lesenden Zugriffe. Um die Zeit zu überbrücken die beim kopieren gebraucht wird könntest du mit 2 Files arbeiten zum lesen. Nach dem kopieren wird einfach nur auf die zuletzt kopierte neu gelingt. Das ganze ist zwar jetzt nicht so 100% sauber aber du umgehst das lock der DB.
    Alternativ mit 2 files arbeiten und wenn die erste wegen Schreiben gelockt ist wird aus der 2. gelesen. Sobald der lock weg ist, du weißt ja das ein insert gemacht wurde machst du ein Copy zum 2. File damit es fürs nächste Write lock als Fallback Daten bereit hält.
    Automatisch zusammengefügt:[hr]



    Sqlite benutzt den fsync() system call um die Daten direkt auf die Platte zu schreiben. Das funktioniert aber nicht immer zuverlässig.
    Zu beachten ist, das das Laufwerk nicht ein IDE Device ist und falls ext3 FS Barrier=1 als Mount Option gesetzt ist.


    Des weiteren schreibt fsync das Listing des Directories in dem sich das DB File befindet für das Journal auf die Disk. Wird während dessen der Directory verändert führt es auch zu inkonsequenten Daten, da man dann ein Hot Journal hat.


    Alles nicht sehr gut gelöst.

  • Danke ruedigerp für die informative Antwort, habe auch schon an ähnliches gedacht...


    Der gesamte Prozess, Empfangen, Übergabe von Broker an DB und das updaten dauert etwa 0,5 sec, ist also nicht ganz so wild. Probleme gibt's nur, wenn alle zwölf Nodes zufällig zur selben Zeit senden, die Nachrichten werden zwar übermittelt (Dank FHSS), aber die Datenbank bleibt dann knapp 4-6s gelocked. Das bedeutet für den Websiteclient, dass er während dieser Zeitspanne keine neuen Daten empfangen kann.


    Werde mir morgen nochmal genauer https://sqlite.org/lockingv3.html ansehen, habs gerade nur überflogen, aber sieht so aus wie dem wonach ich Suche. :D


  • Das bedeutet für den Websiteclient, dass er während dieser Zeitspanne keine neuen Daten empfangen kann.


    So lange der Code das abfängt ist ja alles ok.
    Man kann ja sehen bzw abfragen ob ein Lock gerade das Lesen verhindert. Da du mit Ajax arbeitest kannst du ein Loading Gif ausgeben oder einen netten Hinweis "Senor Daten werden aktuell gespeichert. Einen kleinen Moment bitte". Danach kurz ein paar Sekunden warten und den request noch einmal absetzen.
    Die gewünschten Daten kommen und der User weiß wenigstens das etwas passiert. Win-Win ;)

  • Hallo,


    Quote

    Wird die Datenbank geöffnet, um neue Messwerte rein zu schreiben, ist die Datenbank "gelocked" und serverseitige SQL-Abfragen können nicht ausgeführt.

    .
    Nope. Das Locking bezieht sich bei SQLite aus das _Schreiben_ und es kann in der Tat in ein Schreibvorgang gleichzeitig erfolgen. Paralleles lesen geht. Wenn du nur alle paar Minuten ein paar Werte schreibst ist das überhaupt kein Thema. Das Thema und die damit verbundene Performance wird erst interessant, wenn du etliche Schreibvorgänge pro Sekunde hast.


    Zur Ausgangsfrage:
    > Da dies meine Bachelorarbeit ist, muss ich mich wohl auch mit den unangenehmen Dingen wie Perfomance und Sicherheit beschäftigen


    Wenn ich das richtig verstehe, beschäftigst du dich primär mit dem Frontend und hast das Backend nicht selber geschrieben? Dann sind SQL-Injections kein Thema für dich, die sind nur bei schlecht oder falsch programmierten Backend möglich. "Hacking" ist kein Thema, weil das vom Setup des Pi (z.B. SSH Zugang per Passwort mit schwachem Passwort) abhängt. Performance ist in erster Linie ein Backend-Thema, weil von der Effizienz des Backends (also wie schnell erfolgt die Datenverarbeitung serverseitig, wie schnell antwortet die DB auf Anfragen) abhängig und auch die Art des Servers, welcher da läuft, eine Rolle spielt. eS gibt ja genug Webserver, die 1000 Request und mehr pro Sekunde verarbeiten können. Wobei das wohl auf dem Pi aufgrund der eher schwachbrüstigen Hardware eh# nicht funktionieren würde.


    Außerdem ist es "nur" eine Bachelorarbeit, d.h. dein Zeitfenster ist nicht so groß, oder? Vielleicht solltest du das noch mal mit deinen Betreuern klären.


    Gruß, noisefloor