找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3790|回复: 1

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

[复制链接]
发表于 2013-9-25 11:02:14 | 显示全部楼层 |阅读模式
最近在翻阅memcached的源码,发现一个很有用且很实用的小功能。
由于经常开发Linux程序,有时候运营的同事部署生产环境的时候,在机器多的时候,忘了设置并行文件句柄打开数,这个错误有时不易察觉,等触发服务器错误的时候,有时候会造成不小的损失。
一直在想有没有类似的方法,可以让程序去做这件事。如果达不到并行文件数,程序就会自动修正这个数值并启动。由于前一阶段任务比较忙,一直没有时间细纠这个问题。
最近晚上在看一些成熟开源的代码,发现里面不少干货,于是点滴的记录并测试运行,改造成符合我的口味,然后,放入我的PSS开源服务器中,并更新生产环境,聚沙成塔么。
来看看Linux下强大的功能吧。
  1. //获得当前文件打开数
  2. int Checkfilelimit(int nMaxOpenFile)
  3. {
  4.         //获得当前文件打开数
  5.         struct rlimit rfilelimit;
  6.         
  7.          if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
  8.          {
  9.                 OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
  10.            return -1;
  11.   }
  12.   else
  13.   {
  14.           //提示同时文件打开数不足,需要设置。
  15.           if((int)rfilelimit.rlim_cur < nMaxOpenFile)
  16.           {
  17.                   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));
  18.                   return -1;
  19.           }
  20.   }
  21.                   
  22.   return 0;
  23. }
复制代码
这个小函数,就是判定当前OS是否有满足我程序最大连接数的并行文件句柄
当然,我需要两个头文件。
#include <sys/time.h>
#include <sys/resource.h>

nMaxOpenFile 这就是我需要的最大文件句柄数,比如,我的PSS需要至少并行5000个TCP连接,我就可以在这里设置成5000,如果低于这个数字,程序就提示并退出。
其实,我们完全可以临时提高Ulimit的并行文件数。但是切记,这有一个弱点,如果你的程序所在权限没有管理员权限,则setrlimit会提示执行失败,没有权限。
那么看看,如何临时提高呢?
Checkfilelimit稍微改一下,加几行代码:
  1. //获得当前文件打开数
  2. int Checkfilelimit(int nMaxOpenFile)
  3. {
  4.         //获得当前文件打开数
  5.         struct rlimit rfilelimit;
  6.         
  7.          if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
  8.          {
  9.                 OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
  10.            return -1;
  11.   }
  12.   else
  13.   {
  14.           //提示同时文件打开数不足,需要设置。
  15.           if((int)rfilelimit.rlim_cur < nMaxOpenFile)
  16.           {
  17.                   //尝试临时提高并行文件数
  18.                   rfilelimit.rlim_cur = (rlim_t)nMaxOpenFile;
  19.                   rfilelimit.rlim_max = (rlim_t)nMaxOpenFile;
  20.                   if (setrlimit(RLIMIT_NOFILE, &rfilelimit)!= 0)
  21.                   {
  22.                           OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to setrlimit number of files.\n"));
  23.                            return -1;
  24.                   }
  25.                   
  26.                   //如果修改成功,再次检查一下
  27.                         if (getrlimit(RLIMIT_NOFILE, &rfilelimit) != 0)
  28.                          {
  29.                                 OUR_DEBUG((LM_INFO, "[Checkfilelimit]failed to getrlimit number of files.\n"));
  30.                            return -1;
  31.                   }                 
  32.                   
  33.                   //再次检查修改后的文件句柄数
  34.                   if((int)rfilelimit.rlim_cur < nMaxOpenFile)
  35.                   {
  36.                           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));
  37.                   }
  38.                   return -1;
  39.           }
  40.   }
  41.                   
  42.   return 0;
  43. }
复制代码
好了,编译,运行,完全得到了我想要的效果。
运维人员也得到了解放。
发表于 2013-9-25 16:51:43 | 显示全部楼层
这些很有用的。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-30 07:10 , Processed in 0.016287 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表