由于另一个服务器进程崩溃而终止连接

我有一个java scraper,产生大约1,500-2,100个线程,每个线程通过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。但是我想这里还有更多的东西需要调整。 如果有人想知道我的服务器有512MB内存。

Linux的内存不足杀手可能正在终止进程。 这意味着您的服务器configuration错误。 强烈build议您不要让Linux过度使用内存,因此它会为应用程序提供适当的内存不足错误,而不是几乎随机地杀死进程。 PostgreSQL被devise为处理内存不足的情况,但是如果Linux杀死进程而不是报告内存不足,则不能这样做。

要确认这是发生了什么,请使用dmesg命令检查内核消息日志。

请参阅http://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT