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.

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.

  • MySQL si blocca se la connessione viene dall'esterno della LAN
  • Monitorare tutti i processi appena nati su una macchina Linux
  • Scopri che process di apache di utilizzo della CPU è in realtà efficace?
  • Come impostare la width di string dei caratteri di output strace per essere più lungo?
  • tracciare un'apertura su un determinato file
  • "Yum clean" si blocca - cosa provare dopo?
  • Può strace mostrare il nome del file / path per le syscalls di lettura / scrittura
  • Il process Apache consuma troppa CPU
  • 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.