Frage

Mein Problem ist:

Ich habe einen Perl-Skript, die vielen Speicher (wegen Caching erwarteten Verhaltens) verwendet. Aber, bemerkte ich, dass je mehr ich tun Caching, langsamer wird es, und der Prozess verbringt die meiste Zeit im Sleep-Modus.

Ich dachte, Speicher für den Prozess vor der Zuweisung kann die Leistung beschleunigen.

Hat jemand irgendwelche Ideen hier?

Aktualisieren :

Ich glaube, ich bin nicht ganz klar zu sein hier. Ich werde in Frage klarer so:

Ich bin nicht auf der Suche nach den Wegen innerhalb des Perl-Skript im Voraus zugeordnet. Ich denke nicht, dass ich hier viel helfen würde. Was mich interessiert, ist ein Weg, OS X zu sagen, wie viel Speicher für meine Perl-Skript zuzuweisen, damit es nicht später mit anderen Prozessen kommt in konkurrieren muss.

Nehmen wir an, ich mit der Speichernutzung weg kippen. Obwohl ich nach Möglichkeiten, davon zu reduzieren, aber nicht dort viel Verbesserung erwarten. FYI, ich bin auf einer solaris 10 Maschine arbeiten.

War es hilfreich?

Lösung

Was ich von Ihrem Posting und Kommentare gesammelt, ist dies:

  • Ihr Programm wird langsam, wenn die Speichernutzung steigt
  • Ihre pogram zunehmend verbringt Zeit mit Schlafen, nicht berechnet werden.

Am wahrscheinlichsten eplanation: Schlafmittel auf eine Ressource warten verfügbar werden. In diesem Fall ist die Ressource wahrscheinlich Speicher. Verwenden Sie den vmstat 1 Befehl zu überprüfen. Werfen Sie einen Blick auf die sr Spalte. Wenn es darüber hinaus ~ 150 geht konsequent ist das System auf freie Seiten verzweifelte Nachfrage zu befriedigen. Dies wird begleitet durch eine hohe Aktivität in der pi, po und fr Spalten.

Wenn dies tatsächlich der Fall ist, Ihre beste Wahl ist:

  • Upgrade Systemspeicher Nachfrage gerecht zu werden
  • Speicherverbrauch auf ein Niveau sachgemäßen für das System zur Hand reduzieren.

vorbelegen Speicher wird nicht helfen. In beiden Fällen wird Speicherbedarf den verfügbaren Hauptspeicher an einem gewissen Punkt nicht überschreiten. Der Kernel muss dann entscheiden, welche Seiten müssen jetzt im Speicher sein, und welche Seiten können für die weitere dringend benötigten Seiten gelöscht und wiederverwendet werden. Wenn alle regularily erforderlichen Seiten (der Arbeitssatz), um die Größe des Hauptspeichers überschreitet, wird das System ständig in Bewegung Seiten von und in den Sekundärspeicher (Swap). Das System wird gesagt, dann werden Dreschen und verbringt nicht viel Zeit nützliche Arbeit zu tun. Es gibt nichts, was Sie diese execept Speicher hinzufügen tun können, oder mit weniger davon.

Andere Tipps

Von einem Kommentar:

  

Die Speicherbeschränkungen sind nicht sehr schwer, aber der Speicherbedarf wächst leicht zu GBs und wenn wir Prozesse für Speicher konkurrieren, wird es sehr langsam. Ich möchte etwas Speicher von OS reservieren, so dass Dreschen minimal auch ist, wenn zu viele andere Prozesse kommen. Jagmal

Lassen Sie sich dann einen anderen Weg nehmen. Das Problem ist nicht wirklich mit Ihrem Perl-Skript im Besonderen. Stattdessen werden alle Prozesse auf der Maschine zu viel Arbeitsspeicher für die Maschine raubend wie konfiguriert zu behandeln.

Sie können „Reserve“ Gedächtnis, aber das wird Dreschen nicht verhindern. In der Tat könnte es das Problem noch schlimmer machen, weil das Betriebssystem nicht wissen, ob Sie den Speicher oder verwenden es für später speichern.

Ich vermute, Sie leiden die Tragik der Allmende . Bin ich richtig, dass viele andere Benutzer auf der Maschine handelt es sich? Wenn ja, ist dies eher ein soziales Problem als ein technisches Problem. Was Sie brauchen, ist jemand (vermutlich der Systemadministrator) in Schritt und alle Prozesse auf der Maschine zu koordinieren. Sie sollten die extravagantesten Speicherfresser finden und arbeiten mit ihren Programmierern die Kosten auf Systemressourcen zu reduzieren. Ferner sollten sie für Prozesse anzuordnen, so effizient, dass Ressource geplant werden Zuteilung ist. Schließlich müssen sie mehr oder verbesserte Hardware zu handhaben die erwartete Systemlast erhalten.

Einige Fragen, die Sie sich fragen:

  • sind meine Datenstrukturen für die Aufgabe in der Hand wirklich nützlich?
  • muss ich wirklich so viel cachen?
  • kann ich wegzuwerfen Daten nach einiger Zeit zwischengespeichert?
my @array;
$#array = 1_000_000; # pre-extend array to one million elements,
                     # http://perldoc.perl.org/perldata.html#Scalar-values

my %hash;
keys(%hash) = 8192; # pre-allocate hash buckets 
                    # (same documentation section)

Nicht mit Ihrem Code vertraut zu sein, werde ich einige wilde Spekulation hier wagen [grins], dass diese Techniken werden nicht neue große Effizienz zu Ihrem Skript zur Verfügung stellen, sondern dass die Vorabzuweisung könnte ein wenig helfen.

Viel Glück!

- Douglas Hunter

Ich entdeckte vor kurzem eine ausgezeichnete Randal L. Schwartz Artikel die vorherige Zuordnung enthält eine Anordnung. Unter der Annahme, das Ihr Problem ist, können Sie testen, mit einer Variation preallocating an diesem Code. Aber achten Sie darauf, das Ergebnis zu prüfen.

Der Grund, das Skript mit mehr Caching wird langsamer möglicherweise Dreschen sein. Vermutlich ist der Grund für das Caching in erster Linie ist die Leistung zu erhöhen. So eine schnelle Antwort ist:. Caching verringern

Jetzt kann es Möglichkeiten, Ihre Caching-Schema zu ändern, so dass es weniger Hauptspeicher verwendet und vermeidet Dreschen. Zum Beispiel könnten Sie, dass Caching in einer Datei oder Datenbank statt in den Speicher finden kann die Leistung steigern. Ich habe festgestellt, dass Dateisystem und Datenbank-Caching effizienter als Anwendung Caching sein können und unter mehreren Instanzen gemeinsam genutzt werden.

könnte eine andere Idee, Ihren Algorithmus zu ändern, die Speichernutzung in anderen Bereichen zu reduzieren. Zum Beispiel, statt eine ganze Datei in dem Speicher ziehen, neigen Perl-Programme durch die Linie besser Leselinie zu arbeiten.

Schließlich haben Sie erforscht der Memoize Modul ? Es ist vielleicht nicht sofort anwendbar sein, aber es könnte eine Quelle von Ideen.

Ich kann nicht einen Weg finden, dies noch zu tun.

Aber ich fand heraus, dass (siehe diese für weitere Details)

  

Speicher zu Lexikale zugewiesen (d   meine () Variablen) kann nicht zurückgewonnen werden oder   wiederverwendet, auch wenn sie außerhalb des Gültigkeitsbereichs gehen.   Es wird bei den Variablen reserviert   kommen wieder in Umfang. Speicher zugewiesen   zu können globale Variablen wiederverwendet werden   (In Ihrem Programm) unter Verwendung von   undef () ing und / oder löschen ().

Also, ich glaube, hier eine Möglichkeit zu prüfen sein könnte, wenn ich den gesamten Speicherdruck von lexikalischen Variablen zu einem bestimmten Zeitpunkt reduzieren.

Es klingt wie Sie suchen Grenze oder ulimit . Aber ich vermute, das wird ein Skript verursachen, die über die Grenze geht, zu versagen, was wahrscheinlich nicht das, was Sie wollen.

Eine bessere Idee könnte sein, im Cache gespeicherten Daten zwischen Prozessen zu teilen. Putting Daten in einer Datenbank oder in einer Datei funktioniert gut in meiner Erfahrung.

Ich hasse es zu sagen, aber wenn Ihre Speicherbeschränkungen dieses schwerwiegend sind, Perl ist wahrscheinlich nicht die richtige Sprache für diese Anwendung. C wäre eine bessere Wahl, würde ich denken.

Eine Sache, die Sie tun können, ist solaris Zonen zu verwenden (Container).
Sie könnten Ihren Prozess in einer Zone gesetzt und es Ressourcen wie RAM und CPU zuweisen.
Hier sind zwei Links zu einigen Tutorials:

  1. How To Guide
  2. Zone Resource Control in Solaris 10 08/07 OS

Während es nicht Vorbelegen wie Sie gefragt, dass Sie auch an den großen Seitengröße Optionen aussehen wollen, so dass, wenn perl das O für mehr Speicher für Ihr Programm fragen hat, wird es in größere Brocken.

Siehe Solaris Internals: Mehrere Seitengröße Unterstützung für weitere Informationen über die Unterschied das macht und wie es zu tun.

Lesen Sie http://metacpan.org/pod/Devel::Size

Sie können auch eine C-Funktion inline die oben zu tun.

Soweit ich weiß, kann man nicht Speicher direkt von Perl zuordnen. Sie können dieses Problem umgehen, indem sie eine XS-Modul zu schreiben, oder unter Verwendung einer Inline-C-Funktion, wie ich erwähnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top