Michael Schröpl: times(): Was genau bedeuten "system time" und "user time"?

Hallo Leute,

die Perl-Funktion "times()" liefert ein Viertupel an Zeitangaben zurück, nämlich User Time und System Time, beides noch einmal unterteilt in Zeitangaben für den laufenden Task und für die Summe aller seiner Children.
Das Such-Skript des hiesigen Forum-Archivs gibt bei der Ergebnisanzeige zwei Zeit-Werte aus, nämlich die Summe aus $user+$cuser und die Summe aus $system+$csystem.

Experimente haben gezeigt, daß die User-Zeitkomponente reproduzierbar ist und vom verarbeiteten Datenvolumen ziemlich direkt abhängt. Die System-Komponente hingegen ist nicht reproduzierbar und streut ziemlich willkürlich.
Derzeit ist die User-Komponente signifikant größer als die System-Komponente, d. h. eine Verbesserung im Suchverfahren würde sich tatsächlich in einer spürbar kürzeren Suchdauer bemerkbar machen.

Könnte mir vielleicht jemand Anhaltspunkte geben, damit ich verstehen kann, wie man möglicherweise auch system time bei der Archivsuche sparen kann?
(Oder ist dies vielleicht nicht gezielt möglich?)

  1. Hallo Michael,

    das haben sich wahrscheinlich schon viele gefragt, die die Forumsarchivsuche benutzt haben. Und ich dachte immer du bist der einzige der das beantworten koennte ;-)

    Ich kann es leider auch nicht beantworten. Ich hab es mir immer so vorgestellt, dass system time die verbrauchte Prozessorzeit ist, waehrend user time die absolute Laufzeit des Prozesses ist. Aber das ist nur Spekulation ;-)

    viele Gruesse
      Stefan Muenz

    1. Ich kann es leider auch nicht beantworten. Ich hab es mir immer so vorgestellt, dass system time die verbrauchte Prozessorzeit ist, waehrend user time die absolute Laufzeit des Prozesses ist. Aber das ist nur Spekulation ;-)

      ... welche ich aber schnell zu wiederlegen können glaube.

      Ich habe während meiner Tests das alte und das neue Skript auf derselben Maschine teilweise einzeln und teilweise parallel laufen lassen, einmal sogar mit massiver zusätzlicher Hintergrundlast.
      Die user time hat sich dabei *nicht* geändert - also ist das die CPU-Zeit, welche das Perl-Skript braucht, den Index zu lesen und die Treffer zu berechnen. (Die Ausgabe von HTML "stoppe" ich nicht mehr mit, weil ich die Zeit ja "ganz oben" im Trefferdokument einblenden will.) Insbesondere ist die user time reproduzierbar.

      Was sich ständig ändert, das ist die system time. Ich vermute, daß hierzu alles gehört, was das Skript an Verwaltungsarbeit im Betriebssystem auslöst.
      Da wären zu nennen: 1. Abwicklung von Festplattenzugriffen für Dateiverarbeitung und Swapping (das würde beispielsweise eine Streuung erklären, wenn die Seiten teilweise schon im Cache liegen und teilweise nicht), 2. Taskwechsel usw.
      Auf einem guten alten Host gab es für solche Aktionen sogar unterschiedliche Prozessorzustände (mit unterschiedlichen Unterbrechungsmasken), und für diese wurde die CPU-Zeit separate abgerechnet. Sinn der Sache war es, messen zu können, welcher Anteil der Realzeit für die Infrastruktur des Betriebssystems geopfert werden muß - wenn die system time ansteigt, dann sind normalerweise irgendwelche Ressourcen überlastet (z. B. nicht genug Hauptspeicher und deshalb zuviel Swapping).

      Auch UNIX mißt seine Zeiten irgendwie in einer ähnlichen Weise. Ich würde raten, daß die system time diejenige ist, welche von den kernel-Prozessen belegt wird - ich habe aber nie einen UNIX-Kernel von innen gesehen und deshalb kein Gefühl, was alles hierzu gehören könnte.

      Dieselbe Trennung in user und system time liefert times() in Active Perl 5 auch für Windows. Hier ist mein Wissen über "Systemprozesse" (mit dem Taskmanager von NT4 sieht man ja einige) noch viel diffuser.

      Für die Beantwortung meiner Frage bräuchte man also wahrscheinlich detaillierte Kenntnisse über den Aufbau der entsprechenden Betriebssystemkerne - und die habe ich leider nicht. Deshalb ja mein Posting: Hat die jemand?