Como resolver chamadas de alta CPU + status excessivo (“/ etc / localtime”) e clock_gettime (CLOCK_REALTIME)

3


Eu experimentei uma CPU muito alta em um aplicativo Ruby on Rails (veja a pilha abaixo) e tentei diagnosticar as possíveis causas sem sucesso.

Pilha:

  • ruby 1.9.3
  • trilhos 3.2.6
  • Apache / 2.2.21 (Debian)
  • Passageiro de Phusion 3.0.11

Sempre que executo strace contra o PID do processo do Rack de pico ( veja o trecho superior abaixo ), vejo uma tonelada de chamadas stat("/etc/localtime") e clock_gettime(CLOCK_REALTIME) e não tenho ideia de como parar estes.


Trecho do Top showin executando o 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


Snippet abaixo:

[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

TZif2UTCTZif2UTC
UTC0

date -s 'date'

%bl0ck_qu0te%SELECT 'images'.* FROM 'ima"..., 102) = 102 [pid 11674] read(15, "%bl0ck_qu0te%%bl0ck_qu0te%29%bl0ck_qu0te%%bl0ck_qu0te%defmyappy_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


Procurei o Google e encontrei várias sugestões que tentei sem sucesso.


Coisas tentadas até agora:

  1. Tentei definir o fuso horário conforme recomendado aqui
    Não fez diferença e problema ainda persiste.
    Conteúdo do meu / etc / localtime:

    %bl0ck_qu0te%
  2. Já tentei a correção recomendada para o bug leapsecond:

    %bl0ck_qu0te%


Nenhuma alegria até agora.


Estou sem ideias, então qualquer ajuda / orientação sobre como diagnosticar ou resolver seria muito apreciada.


    
por Yemster 28.11.2012 / 02:15

2 respostas

1

Descobri que estatísticas excessivas para / etc / localtime são devidas a variáveis de ambiente ausentes.

Tente isto:

echo $TZ

Se estiver em branco, defina a variável no local correto (por exemplo, /home/apache/.bash_profile). Você precisará configurá-lo para o usuário responsável pela execução do seu servidor da Web e, em seguida, recarregar o daemon (apachectl gracioso, etc.).

TZ='Europe/London'; export TZ

Ou qualquer que seja o fuso horário correto para sua região ( link ).

    
por 18.12.2013 / 12:32
1

export TZ =: / etc / localtime também funciona - ele irá ler o arquivo na inicialização e nunca mais - isso significa que os processos daemon precisariam ser reiniciados, se você mudar o conteúdo deste arquivo.

No entanto, como você, também executamos o UTC em todos os nossos servidores, por isso nunca muda.

Não consigo ajudá-lo no "clock_gettime" - no entanto, eu diria que nas VMs encontramos time () bastante caro, então temos um processo daemon que aloca memória e coloca o tempo lá, então todos os processos que querem saber o tempo ligado a & leia a memória compartilhada em vez de usar o time () fn.

    
por 28.10.2015 / 13:27