在Ubuntu 16上运行CouchDB的emfile错误

时间:2016-12-12 14:57:42

标签: ubuntu couchdb ubuntu-16.04 systemd

我最近升级到Ubuntu 16和CouchDB 1.6。当我的服务器受到大量连接的攻击时,我在couch.log中出现emfile错误。我之前看到过这些错误,它们似乎与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"添加到/etc/systemd/system/multi-user.target.wants/couchdb.service中的[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上解决这个问题?

1 个答案:

答案 0 :(得分:7)

我偶然发现了https://stackoverflow.com/a/39506150/2831606,这是我需要让这个工作失踪的金块。

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

DefaultLimitNOFILE=40000

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

让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

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

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

echo "DefaultLimitNOFILE=40000" >> /etc/systemd/system.conf

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

sed -i "s/\[Service\]/\[Service\]\nEnvironment=ERL_MAX_PORTS=40000/g" /etc/systemd/system/multi-user.target.wants/couchdb.service

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

echo "export ERL_MAX_PORTS=40000" >> /etc/default/couchdb

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