Ubuntu 16.04下使用systemd启动redis时遇到ulimit问题

14

我在从Ubuntu 14.04升级到16.04后,我们的新redis服务器出现了问题。 所有指南都建议使用以下设置更改/ etc / security / limits.conf中的打开文件限制配置:

*    soft nofile 65535
*    hard nofile 65535
root soft nofile 65535
root hard nofile 65535

另外还需要添加到 /etc/pam.d/common-session 和 /etc/pam.d/common-session-noninteractive 中。

session required pam_limits.so

我已经进行了所有这些更改但是redis仍然以4096的文件限制启动,而在生产负载下我们很快就达到最大连接数。

2个回答

34

经过很多搜索,我终于发现systemd有一个标准限制为4096,而无论您在系统级别上设置什么,systemd级别将始终优先。解决此问题的方法是通过编辑/etc/systemd/system.conf来更改systemd打开文件限制,并添加以下设置:

DefaultLimitNOFILE=65536

看起来systemd中有许多默认设置会覆盖系统设置,因此必须在systemd中进行设置。

因此,如果对人们有用的话,这是我的Ubuntu 16.04服务器的最终设置,用于运行生产Redis。

编辑/etc/systemd/system.conf(sudo nano /etc/systemd/system.conf)并添加:

DefaultLimitNOFILE=65536

编辑/etc/security/limits.conf文件(sudo nano /etc/security/limits.conf)并添加以下内容:

*    soft nofile 64000
*    hard nofile 64000
root soft nofile 64000
root hard nofile 64000

编辑/etc/pam.d/common-session (sudo nano /etc/pam.d/common-session),并添加

session required pam_limits.so

编辑 /etc/pam.d/common-session-noninteractive(sudo nano /etc/pam.d/common-session-noninteractive)并添加:

session required pam_limits.so

编辑/etc/rc.local文件(sudo nano /etc/rc.local),并添加以下内容

sysctl -w net.core.somaxconn=65535

编辑/etc/sysctl.conf (sudo nano /etc/sysctl.conf)并添加

vm.overcommit_memory = 1

编辑 /etc/rc.local 文件 (sudo nano /etc/rc.local),然后添加以下内容

echo never > /sys/kernel/mm/transparent_hugepage/enabled

1
很棒的答案!DefaultLimitNOFILE就是我所缺少的。 - redgeoff
谢谢Ollie。这解决了我遇到的所有问题。完美。 - user785717
虽然这已经很老了:您能否详细说明您所做的设置及其作用以及为什么需要它们?我显然理解所有内容都是为了有效地设置文件数量,但对于一个不太深入系统管理的人来说,理解所有这些内容是困难的。 - Worp
嗯,当我重新启动Redis时,我仍然会收到投诉 :/ - shaneonabike
1
@worp - 这是几年前大约两周的谷歌搜索结果,我不是Linux专家,所以当时进行了大量的研究,但现在无法详细回答每个原因的原因。 - Ollie
显示剩余3条评论

1

sysctl值net.core.somaxconnvm.overcommit_memory与ulimit或打开文件的数量无关。

如果您的问题与打开文件的限制有关(即ulimit -Sn/-Hn处理的内容),则我不建议您进行调整,除非您确切知道自己在做什么。


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