2013-05-28 65 views
12

Używam demona PHP do profilowania.php xdebug: Jak profilować rozwidlony proces

Rozpoczęty proces php ładuje wszystkie wymagane dane, forks, aby rozłożyć obciążenie na wszystkie rdzenie, waits dla dzieci rozwidlonych, aby zakończyć i zbiera wyniki wygenerowane przez dzieci.

Ponieważ współdzielę środowisko CLI z innymi użytkownikami, muszę uruchomić xdebug profiling, wstrzykując wartości php.ini do wywołania powłoki.

$ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir="/home/xxx" daemon.php 

Wygenerowany plik cachegrind, jak dotąd, profiluje rodzica, a tym samym pokazuje 90% snu.

Czy istnieje sposób na profilowanie pracowników bez budowania sterownika, aby załadować je bezpośrednio?

Dzięki

Odpowiedz

7

Wpadłem na ten sam problem i rozwiązano go bez XDebug. Niestety nie mogłem znaleźć sposobu na XDebug. To jakoś nie obchodzi go żaden rozwidlony proces.

I rozwiązać stosując Xhprof do profilu i Xhgui wglądu kłód. Xhprof to doskonałe narzędzie opracowane wewnętrznie przez Facebooka, a następnie wydane później przez open-source. Fajną rzeczą jest to, że możesz zdecydować, kiedy rozpocząć profilowanie i kiedy przestać. Daje to możliwość obejścia naszego problemu.

Po pierwsze, zainstalujmy to!

sudo pecl install xhprof-beta 

Jeśli używasz dystrybucji debianowej, upewnij się, że masz zainstalowane również grafviz.

sudo apt-get install graphviz 

Teraz spójrzmy na kod.

$children = []; 

do { 
    if (count($children) < $maxConsumers) { 
     $pid = pcntl_fork(); 
     $children[] = $pid; 

     if ($pid == -1) { 
      throw new \RuntimeException('Could not fork process'); 
     } else if ($pid === 0) { 
      // we are the child 

      if ($verbose) { 
       $output->writeln(sprintf('Child here (PID = %s)', posix_getpid())); 
      } 

      if ($xhProf) { 
       // here we enable xhprof thus the profiling starts 
       xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 
      } 

      // DO YOUR MAGIC HERE! 

      if ($xhProf) { 
       // and here we call the xhgui header file that will 
       // stop xhprof and write all the gathered data into 
       // mongo or into a dedicated file 
       require_once('/var/www/xhgui/external/header.php'); 
      } 

      exit; 
     } else { 
      // we are the parent 
      if ($verbose) { 
       $output->writeln(sprintf('Parent here (PID = %s) spawned a new child (PID = %s)', posix_getpid(), $pid)); 
      } 
     } 
    } else { 
     if ($verbose) { 
      $output->writeln(sprintf("Parent - spawned enough children, let's wait them...")); 
     } 

     $deadPID = pcntl_wait($status); 
     $children = array_diff($children, [$deadPID]); 
} while (true); 

// Waits for all remaining children 
while (($pid = pcntl_waitpid(0, $status)) != -1) { 
    if ($verbose) { 
     $status = pcntl_wexitstatus($status); 
     $output->writeln(sprintf("Child (PID %d) terminated. Status is %s.", $pid, $status)); 
    } 
} 

W celu sprawdzenia logów należy również poprawnie skonfigurować Xhgui. Prawdopodobnie będziesz potrzebował również hosta wirtualnego.

Dla wszystkich potrzebnych konfiguracji i odniesienia: