当前位置: 首页>>技术教程>>正文


linux – Neo4j警告:允许最多1024个打开的文件,建议最少40 000个。参见Neo4j手册

, ,

问题描述

我使用以下说明在Ubuntu 12.04上安装了Neo4j:http://www.neo4j.org/download/linux

wget -O - http://debian.neo4j.org/neotechnology.gpg.key | apt-key add - 
echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
apt-get update
apt-get install neo4j

我确保拥有正确的jdk:

root@precise64:~# java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

当我启动neo4j时,出现此错误:

WARNING: Max 1024 open files allowed, minimum of 40 000 recommended. See the Neo4j manual.

因此,我在这里按照说明进行操作:http://docs.neo4j.org/chunked/1.6.2/configuration-linux-notes.html

并将这些内容添加到/etc/security/limits.conf

neo4j   soft    nofile  40000
neo4j   hard    nofile  40000

并在/etc/pam.d/su中取消注释此行

session    required   pam_limits.so

重新启动服务器后,我将验证新限制

neo4j@precise64:~$ ulimit -n
40000

然后,我重新启动服务器。启动时仍然出现相同的错误。

root@precise64:~# service neo4j-service start
WARNING: Max 1024 open files allowed, minimum of 40 000 recommended. See the Neo4j manual.
Using additional JVM arguments:  -server -XX:+DisableExplicitGC -Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
Starting Neo4j Server...WARNING: not changing user
process [3161]... waiting for server to be ready....... OK.
http://localhost:7474/ is ready.

即使该服务以neo4j用户身份运行:

root@precise64:~# ps -ef | grep 3161
neo4j     3161     1  2 17:43 pts/0    00:00:10 /usr/bin/java -cp /var/lib/neo4j/lib/concurrentlinkedhashmap-lru-1.3.1.jar:/var/lib/neo4j/lib/geronimo-jta_1.1_spec-1.1.1.jar:/var/lib/neo4j/lib/lucene-core-3.6.2.jar:/var/lib/neo4j/lib/neo4j-cypher-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-commons-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-1.9-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-2.0-2.0.0.jar:/var/lib/neo4j/lib/neo4j-graph-algo-2.0.0.jar:/var/lib/neo4j/lib/neo4j-graph-matching-2.0.0.jar:/var/lib/neo4j/lib/neo4j-jmx-2.0.0.jar:/var/lib/neo4j/lib/neo4j-kernel-2.0.0.jar:/var/lib/neo4j/lib/neo4j-lucene-index-2.0.0.jar:/var/lib/neo4j/lib/neo4j-shell-2.0.0.jar:/var/lib/neo4j/lib/neo4j-udc-2.0.0.jar:/var/lib/neo4j/lib/org.apache.servicemix.bundles.jline-0.9.94_1.jar:/var/lib/neo4j/lib/parboiled-core-1.1.6.jar:/var/lib/neo4j/lib/parboiled-scala_2.10-1.1.6.jar:/var/lib/neo4j/lib/scala-library-2.10.3.jar:/var/lib/neo4j/lib/server-api-2.0.0.jar:/var/lib/neo4j/system/lib/asm-3.1.jar:/var/lib/neo4j/system/lib/bcprov-jdk16-140.jar:/var/lib/neo4j/system/lib/commons-beanutils-1.8.0.jar:/var/lib/neo4j/system/lib/commons-beanutils-core-1.8.0.jar:/var/lib/neo4j/system/lib/commons-collections-3.2.1.jar:/var/lib/neo4j/system/lib/commons-compiler-2.6.1.jar:/var/lib/neo4j/system/lib/commons-configuration-1.6.jar:/var/lib/neo4j/system/lib/commons-digester-1.8.1.jar:/var/lib/neo4j/system/lib/commons-io-1.4.jar:/var/lib/neo4j/system/lib/commons-lang-2.4.jar:/var/lib/neo4j/system/lib/commons-logging-1.1.1.jar:/var/lib/neo4j/system/lib/jackson-core-asl-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-jaxrs-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-mapper-asl-1.9.7.jar:/var/lib/neo4j/system/lib/janino-2.6.1.jar:/var/lib/neo4j/system/lib/javax.servlet-3.0.0.v201112011016.jar:/var/lib/neo4j/system/lib/jcl-over-slf4j-1.6.1.jar:/var/lib/neo4j/system/lib/jersey-core-1.9.jar:/var/lib/neo4j/system/lib/jersey-multipart-1.9.jar:/var/lib/neo4j/system/lib/jersey-server-1.9.jar:/var/lib/neo4j/system/lib/jetty-http-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-io-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-security-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-server-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-servlet-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-util-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-webapp-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-xml-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jsr311-api-1.1.2.r612.jar:/var/lib/neo4j/system/lib/logback-access-1.0.9.jar:/var/lib/neo4j/system/lib/logback-classic-1.0.9.jar:/var/lib/neo4j/system/lib/logback-core-1.0.9.jar:/var/lib/neo4j/system/lib/mimepull-1.6.jar:/var/lib/neo4j/system/lib/neo4j-browser-2.0.0.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.0-static-web.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.0.jar:/var/lib/neo4j/system/lib/rhino-1.7R3.jar:/var/lib/neo4j/system/lib/rrd4j-2.0.7.jar:/var/lib/neo4j/system/lib/slf4j-api-1.6.2.jar:/var/lib/neo4j/conf/ -server -XX:+DisableExplicitGC -Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Dneo4j.home=/var/lib/neo4j -Dneo4j.instance=/var/lib/neo4j -Dfile.encoding=UTF-8 org.neo4j.server.Bootstrapper
root      3238  2056  0 17:49 pts/0    00:00:00 grep --color=auto 3161

