在Ubuntu 16上运行CouchDB的emfile错误

red*_*off 4 ubuntu couchdb systemd ubuntu-16.04

我最近升级到Ubuntu 16和CouchDB 1.6.当我的服务器受到大量连接emfile的攻击时,我在couch.log中遇到错误.我之前看到过这些错误,它们似乎与https://wiki.apache.org/couchdb/Performance中提到的系统资源限制有关.我相信我的主要问题是ERL_MAX_PORTS.我已经将ulimit增加到40000(通过PAM)并添加export ERL_MAX_PORTS=40000到/ etc/default/couchdb.

Ubuntu 16使用systemd所以我添加Environment="ERL_MAX_PORTS=40000"到[Service]/etc/systemd/system/multi-user.target.wants/couchdb.service中的部分,但这似乎不起作用.

我甚至尝试修改/ usr/bin/couchdb并添加env ERL_MAX_PORTS=40000到脚本的顶部.

唯一可行的是当我从命令行手动运行couchdb时,例如$ env ERL_MAX_PORTS=40000 && sudo /usr/bin/couchdb.这不是一个理想的解决方案,我宁愿让它与systemd一起工作.

我以前在Ubuntu 14上运行CouchDB 1.5并将我的系统资源限制(请参阅https://wiki.apache.org/couchdb/Performance)增加到大约40000,并且它正在处理许多连接而没有任何问题.

有没有人有幸在Ubuntu 16上解决这个问题?

red*_*off 7

我偶然发现了/sf/answers/2765430531/,这是我需要让它工作的缺失金块.

具体来说,我不得不修改/etc/systemd/system.conf并添加

DefaultLimitNOFILE=40000
Run Code Online (Sandbox Code Playgroud)

总而言之,这是我的配置:

让100-couchdb.conf成为:

#<domain>    <type>    <item>    <value>
couchdb      hard      nofile    40000
couchdb      soft      nofile    40000
*            hard      nofile    40000
*            soft      nofile    40000
root         hard      nofile    40000
root         soft      nofile    40000
Run Code Online (Sandbox Code Playgroud)

1)通过PAM设置限制:

cp 100-couchdb.conf /etc/security/limits.d/100-couchdb.conf
cp 100-couchdb.conf /etc/security/limits.conf
echo "session    required   pam_limits.so" >> /etc/pam.d/su
Run Code Online (Sandbox Code Playgroud)

2)增加systemd中允许的文件数

echo "DefaultLimitNOFILE=40000" >> /etc/systemd/system.conf
Run Code Online (Sandbox Code Playgroud)

3)通过systemd增加Erlang允许的连接数

sed -i "s/\[Service\]/\[Service\]\nEnvironment=ERL_MAX_PORTS=40000/g" /etc/systemd/system/multi-user.target.wants/couchdb.service
Run Code Online (Sandbox Code Playgroud)

4)同时增加Erlang允许的连接数(我不确定是否需要这个,因为我们已经通过systemd配置了这个,但它似乎没有受到伤害)

echo "export ERL_MAX_PORTS=40000" >> /etc/default/couchdb
Run Code Online (Sandbox Code Playgroud)

注意:在运行一些压力测试时,我发现我需要将限制增加到大约40000以支持10,000个并发连接.我猜这是由于某些开销,每个连接需要多个文件.