Scopri che process di apache di utilizzo della CPU è in realtà efficace?

Attualmente abbiamo qualche problema con il nostro server where, a intermittenza, ci sembra di avere processi apache che corrono e funzionano, prendendo CPU al 100%.

Quando si esegue in alto, vediamo quanto segue:

  • come eseguire il lavoro cron each 3 mesi?
  • crontab non riesce a impostare la variabile prima del lavoro
  • Comando trova Mostra "Valore troppo grande per il tipo di dati definito"
  • Problema con CNAME e host virtuali
  • 2 NICs 2 IPS la stessa substring
  • Monitoraggio di più apache host all'interno di una cartella
  • PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start 23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start 

    Voglio provare a scoprire quale script (o qualunque cosa sia) sta causando questo, quindi ho provato:

      strace -p 20788 

    Ma questo non mostra alcuna output (ho lasciato per circa 10 minuti, e non mostra nulla). Dalla mia comprensione, questo potrebbe significare che è bloccato in un ciclo infinito, e non ci sono "chiamate di sistema" da mostrare.

    C'è qualcos'altro che posso fare per mostrare cosa sta succedendo?

    Grazie

    Modifica – Hai dimenticato di citare, questo è un server dal vivo con poche centinaia di utenti in qualsiasi momento! Quindi non posso provare a cercare di cambiare opzioni di configuration e riavviare apache.

    Modifica 2 – Il backtrace (bt) di gdb non sembra tutto utile quando PHP non è configurato con –enable-debug – mostra solo "execute ()", ma devo sapere quale script PHP è effettivamente in esecuzione .. c'è qualche altro modo?

     #0 0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so #1 0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so #2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so #3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so #4 0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so #5 0x00007f6c18912508 in ap_run_handler () #6 0x00007f6c1891297e in ap_invoke_handler () #7 0x00007f6c18922570 in ap_process_request () #8 0x00007f6c1891f398 in ?? () #9 0x00007f6c18918fa8 in ap_run_process_connection () #10 0x00007f6c189271d0 in ?? () #11 0x00007f6c1892793a in ?? () #12 0x00007f6c189284e7 in ap_mpm_run () #13 0x00007f6c188fd4a4 in main () 

  • linux instradare ip interno per utilizzare un ip esterno specifico
  • Esegui il command come utente di sistema "Linux" (shell = / bin / false)
  • Come viene eseguito Postfix & Cyrus-IMAP quando si aggiorna Fedora?
  • Come fare "du" su tutti i file sotto una directory in linux?
  • Efficiente Mail Only Newsletter Mail Server
  • L'output del programma come argomento di un altro programma
  • 6 Solutions collect form web for “Scopri che process di apache di utilizzo della CPU è in realtà efficace?”

    Beh, se ti senti coraggiosi:

    gdb -p 20788

    quindi rilasciare bt per vedere il frame-stack, ad esempio

    E BTW, c'è anche ltrace da citare – provare pure.

    UPD. : Beh, ok, dal momento che ora abbiamo un'idea che Apache è davvero in esecuzione qualcosa, perché non guarderebbe la mod_status output – Esteso ?

    Potresti provare:

    • iotop (mostrando I / O sul sistema)
    • netstat -t (mostra le connessioni)
    • Date un'occhiata ai file di registro apache e scopri cosa ha durato il server
    • impostare alcuni RLimits per il process apache. Quando questi limiti vengono raggiunti il ​​process verrà ucciso, fornendo ulteriori informazioni

    Il tuo command dovrebbe funzionare a condizione che fai una richiesta HTTP che innesca tale PID.

    Forse vuoi temporaneamente riorganizzare Apache con un solo process figlio?

    Prova questo:

    1) Avviare un registro con data / ora, script PHP e il PID usando getmypid()

    2) Quindi guardi il tuo server con la parte top

    3) Quando vedi che il process apache va in alto, cercare la stessa data / ora e PID nei tuoi registri. Dovresti essere in grado di trovare lo script problematico.

    Un approccio molto facile è usare htop . È ansible ordinare per i processi CPU elevati e quindi utilizzare

    • per strace un process
    • l per vedere i file aperti di un process
    • L a ltrace .

    Ho scoperto che alless una di queste opzioni trova lo script che genera il carico e si può naturalmente utilizzare questo in un server web di produzione per eseguire il debug.

    Il PID di tale istanza apache è basso, potrebbe essere il padre di tutto il lotto. Ciò spiegherebbe certamente l'elevato utilizzo della CPU (rimane in giro, altri vengono generati e richiamati in base al carico). Molto tempo di CPU accumulato potrebbe significare che è stata in esecuzione per lungo tempo. Nessuna output da strace(1) significa solo che non ha effettuato chiamate di sistema. Sì, potrebbe essere in un ciclo stretto, ma apache è essenzialmente I / O sopra la networking, quindi penso che non stia facendo niente utile. Strano 100% di una CPU, in each caso.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.