因此,我认为可能是作为root用户启动服务的问题,因此我将其关闭并以neo4j用户身份启动。

root@precise64:~# service neo4j-service stop
root@precise64:~# su - neo4j 
neo4j@precise64:~$ service neo4j-service start
Using additional JVM arguments:  -server -XX:+DisableExplicitGC -    Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
Starting Neo4j Server...WARNING: not changing user
process [3435]... waiting for server to be ready....... OK.
http://localhost:7474/ is ready.
cp: cannot create regular file `/var/run/neo4j.pid': Permission denied

它失败,因为无法创建pid文件。我认为这意味着这不是正确的方法,但是我继续编辑/etc/init.d/neo4j-service以将pid文件的位置更改为neo4j用户的主文件夹:

#PIDFILE=/var/run/$NAME.pid
PIDFILE=/var/lib/neo4j/$Name.pid

然后,当我以Neo4j用户身份运行该服务时,一切启动都没有错误。

所以,我的问题是:预期的行为是什么?只要neo4j用户具有正确的ulimit权限,是否应该以root用户身份启动服务,还是我需要修改启动脚本/权限以允许neo4j用户创建其PID文件?

最佳思路

您需要将以下条目添加到/etc/security/limits.conf文件中

root   soft    nofile  40000
root   hard    nofile  40000

您需要以root用户或使用sudo启动服务

当您这样做时,最终启动该服务的用户是root用户。

如果您在文件中没有root用户的条目,则它将无法工作。

因此,您只需要在文件中添加这些条目,然后重新启动服务器即可。

我遇到了同样的问题,这就是我能够解决的问题。

次佳思路

this issue comment中所述,并由this commit修复,自Neo4J 3.1起,

you can add a line in /etc/default/neo4j:

NEO4J_ULIMIT_NOFILE=60000 

to set the ulimit setting (60000 open files) for the service.

不再需要在debian上使用/etc/security/limits.conf来设置打开文件的数量。

第三种思路

@israel和@Tomasz Swider发布的解决方案对我不起作用(我正在运行Ubuntu 14.04)。但是,我可以通过修改文件/etc/init.d/neo4j-service来摆脱此警告,如@zwol在问题下方的注释中所建议的:

我在此文件的do_start()方法中添加了行ulimit -n 40000。就我而言,此方法如下所示:

do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        ulimit -n 40000
        start-stop-daemon --chuid ${NEO_USER} --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --chuid ${NEO_USER} --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

当我随后使用命令启动服务时

sudo service neo4j-service start

它启动时没有警告,并返回以下消息:

Starting Neo4j Server...WARNING: not changing user
process [9921]... waiting for server to be ready...... OK.
http://localhost:7474/ is ready.

我不确定这是否可行,但如上所述,这是迄今为止我摆脱该警告的唯一解决方案。

编辑:

尚未测试,但似乎现在有一个更简单的解决方案:see @Schrodinger’s’Cat’s answer

第四种思路

在/etc/security/limits.conf文件中,您需要为将要运行neo4j服务器的用户设置限制,因此,如果要使用的用户是root用户,则使用root用户,但这可能是个坏主意,设置:

neo4j   soft    nofile  40000 
neo4j   hard    nofile  40000

如果您在哪里添加neo4j用户将可以工作,我有一些问题,所以我将这些设置为我的默认用户’bob’。

bob   soft    nofile  40000 
bob   hard    nofile  40000

然后我刚开始以bob身份登录neo4j。

第五种思路

我按照先前答案中的建议应用了更改

root   soft    nofile  40000
root   hard    nofile  40000

neo4j   soft    nofile  40000 
neo4j   hard    nofile  40000

/etc/security/limits.conf

但是,我仍然收到关于仅允许打开的1024个文件的警告。命令

ulimit -a

确实只显示了1024个打开的文件。

技巧是注销服务器,然后重新登录。在新会话中,应用了新limits-configuration的值,我可以

service neo4j-server restart

允许打开40.000个文件。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9429.html,未经允许,请勿转载。