<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>~iany/ Performance</title><link>https://blog.iany.me/zh/tags/performance/</link><description>Performance的最新内容 «~iany/»</description><language>zh-CN</language><managingEditor>me@iany.me (Ian Yang)</managingEditor><webMaster>me@iany.me (Ian Yang)</webMaster><copyright>CC-BY-SA 4.0</copyright><lastBuildDate>Sun, 09 Apr 2017 20:03:10 +0800</lastBuildDate><atom:link href="https://blog.iany.me/zh/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux nofile 限制</title><link>https://blog.iany.me/zh/2017/04/linux-nofile-limit/</link><pubDate>Sun, 09 Apr 2017 20:03:10 +0800</pubDate><author>me@iany.me (Ian Yang)</author><guid>https://blog.iany.me/zh/2017/04/linux-nofile-limit/</guid><description>&lt;p&gt;在上一次游戏测试中，因为用了新的机器，并且从 ansible 切换到了 salt stack，其中 &lt;code&gt;nofile&lt;/code&gt; 相关的配置步骤漏掉了，结果所有进程的 &lt;code&gt;nofile&lt;/code&gt; 限制是默认的 1024。结果就是当在线人数达到一定数据之后，出现大量 lua 找不到文件的错误，导致后来的玩家没法登录，已经在线的玩家也没法正常游戏。&lt;/p&gt;
&lt;p&gt;开发服务端程序，&lt;code&gt;nofile&lt;/code&gt; 是很重要的配置。它限制了一个进程最多能够打开的文件数量。对于高并发的服务，每个连接都会打开一些文件，尤其是使用像 Lua 这样的脚本语言，更是要打开大量的文件。&lt;/p&gt;
&lt;p&gt;当前的限制可以使用 &lt;code&gt;ulimit -a&lt;/code&gt; 查看。&lt;/p&gt;
&lt;p&gt;要修改也比较简单，以 Ubuntu 为例，最简单的就是修改 &lt;code&gt;/etc/security/limits.conf&lt;/code&gt;，在该文件中添加下面内容即可，不需要重启，新创建的进程会使用新的配置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* hard nofile 1000000
* soft nofile 1000000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用来做服务器的机器最好默认都设置得高一些。并且自动化的在所有的新机器上应用。&lt;/p&gt;
&lt;p&gt;如果是通过 upstart, supervisor 等工具来启动服务，也可以只改对应的启动器配置。&lt;/p&gt;
&lt;p&gt;Supervisor 需要修改 &lt;code&gt;supervisord.conf&lt;/code&gt;，在 &lt;code&gt;[supervisord]&lt;/code&gt; 小节中设置 &lt;code&gt;minfds&lt;/code&gt;，需要重启 Supervisor 本身。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[supervisord]
minfds = 1000000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Upstart 是 Ubuntu 之前使用的 init，可以在服务的配置文件里添加下面配置。需要重启服务才能生效。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;limit nofile 1000000 1000000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果在 macOS 中需要做压力测试之类的，将下面文件保存成 &lt;code&gt;/Library/LaunchDaemons/limit.maxfiles.plist&lt;/code&gt; 并重启。文件来自 Riak 的文档 &lt;a href="https://docs.riak.com/riak/kv/2.0.2/using/performance/open-files-limit/"&gt;Open Files Limit&lt;/a&gt;，里面有更详细的各个平台下的配置方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;
&amp;lt;dict&amp;gt;
&amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;limit.maxfiles&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
&amp;lt;string&amp;gt;launchctl&amp;lt;/string&amp;gt;
&amp;lt;string&amp;gt;limit&amp;lt;/string&amp;gt;
&amp;lt;string&amp;gt;maxfiles&amp;lt;/string&amp;gt;
&amp;lt;string&amp;gt;200000&amp;lt;/string&amp;gt;
&amp;lt;string&amp;gt;200000&amp;lt;/string&amp;gt;
&amp;lt;/array&amp;gt;
&amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;
&amp;lt;true/&amp;gt;
&amp;lt;key&amp;gt;ServiceIPC&amp;lt;/key&amp;gt;
&amp;lt;false/&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description><category domain="https://blog.iany.me/zh/">~iany/</category><category domain="https://blog.iany.me/zh/tags/linux/">Linux</category><category domain="https://blog.iany.me/zh/tags/performance/">Performance</category><category domain="https://blog.iany.me/zh/tags/system-admin/">System Admin</category></item></channel></rss>