|
最近在翻阅memcached的源码,发现一个很有用且很实用的小功能。
由于经常开发Linux程序,有时候运营的同事部署生产环境的时候,在机器多的时候,忘了设置并行文件句柄打开数,这个错误有时不易察觉,等触发服务器错误的时候,有时候会造成不小的损失。
一直在想有没有类似的方法,可以让程序去做这件事。如果达不到并行文件数,程序就会自动修正这个数值并启动。由于前一阶段任务比较忙,一直没有时间细纠这个问题。
最近晚上在看一些成熟开源的代码,发现里面不少干货,于是点滴的记录并测试运行,改造成符合我的口味,然后,放入我的PSS开源服务器中,并更新生产环境,聚沙成塔么。
来看看Linux下强大的功能吧。- //获得当前文件打开数
- int Checkfilelimit(int nMaxOpenFile)
- {
- //获得当前文件打开数
- struct rlimit rfilelimit;
-
- if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
- return -1;
- }
- else
- {
- //提示同时文件打开数不足,需要设置。
- if((int)rfilelimit.rlim_cur < nMaxOpenFile)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]rlim.rlim_cur=%d, nMaxOpenFile=%d, openfile is not enougth, please check [ulimit -a].\n", (int)rfilelimit.rlim_cur, nMaxOpenFile));
- return -1;
- }
- }
-
- return 0;
- }
复制代码 这个小函数,就是判定当前OS是否有满足我程序最大连接数的并行文件句柄
当然,我需要两个头文件。
#include <sys/time.h>
#include <sys/resource.h>
nMaxOpenFile 这就是我需要的最大文件句柄数,比如,我的PSS需要至少并行5000个TCP连接,我就可以在这里设置成5000,如果低于这个数字,程序就提示并退出。
其实,我们完全可以临时提高Ulimit的并行文件数。但是切记,这有一个弱点,如果你的程序所在权限没有管理员权限,则setrlimit会提示执行失败,没有权限。
那么看看,如何临时提高呢?
把Checkfilelimit稍微改一下,加几行代码:- //获得当前文件打开数
- int Checkfilelimit(int nMaxOpenFile)
- {
- //获得当前文件打开数
- struct rlimit rfilelimit;
-
- if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
- return -1;
- }
- else
- {
- //提示同时文件打开数不足,需要设置。
- if((int)rfilelimit.rlim_cur < nMaxOpenFile)
- {
- //尝试临时提高并行文件数
- rfilelimit.rlim_cur = (rlim_t)nMaxOpenFile;
- rfilelimit.rlim_max = (rlim_t)nMaxOpenFile;
- if (setrlimit(RLIMIT_NOFILE, &rfilelimit)!= 0)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to setrlimit number of files.\n"));
- return -1;
- }
-
- //如果修改成功,再次检查一下
- if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
- return -1;
- }
-
- //再次检查修改后的文件句柄数
- if((int)rfilelimit.rlim_cur < nMaxOpenFile)
- {
- OUR_DEBUG((LM_INFO, "[Checkfilelimit]rlim.rlim_cur=%d, nMaxOpenFile=%d, openfile is not enougth, please check [ulimit -a].\n", (int)rfilelimit.rlim_cur, nMaxOpenFile));
- }
- return -1;
- }
- }
-
- return 0;
- }
复制代码 好了,编译,运行,完全得到了我想要的效果。
运维人员也得到了解放。
|
|