我最近升级到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上解决这个问题?
答案 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个并发连接。我猜这是由于某些开销,每个连接需要多个文件。