如何在Ubuntu中增加Neo4j的最大文件打开限制(ulimit)?

79

目前 ulimit -n 显示为 10000。 我想将其增加到 40000。我编辑了 "/etc/sysctl.conf" 文件,并添加了 fs.file-max=40000。我还编辑了 /etc/security/limits.conf 并更新了硬限制和软限制的值。但是 ulimit 仍然显示 10000。在进行所有这些更改后,我重新启动了我的笔记本电脑。我可以访问root密码。

usr_name@usr_name-lap:/etc$ /sbin/sysctl fs.file-max
fs.file-max = 500000

/etc/security/limits.conf中添加以下行 -

*     soft    nofile          40000
*     hard    nofile          40000

我还在/etc/pam.d/su中添加了以下行-

session    required   pam_limits.so

我已经尝试了其他论坛上提供的所有可能的方法,但我只能达到最大限制10000,无法超越这个限制。问题可能出在哪里?

我做出这个更改是因为neo4j会抛出达到最大打开文件限制的错误。


你做得很好,只需重新启动系统,一切都会正常工作: sudo ulimit -n 40000 - 0x90
@0x90 我重新启动了系统。但即使如此,它仍然没有改变。 - theharshest
6
由于这个问题是针对Ubuntu的,它可能更适合放在askubuntu.com上;这里有一个类似的问题:http://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user - Lambart
1
http://serverfault.com/questions/610130/how-to-set-ulimit-value-permanently - Ciro Santilli OurBigBook.com
在将更改添加到/etc/security/limits.conf之后,需要重新启动哪个服务才能使更改生效? - Ashish Karpe
明白了:要使对 /etc/security/limits 文件所做的更改生效,用户必须注销当前登录会话并重新登录。 - Ashish Karpe
10个回答

83

你现在的做法对于root用户无效。也许你正在以root身份运行你的服务,因此你看不到这个变化。

要增加root用户的ulimit,你应该将*替换为root。*不适用于root用户。其余操作和你之前做的一样。我在这里重申一下。

将以下内容添加到文件中:/etc/security/limits.conf

root soft  nofile 40000

root hard  nofile 40000

然后在文件中添加以下行:/etc/pam.d/common-session

session required pam_limits.so

这将更新root用户的ulimit。正如评论中提到的,您甚至可能无需重新启动即可看到更改。


2
实际上,您不需要重新启动计算机才能使新的限制生效。编辑 /etc/pam.d/common-session 文件的目的是为了在创建任何新会话时处理限制文件。 - Christopher Smith
1
这个程序可以正常运行,无需重启电脑。只需注销并重新登录即可查看结果。 - Bill Butler
2
对于使用start-stop-daemon的neo4j-service或任何其他服务,common-session-*技巧不起作用,因为start-stop-daemon根本不利用PAM。除了在服务启动之前在init脚本中添加显式的ulimit -n xxx调用之外,没有其他方法。 - David Ammouial
3
在Ubuntu 16.04.1 LTS上运行得非常顺利。 - Andrew T Finnell

63

1)检查sysctlfile-max限制:

$ cat /proc/sys/fs/file-max
如果限制比你期望的值低,打开sysctl.conf并在文件末尾添加以下行:
fs.file-max = 65536

最后,应用 sysctl 限制:

$ sysctl -p 

2) 编辑/etc/security/limits.conf文件,并在下面添加以下内容:

* soft     nproc          65535    
* hard     nproc          65535   
* soft     nofile         65535   
* hard     nofile         65535

如果您想更改root的限制,则这些限制不适用于root用户,您需要明确执行此操作:

root soft     nofile         65535   
root hard     nofile         65535
...

3) 重新启动系统或将以下行添加到/etc/pam.d/common-session文件的末尾:

session required pam_limits.so

退出并重新登录。

4) 检查软限制:

$ ulimit -a

还有硬限制:

$ ulimit -Ha
....

open files                      (-n) 65535

参考资料: http://ithubinfo.blogspot.in/2013/07/how-to-increase-ulimit-open-file-and.html


1
请确保您已注销并重新登录,以便反映您的更改。如果您没有使用root用户进行检查,在Ubuntu中,您可以通过gnome-session-quit来执行此操作。 - Mayank Saxena
/proc/sys/fs/file-max 不是系统允许的nofile最大值!!!例如,在我的系统上,默认设置为1528702。在limits.conf中将其设置为软/硬限制的值并不允许用户增加限制,最多只能到1024。我必须将limits.conf设置为更加保守的值,例如256*1024 = 262144,最终ulimit -a对于普通用户也显示相同的值。 - sabujp

8
我正在使用Debian,但这个解决方案在Ubuntu上也应该能正常工作。
您需要在neo4j-service脚本中添加一行。
这是我所做的:

nano /etc/init.d/neo4j-service
do_start sectionstart-stop-daemon line之前添加“ulimit -n 40000

请注意,我使用的是2.0企业版。 希望这能帮到您。

13
值得一提的是,在Ubuntu Server 14.04上不存在这样的脚本。我的解决方案可以在此问题中找到(以及lornix的答案):http://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user -- 简而言之,您需要编辑/etc/security/limits.conf/etc/pam.d/common-session* - Lambart
1
我看到原问题提问者顺便提到了neo4j。这似乎与Ubuntu没有任何关系,因此可能应该将其加入问题的主题中。 - Lambart
在Ubuntu 14.04中,确实存在一个/etc/init.d/neo4j-service文件,Martin Larivière是正确的,插入uname -n 40000可以解决问题。我不知道Ubuntu Server和Ubuntu之间的区别,所以也许你也是对的,我只是想澄清Martin写的内容可以解决纯净的Ubuntu 14.04中的问题。 - Grégoire C
3
在neo4j-service的情况下,“common-session-*”技巧不起作用,因为neo4j-service基于“start-stop-daemon”,而“start-stop-daemon”根本不利用PAM。唯一的解决办法确实是在init脚本中添加一个明确的“ulimit -n xxx”调用。 - David Ammouial
2
这不是一个解决方案,而是一种权宜之计。 - Tim Wachter

3

我曾经遇到同样的问题,通过添加内容到/etc/security/limits.d/90-somefile.conf文件中解决了这个问题。请注意,在查看限制是否生效时,我必须完全注销ssh会话,然后重新登录。

我想为运行服务的特定用户设置限制,但似乎我获取的是登录用户的限制。以下示例说明了ulimit如何基于已认证的用户而非有效用户进行设置:

$ sudo cat /etc/security/limits.d/90-nofiles.conf
loginuser    soft    nofile   10240
loginuser    hard    nofile   10240
root         soft    nofile   10241
root         hard    nofile   10241
serviceuser  soft    nofile   10242
serviceuser  hard    nofile   10242

$ whoami
loginuser
$ ulimit -n
10240
$ sudo -i
# ulimit -n
10240    # loginuser's limit
# su - serviceuser
$ ulimit -n
10240    # still loginuser's limit.

您可以使用*来为所有用户指定增加量。如果我以登录的用户身份重新启动服务,并在init脚本中添加ulimit -n,则我会看到初始登录用户的限制已生效。我还没有机会验证系统启动时使用哪个用户的限制,或确定我正在运行的服务的实际nofile限制(该服务是使用start-stop-daemon启动的)。
目前有两种方法可行:
  1. 在start-stop-daemon之前,在init脚本中添加ulimit调整。
  2. 在安全文件中使用通配符或更广泛的ulimit设置。

当我按照你的步骤(从“whoami”开始)操作时,我首先得到1024,然后是65536(对于root),然后是用户的65536。但第一个是相同的用户。你能解释一下这是为什么吗?我感到困惑。 - Danielson
这听起来很奇怪。你怎么从用户切换到根,然后再切回用户?设置完文件后,你是否完全退出了登录?取决于你如何返回用户,最初可能处于缓存会话中,然后使用新会话。 - Brett
我一直在重启,只是为了确保。还尝试设置/etc/sysctl.conf -> fs.file-max = 1000000以全局方式修复所有用户,但也没有结果。就像有一个进程在无视我一样。我按照你描述的方法从用户切换到根用户再切换回用户,使用su - my_user_name。这表明系统知道应该为该用户使用什么,但实际上并没有... - Danielson

2
尝试运行此命令,它将在/etc/security/limits.d目录下创建一个*_limits.conf文件。
echo "* soft nofile 102400" > /etc/security/limits.d/*_limits.conf && echo "* hard nofile 102400" >> /etc/security/limits.d/*_limits.conf

只需从终端退出并重新登录,然后通过ulimit -n进行验证,它将设置为所有用户。


简单易懂的答案。 - sumanth

2

我是这样做的

echo "NEO4J_ULIMIT_NOFILE=50000" >> neo4j
mv neo4j /etc/default/

2
你可以修改neo4j的初始化脚本,在运行neo4j之前执行ulimit -n 40000
然而,我不禁感到你可能走错了方向。 neo4j是否真的需要超过10,000个打开文件描述符?这听起来非常像neo4j中的一个错误或者你使用它的方式有问题。我建议你尝试解决这个问题。

我使用 neo4j start 启动 neo4j。我在哪里可以找到它的初始化脚本? - theharshest
在启动 neo4j 之前尝试输入 ulimit -n 40000 - abligh

2

我在让这个工作上遇到了很多麻烦。

使用以下命令可以使您无论用户权限如何都可以更新它。

sudo sysctl -w fs.inotify.max_user_watches=100000

编辑

刚刚看到另一个用户也在另一个stackexchange网站上发表了类似的内容(两者都可以,但是这个版本永久性地更新了系统设置,而不是暂时性的):

echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; 
sudo sysctl -p

2

简述:在软限制和硬限制中都设置。

我确定这是按预期工作的,但为了完整起见,我将在此添加它。 限制在此处设置(有关语法,请参见下文): /etc/security/limits.conf

some_user       soft    nofile          60000
some_user       hard    nofile          60000

并在 /etc/pam.d/common-session 中激活以下内容:

session required pam_limits.so

如果只设置硬限制,则ulimit -a将显示默认值(1024): 如果只设置软限制,ulimit -a将显示(4096)。 如果两者都设置,则ulimit -a将显示软限制(当然是在硬限制之内)。

1
ULIMIT配置:
  1. Login by root
  2. vi security/limits.conf
  3. Make Below entry

    Ulimit configuration start for website user

    website   soft   nofile    8192
    website   hard   nofile    8192
    website   soft   nproc    4096
    website   hard   nproc    8192
    website   soft   core    unlimited
    website   hard   core    unlimited
    
  4. Make Below entry for ALL USER

    Ulimit configuration for every user

    *   soft   nofile    8192
    *   hard   nofile    8192
    *   soft   nproc    4096
    *   hard   nproc    8192
    *   soft   core    unlimited
    *   hard   core    unlimited
    
  5. After modifying the file, user need to logoff and login again to see the new values.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接