Alta carga de CPU em um servidor de aquisição de dados

Alta carga de CPU em um servidor de aquisição de dados

Eu configurei um pequeno programa python que usa uma conexão websocket para adquirir dados de uma API e gravá-los em um banco de dados postgresql.

Existem apenas dois programas (do usuário) em execução: a conexão websocket que recebe os dados e os grava no banco de dados, e outro programa que é básico, um loop while que é executado a cada 15 segundos e verifica se os dados estão sendo gravados.

Ambos os programas são daemonizados com o supervisor e quando nenhum dado é gravado por 15 segundos, o supervisor é reiniciado (para lidar com a conexão inativa do websocket).

Além disso, fui (muito) preguiçoso e usei Django ORM para fazer a conexão db para mim, em vez de psycopg2 diretamente.

Funciona, mas estou tendo uma carga alta e constante de CPU no servidor. É um servidor de memória 1CPU 1Gb (AWS micro). O comando superior gera o seguinte:

top - 17:10:58 up 19 days, 15:03,  1 user,  load average: 1,57, 1,63,    1,58
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,3 us,  0,3 sy,  0,0 ni,  0,0 id, 99,0 wa,  0,0 hi,  0,0 si,  0,3 st
 KiB Mem :  1014552 total,    63440 free,    86572 used,   864540 buff/cache
 KiB Swap:  1048572 total,   987380 free,    61192 used.   615096 avail Mem

Bem, o sistema está lento e trava ocasionalmente.

Posso ver que isso é causado por uma alta carga de IO (99 wa). Muitos processos de sono. Mas estou gravando em média 400MB por dia só no banco de dados.

Eu tentei modificar a configuração do Postgresql para alta carga de gravação seguindo a documentação e configurando um arquivo de memória swap (1 GB), mas isso não ajudou a aliviar a média de carga.

Então, para um usuário inexperiente como eu, não sei se essa é a carga que devo esperar. Posso otimizar esta configuração? Se eu remover o Django ORM e escrever o programa usando apenas psycopg2, isso melhoraria? Devo fazer um método de verificação diferente para conexões websocket inativas? Existe alguma configuração de servidor que possa otimizar para esse caso de necessidade?

Obrigado!

Responder1

Eu consigo descobrir como consertar isso usando este linkhttp://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

Basicamente eu corri iotope descobri qual processo estava causando alta carga de IO. Lá descobri que a carga era por causa da leitura do banco de dados e não da escrita. Então percebi que estava fazendo algo estúpido: estava consultando muito o banco de dados inteiro contando o número de entradas enquanto verificava se estava gravando. Isso foi em média 500 MB/s de leitura. Então mudei o código para verificar o número da chave primária da última entrada em vez de contar as entradas e... funcionou. A média de carga agora é 0,01. Obrigado @match pelo aviso

informação relacionada