Roboter: PHP DNS Cache

Hallo,

ich schreibe gerade eine Applikation, die periodisch eine gewisse Anzahl von teilweise immer gleichen URIs aufrufen muss. Den Response-Content bekomme ich dann über die sehr komfortable Funktion PHP file_get_contents(), die als Argument für meinen Fall eine absolute Web-Adresse erwartet.

Nun dachte ich, dass ich mir die stetig wiederkehrende DNS-Auflösung doch eigentlich sparen könnte. Wie läuft das bei PHP? Gibt es einen DNS-Cache?  Im Netz konnte ich nichts finden, ich gehe davon aus: Nein. Nutzt PHP den lokalen DNS-Cache des Betriebsystems, wenn vorhanden? Wenn nein, was haltet ihr von der Entwicklung eines eigenen, eventuell DB-gestützten DNS-Cache hinsichtlich file_get_contents? Sollte man gleich selbst mit Sockets und DNS-Cache arbeiten, um Performance-Gewinne zu erzielen?

PHP's Curl cached ja, soweit ich das sehen kann.

Gibt es noch andere Teile einer HTTP-Transaktion, die man beschleunigen könnte? Response, Request, Connect liegt ja alles nicht in meiner Hand. Ich sehe da nichts mehr.

grüße
Roboter

  1. Hi,

    Nutzt PHP den lokalen DNS-Cache des Betriebsystems, wenn vorhanden?

    selbstverständlich, denn aus der Sicht des Betriebssystems ist PHP eine Anwendung wie jede andere auch, wie etwa ein Browser. PHP nutzt Betriebssystemfunktionen, um auf Dateien und Netzwerkressourcen zuzugreifen, also greifen auch alle Mechanismenm, die auf Betriebssystemebene implementiert sind.

    was haltet ihr von der Entwicklung eines eigenen, eventuell DB-gestützten DNS-Cache hinsichtlich file_get_contents?

    Nichts.

    Sollte man gleich selbst mit Sockets und DNS-Cache arbeiten, um Performance-Gewinne zu erzielen?

    Nein, nicht um einen Performancegewinn zu erreichen, sondern um von Einstellungen wie allow_url_fopen unabhängig zu sein.

    Ciao,
     Martin

    --
    Manchmal regnet es so stark, dass sogar die Fische unter Brücken schwimmen, um nicht so nass zu werden.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      ah, sehr gut, danke. Wo kann man denn den lokalen DNS etwa unter Debian einsehen? Muss dazu irgendeine Software installiert sein?

      Sollte man gleich selbst mit Sockets und DNS-Cache arbeiten, um Performance-Gewinne zu erzielen?

      Nein, nicht um einen Performancegewinn zu erreichen, sondern um von Einstellungen wie allow_url_fopen unabhängig zu sein.

      Ah, alles klar. Ich kenne PHP nicht so gut, interessante Information.

      danke!

      Roboter

      1. Hello,

        ah, sehr gut, danke. Wo kann man denn den lokalen DNS etwa unter Debian einsehen? Muss dazu irgendeine Software installiert sein?

        Bei WinDOS mit ipconfig /displaydns

        Linux cached von Haus aus keine Auflösungen. Du müsstest dazu einen nscd einrichten

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          ah, sehr gut, danke. Wo kann man denn den lokalen DNS etwa unter Debian einsehen? Muss dazu irgendeine Software installiert sein?

          Bei WinDOS mit ipconfig /displaydns

          Linux cached von Haus aus keine Auflösungen. Du müsstest dazu einen nscd einrichten

          Geht das hier nun nochmal weiter? Könnten wir bitte mal erfahren, ob die Ablaufzeiten der Applikation durch Einrichtung des nscd merklich kürzer geworden sind?

          Neugierige Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
  2. hmmm, mir fällt ein, ich könnte noch an ein paar anderen Dingen schrauben,wenn ich mit Sockets arbeite. Allerdings habe ich unter PHP keinerlei Erfahrung...

    was haltet ihr von der Möglichkeit, tcp_nodelay auszuschalten? Benötige ich eigentlich nicht, da sowieso kaum Daten gesendet werden.

    Was ist mit den TCP Handshakes? Der Content, den ich von den URIs erhalte, ist miniklein, ein kleines XML mit zwei, drei Knötchen meistens, die Anfrage ebenfalls. Könnte man dazu nicht die Handshake Packets verwenden?

  3. Moin!

    ich schreibe gerade eine Applikation, die periodisch eine gewisse Anzahl von teilweise immer gleichen URIs aufrufen muss. Den Response-Content bekomme ich dann über die sehr komfortable Funktion PHP file_get_contents(), die als Argument für meinen Fall eine absolute Web-Adresse erwartet.

    Nun dachte ich, dass ich mir die stetig wiederkehrende DNS-Auflösung doch eigentlich sparen könnte.

    Du machst dir Performancegedanken. Das ist ok.

    Hast du dir selbst alle notwendigen Fragen gestellt, um die Performancefrage mit einer akzeptablen Performanceantwort zu versehen?

    1. Hast du festgelegt, welcher Faktor im Hinblick auf Performance für dich "besser" bedeutet? Mögliche Faktoren: Ausführungszeit, Speicherverbrauch, CPU-Zyklen, Datentransfermenge, ...

    2. Kannst du den festgelegten Faktor, und ggf. noch weitere, davon abhängige Faktoren, messen? Automatisiert messen? Wiederholbar im laufenden Betrieb des Produktivsystems messen? Ohne Messung kannst du nicht wissen, ob eine Veränderung dich deinem gesteckten Performance-Ziel (siehe Frage 1) näher gebracht hat, oder nicht.

    3. Und erst jetzt kommt die entscheidende Frage: Welche Faktoren kannst du im Code beeinflussen, um deinen Performance-Zielen näher zu kommen?

    Und aus diesen Fragen ergeben sich aus meiner Sicht für deine konkreten Fragen folgende Antworten:

    Wie läuft das bei PHP? Gibt es einen DNS-Cache?

    Nicht in PHP.

    Im Netz konnte ich nichts finden, ich gehe davon aus: Nein. Nutzt PHP den lokalen DNS-Cache des Betriebsystems, wenn vorhanden?

    Dieser Cache ist immer vorhanden.

    Wenn nein, was haltet ihr von der Entwicklung eines eigenen, eventuell DB-gestützten DNS-Cache hinsichtlich file_get_contents?

    Wie willst du file_get_contents php-codeseitig mit DNS-Cacheverhalten ausstatten? Dürfte extrem schwierig werden.

    Sollte man gleich selbst mit Sockets und DNS-Cache arbeiten, um Performance-Gewinne zu erzielen?

    Lohnt sich nur, wenn durch Messung des gewünschten zu optimierenden Performance-Faktors tatsächlich nennenswerte Ersparnis erzielt werden kann.

    PHP's Curl cached ja, soweit ich das sehen kann.

    Gibt es noch andere Teile einer HTTP-Transaktion, die man beschleunigen könnte? Response, Request, Connect liegt ja alles nicht in meiner Hand. Ich sehe da nichts mehr.

    Die Frage ist: Wohin optimiert?

    - Sven Rautenberg

    1. Hallo Sven,

      danke für deine Antwort. Ganz kurz, mir fallen die Äuglein zu, ich muss ins Bett.

      runtergebrochen auf den einfachsten Fall, eine HTTP-Anfrage, folgend ein kleines Pseudoprogramm:

        
        
      startTime = nowTime()  
      establishHTTPConnection()  
      sendRequest() // Anfrage stellen 1)  
      // auf remote-Prozesslaufzeit keinen Einfluss, ist aber zu vernachlässigen 2)  
      getResponse() 3)  
      endtime = nowTime() - startTime  
        
      
      

      Ziel: endtime so kleine wie möglich zu halten. Die gesendete Datenmenge ist in etwa immer gleich (klein, ca 400b - ~1kb)

      Sicherlich bin ich in diesem Szenario abhängig von der remoteProzesslaufzeit, ignorieren wir diese doch mal bzw. idealisieren sie auf "immer 0".

      1. Moin!

        startTime = nowTime()
        establishHTTPConnection()
        sendRequest() // Anfrage stellen 1)
        // auf remote-Prozesslaufzeit keinen Einfluss, ist aber zu vernachlässigen 2)
        getResponse() 3)
        endtime = nowTime() - startTime

        
        >   
        > Ziel: endtime so kleine wie möglich zu halten. Die gesendete Datenmenge ist in etwa immer gleich (klein, ca 400b - ~1kb)  
          
        Wenn in PHP kein DNS-Cache benutzt würde, wäre die Laufzeit dieses Codes immer gleichlang. Andernfalls wäre ab dem zweiten Aufruf die Zeit kürzer.  
          
         - Sven Rautenberg
        
  4. Hi!

    Nun dachte ich, dass ich mir die stetig wiederkehrende DNS-Auflösung doch eigentlich sparen könnte. Wie läuft das bei PHP? Gibt es einen DNS-Cache?  Im Netz konnte ich nichts finden, ich gehe davon aus: Nein. Nutzt PHP den lokalen DNS-Cache des Betriebsystems, wenn vorhanden? Wenn nein, was haltet ihr von der Entwicklung eines eigenen, eventuell DB-gestützten DNS-Cache hinsichtlich file_get_contents? Sollte man gleich selbst mit Sockets und DNS-Cache arbeiten, um Performance-Gewinne zu erzielen?

    Beachte auch, dass der Hostname bei Anfragen an Webserver mit mehreren VirtualHosts unter einer IP-Adresse eine Rolle spielt. Wenn du über die IP-Adresse gehen willst, kannst du nicht mehr so einfach file_get_contents() verwenden sondern brauchst noch ein paar weitere Funktionsaufrufe, um die Stream-Parameter zu setzen. Auch wenn du über Sockets gehst, hast du mehr als einen PHÜ-Funktionsaufruf. Ich bezweifle mit einem Bauchgefühl, dass diese Mehrarbeit weniger aufwendig sein soll, als file_get_contents() intern einen vom Betriebssystem gecachten DNS-Aufruf machen zu lassen.

    Gibt es noch andere Teile einer HTTP-Transaktion, die man beschleunigen könnte? Response, Request, Connect liegt ja alles nicht in meiner Hand. Ich sehe da nichts mehr.

    HTTP 1.1 verwenden, Connection offen lassen. Aber dann musst du das Protokoll mit seinen Eigenheiten selbst implementieren. Und das wäre mir den Aufwand nicht wert im Verhältnis zu der (nicht) zu erwartenden Einsparung.

    Lo!