Stefan Priebe: Perl Scripte ausführen, .. aber verhindern, dass diese 100% CPU-Last bekommen ?!

Hallo!

Ich habe folgendes Problem, ... ich habe auf meinem Server einige Scripte, . .die ganz oder fast 100% CPU-Last bekommen, .. wenn diese laufen, .. dass Problem ist dann nur, dass man nicht mehr auf den Server kommt bis das Script fertig ist! Gibt es da unter Suse Linux oder Perl eine Möglichkeit dies zu verhindern ?

Stefan

  1. Hallo Stefan,

    es gibt das Programm nice, das die Prioritäten einzelner Programme auch zur Laufzeit ändert.
    Die Meßlatte geht von -20 (höchste Priorität) bis 19 (niedrigste Priorität)
    Gestartet werden Programme per Default mit Priorität +10, also lohnen sich erst Änderungen ab diesem Punkt.
    Negative Werte darf nur der Superuser (root) einem Programmm verpassen.

    Alternativ, wenn Du selber Superuserrechte hast, wäre es noch möglich aber nicht sehr einfach, im Kernel selber etwas rumzuschrauben.
      
    so short

    CZ

    1. Die Meßlatte geht von -20 (höchste Priorität) bis 19 (niedrigste Priorität)
      Gestartet werden Programme per Default mit Priorität +10, also lohnen sich erst Änderungen ab diesem Punkt.
      Negative Werte darf nur der Superuser (root) einem Programmm verpassen.

      Alternativ, wenn Du selber Superuserrechte hast, wäre es noch >möglich aber nicht sehr einfach, im Kernel selber etwas >rumzuschrauben.

      naja, .. ich suche eiegntlich mehr soetwas wie:
      bei jedem Perl-Script das ausgeführt wird darf die CPU-Last für dieses Script maximal auf 80% gehen! Da ja auch andere User soclhe Scirpt auasführen können, .. und denen kann ich schlecht sagen packt mal überall nice rein oder so!

      Stefan

      1. Hallo Stefan,

        naja, .. ich suche eiegntlich mehr soetwas wie:
        bei jedem Perl-Script das ausgeführt wird darf die CPU-Last für dieses Script maximal auf 80% gehen! Da ja auch andere User soclhe Scirpt auasführen können, .. und denen kann ich schlecht sagen packt mal überall nice rein oder so!

        Dann mach es doch selber! Das mit dem nice meine ich. Dem User generell nur eine Priorität von z.B. +16 zu geben.
        Evt über einen Wrapper, der alle Userlandprogramme (oder in Deinem Falle Perlscripte) einfach prinzipiell mit nice +15 startet.

        Hint: /usr/bin/perl ist meist nur ein Link auf die aktuelle Perlversion.

        Ganz speziell, wie Du es willst geht es nur im Kernel.
        Bereits eingerichtet ist die Möglichkeit die CPU Zeit zu begrenzen, das dürfte das einfachste und auch den Restam wenigsten belastende sein.
        Wenn Du nämlich die Prozessorlast begrenzen möchtest, mußt Du sie auch immer messen, diesen Overhead würde ich vermeiden.

        Weiteres vielleicht besser per PM, da etwas Off-Topic und zumindest ich möchte keinen auf den Sack kriegen ;-)))

        so short

        CZ

  2. Hallo!

    Ich habe folgendes Problem, ... ich habe auf meinem Server einige Scripte, . .die ganz oder fast 100% CPU-Last bekommen, .. wenn diese laufen, .. dass Problem ist dann nur, dass man nicht mehr auf den Server kommt bis das Script fertig ist! Gibt es da unter Suse Linux oder Perl eine Möglichkeit dies zu verhindern ?

    Ja, lern Programmieren!

    Peter

    1. Ja, lern Programmieren!

      Wie wäre es, wenn Du Deine scheinbar grandiose Programmierkunst zur Verfügung stelltest, um ihm beim Lernen zu helfen?

      Martin

      1. Wie wäre es, wenn Du Deine scheinbar grandiose Programmierkunst zur Verfügung stelltest, um ihm beim Lernen zu helfen?

        Meine Programmierkunst ist nicht nur scheinbar grandios. Bei einem konkreten Fall helfe ich natuerlich.

        Peter

    2. Ja, lern Programmieren!

      Du bist ja wohl nen ganz toller, was?

      Dann sag doch mal wie das geht! Denn für Dich scheint das ja eine Kleinigkeit zu sein,... großer Meister es tut mir leid das ich nicht auch so schlau bin wie du, aber vielleicht gibst Du mir ja nen Stück von deiner Intelligenz ab ?!

      Stefan

    3. Ja, lern Programmieren!

      So so, Du kommst also offenbar aus der Windows3.1-Welt, wo preemptives Multitasking noch ein Fremdwort war und sich ein Programm kooperativ verhalten musste, damit nicht die ganze Maschine steht.

      So long

      1. So so, Du kommst also offenbar aus der Windows3.1-Welt, wo preemptives Multitasking noch ein Fremdwort war und sich ein Programm kooperativ verhalten musste, damit nicht die ganze Maschine steht.

        Du wirst lachen: Geschickte Programmierung wirkt auf allen Systemen Wunder!

        Peter

  3. Hallo,

    Das Problem liegt weniger in der CPU Auslastung als bei der ausführungszeit. Wenn Du nun die Priorität des Prozesses, und nur über das kannst Du Dein Script weniger CPU geben, runterschraubst, dann hast Du zwar weniger CPU-Auslastung aber dafür läuft Dein Script auch länger. Was wiederum zur Folge hat, daß bei vielen Requests mehrere PRozesse länger laufen, diese in Summe die CPU noch mehr zunageln, alles noch länger wird und so weiter.

    Wenn Die scripte wirklich so lange brauchen, daß Du dich nicht mal mehr au fden server kommst, dann würde ich folgendes vorschlagen:

    1.) Script auf Optimierungspotential hin untersuchen. Das gibt's in der Regel immer.
    2.) Stärkere Maschine besorgen ;-)

    Ach ja, noch was, meinst Du mit 'dass man nicht mehr auf den Server kommt bis das Script fertig ist', daß keine weiteren Scripts mehr aufgerufen werden können?

    Wenndas der Fall ist, dann kannst Du ja auch am Webserver herumspielen, daß der mehr Requests gleichzeitig bedient. dann Teilt sich die Last von selbst.

    Grüße
      Klaus

    1. Wenn Die scripte wirklich so lange brauchen, daß Du dich nicht mal >mehr au fden server kommst, dann würde ich folgendes vorschlagen:
      1.) Script auf Optimierungspotential hin untersuchen. Das gibt's >in >der Regel immer.

      das Problem leigt daran, .. .dass es Logfiles von ca. 500Mb durchforstet, .. mit optimieren ist da nicht mehr viel, .. hab schon 5 Studnen lang herum probiert und Sekunden gemessen und so weiter.

      Ach ja, noch was, meinst Du mit 'dass man nicht mehr auf den Server >kommt bis das Script fertig ist', daß keine weiteren Scripts mehr >aufgerufen werden können?

      neh, .. Du schaffst es nicht mal mehr per SSH auf den Server zuzugreifen!

      Stefan

      1. Hallo,

        das Problem leigt daran, .. .dass es Logfiles von ca. 500Mb durchforstet, .. mit optimieren ist da nicht mehr viel, .. hab schon 5 Studnen lang herum probiert und Sekunden gemessen und so weiter.

        Das ist sicherlich ein Problem. Aber gerade hier ist auch Optimierung angesagt. Was, wenn Du versuchst, durch Vorarbeiten die Datenmenge zu reduzieren. Ich hab' jetzt zwar keine Ahnung, was beim durchforsten so geschieht, aber Du solltest wirklich versuchen, nicht immer 500MB durchzukramen. Vielleicht hilft es ja auch weiter, wenndas oft geschehen soll, daß Du den Log in eine Datenbank ablegst, um besser suchen zu können.

        Wie siehts mit der Speicherauslastung aus? Vielleicht ist die CPU-Last nur ein Teil des Problems.

        Und dann mußt Du Dir auch im Klaren sein, daß nicht jedes Problem eine einfache Lösung hat. Wenn 's um große Datenmenge geht, ist es zwar noch möglich, an der Hardware Verbesserungen herbeizuführen, wenn das dann auch nicht geht, dann ist ein Problem halt nicht lösbar. Irgendwo gibt es für alles eine Grenze.

        neh, .. Du schaffst es nicht mal mehr per SSH auf den Server zuzugreifen!

        Dann ist die Maschine aber ziemlich am Ende. Da hilft Dir ein bißchen CPU-Last-Herumgedrehe auch nichts mehr, befürchte ich.

        Das endet dann in endlosen Versuchen, die dann eben doch nur auf Mäusemelken hinauslaufen.

        Also entweder massiv bessere Hardware oder die permanent zu durchsuchende Datenmenge reduzieren.

        Grüße
          Klaus

      2. Hi,

        1.) Script auf Optimierungspotential hin untersuchen. Das gibt's >in >der Regel immer.
        das Problem leigt daran, .. .dass es Logfiles von ca. 500Mb durchforstet, .. mit optimieren ist da nicht mehr viel,

        Und ob. Insbesondere was Dein Datenmodell angeht. "divide et impera" meint der Informatiker in mir zu Deinem Szenario.

        Wie wäre es mit mehreren kleineren Protokolldateien?
        Veraltet Deine (vermutlich) statistische Information, wenn sich der Inhalt der durchsuchten Datei *nicht* mehr ändert? Wenn nicht, dann kannst Du das Ergebnis zu jeder Teil-Datei abspeichern und bei späteren Suchvorgängen nur noch zusammenfassen.
        Wirklich durchsuchen mußt Du dann nur noch diejenige Datei, die aktuell wächst.
        Das zyklische Zerhacken der Logs geht beispielsweise via cron (alle 10 Minuten: Größe des Logs abfragen, bei Überschreiten dem Verursacher ein Signal senden, daß er auf eine neue Protokolldatei umschalten soll, und *jetzt* die abgeteilte Datei einmalig verarbeiten und das Ergebnis abspeichern).

        mfG - Michael

    2. Hallo,

      hmm, ich würde dir auch empfehlen, deine Scripte mal ein wenig zu schmälern.

      Aber letztenendes wirst du auch nur glücklich mit einer ordentlichen Maschine.... wichtig ist, daß du für die User genügend Ram zur Verfügung hast, damit ausreichend Daten im Ram abgelegt werden können... merkt man z. B. P3-600 mit 64MB (NT4 + SQL7) = schleppend!
      P3-500 mit 256MB = ausreichend schnell... wenn du am Tag mehr als 5000 Sessions hast, egal ob Perl,PHP,ASP solltest du schon gute RAM Reserven haben

      .... obwohl mein AMD GHz-Athlon geht bei Microprose GP3 auch schon fast in die Knie und das trotz GeForce Karte. Monaco mit Zuschauern und qualmenden Reifen: CPU-Auslastung 235%.... na danke! ;-))

      Grüße, Frank