Linux SWAP-Datei läuft über
Thomas
- perl
0 Thomas0 Christian Seiler0 fastix
Moin zusammen,
ein riesen Problem verfolgt mich seit einigen Wochen.
Vor langer Zeit habe ich viele viele Perl-Skripte geschrieben, die recht komplex über ASCII-Dateien eine "Datenbank" realisieren. Auf der damaligen Maschine (LINUX-RedHat, 233er RISK, 64MB Arbeitsspeicher) lief es dann viele Monate lang gut. Jetzt habe ich die komplette Präsentation auf einen anderen Rechner portiert (LINUX-RedHat, DUAL-Prozessor, 1GB(!) Arbeitsspeicher) und es funktioniert mehr schlecht als recht.
Regelmässig wird irgend ein Prozess nicht vernünftig beendet und schreibt den Speicher und(!) die SWAP-Datei komplett voll und belastet die CPU mit 100%.
In den bis jetzt entlarften Skripten wird meist nur eine Datei geöffnet, jede Zeile als Variable aufgenommen, diese auf verschiedene Art und Weisen bearbeitet und am Ende wieder geschrieben. Mal direkt überschrieben, mal mit einer Tmp-Datei mit umbenennen. Beides macht diesen Fehler. Die Files sind max. ca. 200kB gross.
Nach besten Wissen und Gewissen habe ich versucht bei Schreib- oder Lesefehlern per "die" den Prozess zu stoppen. Jede geöffnete Datei wird per "flock,2" gesperrt. Es werden max. 2-4 Dateien gleichseitig geöffnet. Manchmal warten die Skripte auf eine Freigabe der Datei und versuchen es mehrfach, aber max. 10x sonst "die". Der Verdacht, dass es sich um Datei-Rechte-Problem handelt, hat sich auch nicht bestätigt. Die Zugriffe sind nicht so hoch, das ich annehmen muss, das zuviele Dateien geöffnet werden. Laut allen Dokus, die ich bisher fand, braucht(kann) man bei Perl keine Arbeitsspeicherfreigabe(?) realisieren.
Nun steigt mir der Provider langsam aufs Dach, weil der Shared-Server deshalb recht oft steht und neu gestartet werden muss.
Das ist mein Problem in Kürze. Sonst würde ich morgen noch schreiben. Vielleicht hat jemand einen Tip, in welche Richtung ich weiter forschen kann. Oder einen netten Link, in dem ein ähnliches Problem beschrieben wird. Wenn Ihr noch Fragen habt? Bitte! Ich stehe wirklich vor einem Rätsel!!
Gruss
Thomas
Ein Schnippsel aus einer Doku:
<schnipp> ...
Etwas wie
if (-e $file)
{
open(FH,"<$file") or die $!;
}
ist praktisch immer ein Programmierfehler. Hier werden zwei Dinge nacheinander getan, die gleichzeitig getan werden müssen.
... <schnapp>
Kann sowas zu dem Überlauf führen? Kommt der Interpreter damit nicht zurecht?
Wäre vielleicht ein kleiner Hinweis für die Experten.
Thomas
Hallo Thomas,
Das ist mein Problem in Kürze. Sonst würde ich morgen noch schreiben. Vielleicht hat jemand einen Tip, in welche Richtung ich weiter forschen kann. Oder einen netten Link, in dem ein ähnliches Problem beschrieben wird. Wenn Ihr noch Fragen habt? Bitte! Ich stehe wirklich vor einem Rätsel!!
Hast Du schon mal versucht, das ganze zu »profilen«? Ich meine, jedes Programm verbraucht ja Resourcen: Speicher, Zeit, CPU, etc. Du solltest erst einmal Deine Prozesse identifizieren, die so viel Speicher brauchen. (z.B. mit ps oder top) Dann gehst Du in dieses Programm und baust regelmäßige Statusausgaben ein - wieviel Speicher es im Moment belegt und was gerade passiert ist. Dann lässt Du das Programm einige Zeit laufen und schaust dann aus dem Protokoll, wo genau am meisten Speicher verbraten wird. Diese Stelle im Code solltest Du Dir dann mal genauer anschauen.
Grüße,
Christian
http://www.lackas.net/imp/ma/imperia-users/200203/BGlq4eiF1FCkhhFh.html
Vielleicht hat Dein Provider eine Perl- Version mit einem Speicherleck.
Im Link oben steht was dazu, scheint besonders dann der Fall zu sein, wenn Perl als Modul läuft.
Was helfen könnte:
Auf jeden Fall ist es des Providers Job...
fastix