Come risolvere le chiamate high CPU + eccessive stat ("/ etc / localtime") e clock_gettime (CLOCK_REALTIME)

Ho sperimentato una CPU molto alta su un ruby su app rotaie (vedi pila sotto) e sono state cercando di diagnosticare le possibili cause inutili.

  • Come aprire la port 555 in Linux / Debian
  • Halp! Ho infastidito Apache!
  • Strano comportmento ifup / ifdown su Debian Lenny
  • sapendo quanto tempo è rimasto prima delle cron settimanali?
  • Imansible avviare / interrompere il servizio mysql
  • Imansible cambiare la socket OpenDKIM in Debian stretch in / etc / default / opendkim
  • Pila:

    • ruby 1.9.3
    • binari 3.2.6
    • Apache / 2.2.21 (Debian)
    • Phusion Passenger 3.0.11

    Ogniqualvolta faccio strace contro il PID di raggruppamento del rack ( vedi il primo estratto di seguito ), vedo una tonnellata di chiamate stat("/etc/localtime") e clock_gettime(CLOCK_REALTIME) e non ho idea di come fermarli.

    Estratto da Top showin in esecuzione PID:

      PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 11674 www-user 20 0 313m 182m 5076 R 99 2.3 63:04.60 Rack: /var/www/my_rails_app/current 11634 www-user 20 0 411m 216m 5144 S 10 2.7 197:55.63 Rack: /var/www/my_rails_app/current 

    Straccio di Strace qui sotto:

     [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 141474018}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 141577456}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 143073982}) = 0 [pid 11674] poll([{fd=15, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) [pid 11674] write(15, "b\0\0\0\3SELECT `images`.* FROM `ima"..., 102) = 102 [pid 11674] read(15, "\1\0\0\1\0229\0\0\2\3def\23myappy_productio"..., 16384) = 2063 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 144138035}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 ... [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 154076443}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 154189429}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 157185700}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 157298770}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 165076003}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 165212572}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 167542679}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354058955, 167683436}) = 0 .... [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 62052248}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 62182486}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 62919948}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 63057266}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 63751707}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 73730686}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 75874687}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 76077133}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 78205019}) = 0 ... [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 89370879}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 89583247}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 91637614}) = 0 [pid 11674] clock_gettime(CLOCK_REALTIME, {1354060036, 91782149}) = 0 

    Hai trovato Google in giro e ha incontrato un certo numero di suggerimenti che ho provato senza successo.

    Le cose fatte finora:

    1. Hai provato a impostare il fuso orario come indicato qui
      Non ha fatto differenza e problema ancora persiste.
      Contenuto del mio / etc / localtime:

      TZif2UTCTZif2UTC
      UTC0

    2. Hanno provato la correzione consigliata per il bug di leapsecond:

      data -s 'data'

    Nessuna gioia finora.

    Sono fresco di idee e quindi qualsiasi aiuto / consigli su come diagnosticare o risolvere sarebbe molto apprezzato.

  • Grafica dell'uso di CPU per utente su una macchina Linux
  • Cresce la cache di sistema in RAM causando un utilizzo elevato della CPU
  • Genera artificialmente lo Steal della CPU
  • Cosa dovrei cercare quando si monitorizza l'utilizzo della CPU di Amazon Micro EC2?
  • performance del vCPU tra 1 o 2 vCPU
  • Software interrompe Il tempo della CPU è elevato e continua a crescere
  • 2 Solutions collect form web for “Come risolvere le chiamate high CPU + eccessive stat ("/ etc / localtime") e clock_gettime (CLOCK_REALTIME)”

    Ho scoperto che statistiche eccessive a / etc / localtime sono dovute a variables di ambiente mancanti.

    Prova questo:

     echo $TZ 

    Se è vuoto, impostare la variabile nella posizione corretta (ad esempio /home/apache/.bash_profile). Dovrai impostarlo per l'utente responsabile dell'esecuzione del tuo webserver, quindi ricaricare il demone (apachectl graceful etc).

     TZ='Europe/London'; export TZ 

    O qualunque sia il fuso orario corretto per la tua regione ( http://en.wikipedia.org/wiki/List_of_tz_database_time_zones ).

    esport TZ =: / etc / localtime funziona anche – leggerà il file all'avvio e mai più – significa che i processi daemon dovrebbero essere riavviati se cambierai mai il contenuto di questo file.

    Tuttavia, come te, abbiamo anche l'UTC su tutti i nostri server, quindi non cambia mai.

    Non posso aiutarti sul "clock_gettime" – tuttavia, direi che su VM abbiamo trovato tempo () essere piuttosto costoso, quindi abbiamo un process daemon che assegna una memory condivisa e mette il tempo in esso, poi tutti i processi che vuoi sapere che il tempo si collega a & leggere la memory condivisa anziché usare il tempo () fn.

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