encerra a conexão devido a falha de outro processo do servidor

2

Eu tenho um java scraper que gera cerca de 1.500-2.100 threads, cada um dos quais se conecta ao mesmo banco de dados via jdbc e faz inserções. Esses segmentos são inseridos com bastante frequência.

Parece que o banco de dados trava quando há muitas conexões. Eu sempre começo a gerar 210 threads ou conexões quando todos os threads perdem a conexão. A seguir, as mensagens de log geradas no lado do servidor.

2015-07-15 20:18:37 UTC [10825-21] LOG:  checkpointer process (PID 13435) was terminated by signal 9: Killed
2015-07-15 20:18:37 UTC [10825-22] LOG:  terminating any other active server processes
2015-07-15 20:18:37 UTC [16836-1] user@db WARNING:  terminating connection because of crash of another server process
2015-07-15 20:18:37 UTC [16836-2] user@db DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2015-07-15 20:18:37 UTC [16836-3] user@db HINT:  In a moment you should be able to reconnect to the database and repeat your command.

A seguir, a mensagem de erro exibida no lado do cliente (raspador).

SEVERE: An I/O error occurred while sending to the backend.
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:283)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:420)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:366)
    at SocketBot.run(SocketBot.java:167)
Caused by: java.io.EOFException
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:284)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1803)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    ... 4 more

No arquivo postgresql.conf, eu configurei max connections = 2500. Mas estou pensando que há mais coisas para ajustar aqui. Meu servidor tem 512MB de RAM se alguém quiser saber.

    
por jeebface 15.07.2015 / 22:29

1 resposta

3

O assassino de falta de memória do Linux provavelmente está encerrando processos. Isso significa que seu servidor está configurado incorretamente. É altamente recomendado que você não deixe o Linux comprometer a memória, de modo que ele responda com um erro de falta de memória ao aplicativo, em vez de matar processos quase aleatoriamente. O PostgreSQL é projetado para lidar com condições de falta de memória, mas não pode fazê-lo se o Linux eliminar processos em vez de reportar falta de memória.

Para confirmar o que está acontecendo aqui, verifique o log de mensagens do kernel com o comando dmesg .

Veja link

    
por 16.07.2015 / 14:14