У меня есть java-скребок, который порождает около 1500-2100 потоков, каждый из которых подключается к той же базе данных через jdbc и делает вставки. Эти резьбы вставляются довольно часто.
Похоже, что db вылетает, когда слишком много подключений. Я всегда получаю до создания 210 потоков или соединений, когда все потоки теряют соединение. Ниже приведены сообщения журнала, которые создаются на стороне сервера.
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.
Ниже приведено сообщение об ошибке, отображаемое на стороне клиента (парсера).
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
В файле postgresql.conf я установил максимальное количество подключений = 2500. Но я думаю, здесь есть еще кое-что, что нужно изменить. На моем сервере 512 МБ ОЗУ, если кому-то интересно.
Убийца Linux из-за нехватки памяти, вероятно, завершает процессы. Это означает, что ваш сервер неправильно настроен. Настоятельно рекомендуется, чтобы вы не пусть Linux перегрузит память, чтобы оно ответило приложению правильной ошибкой нехватки памяти вместо того, чтобы почти наугад убивать процессы. PostgreSQL разработан для обработки условий нехватки памяти, но не может этого сделать, если Linux уничтожает процессы вместо того, чтобы сообщать о нехватке памяти.
Чтобы убедиться в том, что здесь происходит, проверьте журнал сообщений ядра с dmesg
команда.
Видеть http://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT