freeeyes 发表于 2013-9-25 11:02:14

Linux下自动检测并设置并行文件打开数

最近在翻阅memcached的源码,发现一个很有用且很实用的小功能。
由于经常开发Linux程序,有时候运营的同事部署生产环境的时候,在机器多的时候,忘了设置并行文件句柄打开数,这个错误有时不易察觉,等触发服务器错误的时候,有时候会造成不小的损失。
一直在想有没有类似的方法,可以让程序去做这件事。如果达不到并行文件数,程序就会自动修正这个数值并启动。由于前一阶段任务比较忙,一直没有时间细纠这个问题。
最近晚上在看一些成熟开源的代码,发现里面不少干货,于是点滴的记录并测试运行,改造成符合我的口味,然后,放入我的PSS开源服务器中,并更新生产环境,聚沙成塔么。
来看看Linux下强大的功能吧。//获得当前文件打开数
int Checkfilelimit(int nMaxOpenFile)
{
      //获得当前文件打开数
      struct rlimit rfilelimit;
      
         if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
         {
                OUR_DEBUG((LM_INFO, "failed to getrlimit number of files.\n"));
         return -1;
}
else
{
          //提示同时文件打开数不足,需要设置。
          if((int)rfilelimit.rlim_cur < nMaxOpenFile)
          {
                  OUR_DEBUG((LM_INFO, "rlim.rlim_cur=%d, nMaxOpenFile=%d, openfile is not enougth, please check .\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, "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, "failed to setrlimit number of files.\n"));
                           return -1;
                  }
                  
                  //如果修改成功,再次检查一下
                        if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
                         {
                              OUR_DEBUG((LM_INFO, "failed to getrlimit number of files.\n"));
                           return -1;
                  }               
                  
                  //再次检查修改后的文件句柄数
                  if((int)rfilelimit.rlim_cur < nMaxOpenFile)
                  {
                        OUR_DEBUG((LM_INFO, "rlim.rlim_cur=%d, nMaxOpenFile=%d, openfile is not enougth, please check .\n", (int)rfilelimit.rlim_cur, nMaxOpenFile));
                  }
                  return -1;
          }
}
                  
return 0;
}好了,编译,运行,完全得到了我想要的效果。
运维人员也得到了解放。

winston 发表于 2013-9-25 16:51:43

这些很有用的。
页: [1]
查看完整版本: Linux下自动检测并设置并行文件打开数