今天在大宝的blog里看到一篇文章,<linux下更改默认句柄数的方法>:
linux下, 单个进程默认打开的最多socket是1021个, 其实是1024, 其它三个分别被: stderr, stdin, stdout占用.
想到这个数据肯定不能满足我们的服务器需求,于是到我们server启动脚本里查看修改这个限制的地方,但是居然
木有找到,只是有ulimit -c unlimited(core文件的大小限制),ulimit -s 102400(堆栈的大小设置),没有ulimit -HSn。
还以为悲剧了,我们的服务器限制了1024!!
上网找到一个命令可以查看进程所有打开的文件描述的数量(# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more)
(http://news.csdn.net/n/20070613/105245.html)
4282 5661
262 21404
服务器进程5661,打开了4282个文件描述符。
于是两个问题:1 为什么不是1024的限制? 2 为什么有那么多的文件描述符打开了?
总结:
1) 文件描述符限制查看:ulimit -a 或者 ulimit -n
2) 限制的设置:ulimit -HSn 大小 或者 rlimit rt; rt.rlim_max = rt.rlim_cur = 大小;INT iSetRet = setrlimit(RLIMIT_NOFILE, &rt);
参考文章:http://blog.sina.com.cn/s/blog_5c93b2ab0100p230.html
linux下, 单个进程默认打开的最多socket是1021个, 其实是1024, 其它三个分别被: stderr, stdin, stdout占用.
想到这个数据肯定不能满足我们的服务器需求,于是到我们server启动脚本里查看修改这个限制的地方,但是居然
木有找到,只是有ulimit -c unlimited(core文件的大小限制),ulimit -s 102400(堆栈的大小设置),没有ulimit -HSn。
还以为悲剧了,我们的服务器限制了1024!!
上网找到一个命令可以查看进程所有打开的文件描述的数量(# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more)
(http://news.csdn.net/n/20070613/105245.html)
4282 5661
262 21404
服务器进程5661,打开了4282个文件描述符。
于是两个问题:1 为什么不是1024的限制? 2 为什么有那么多的文件描述符打开了?
第一个问题是,因为设置文件描述符的限制不止可以在shell脚本里做,还能在程序里做,而我们的server就在程序里做了。
第二个,打开一个文件就算一个,我们有2千多个场景,如果每个场景有打开二个,就有那么多(这里还不知道什么东西需要在每个场景里打开)。
总结:
1) 文件描述符限制查看:ulimit -a 或者 ulimit -n
2) 限制的设置:ulimit -HSn 大小 或者 rlimit rt; rt.rlim_max = rt.rlim_cur = 大小;INT iSetRet = setrlimit(RLIMIT_NOFILE, &rt);
参考文章:http://blog.sina.com.cn/s/blog_5c93b2ab0100p230.html