C语言_linxu epoll问题
21视频教程网C语言编辑部3月21日整理
学生:
我测试了网络上一些epoll通用模型,访问量很少没问题。
我做了个测试客户端并发50线程,就出现too many open files 错误提示, fd 不够的问题,有没有人解决过这个问题,
不是通过修改系统文件描述符数量解决。这个应该是epoll的问题
C语言编辑部:
理论上是没有限制的,但实际上受到系统能打开的文件描述符的个数和系统设置的epoll可以检测的个数,分别在
/proc/sys/fs/file-max
/proc/sys/fs/epoll/max_user_watches
学生:
你说的情况我都设置过,我把FD开到最大数量,还是出这个问题,所以我说不要从这个方面解决问题,
一定是epoll本身的close(fd)有疏漏,我查了很多地方,该加fd的地方都加了,还是出现这个情况,
看了网上有建议,开个线程,用定时器监控所有fd,超时自动关闭,这个方法可以解决,但是我想这样
解决由几个问题,一是增加了系统的开销,另外epoll没这么弱吧
C语言编辑部:
/proc/sys/fs/epoll/max_user_watches
这个值查看过吗?
这个值就是用来显示epoll监视个数的,而不是与fd相关
epoll与文件描述符相关的错误只有两个(第一个 EMFILE与epoll相关,第二个ENFILE有系统fd相关):
EMFILE:
The per-user limit on the number of epoll instances imposed by /proc/sys/fs/epoll/max_user_instances was encountered. (有的系统是/proc/sys/fs/epoll/max_user_watches)
ENFILE:
The system limit on the total number of open files has been reach
如果你的程序返回的错误是Too many open files那么就是发生了错误值为EMFILE的错误。
用下面的程序测试一下,就可以确定EMFILE错误的信息就是Too many open files。
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
extern int errno;
int main(void)
{
errno = EMFILE;
perror("error is");
return 0;
}
如果改完那个文件的值后还不行,可以重启一下网络服务
如果不是/proc/sys/fs/epoll/max_user_watches的问题那么很可能是资源限制造成的,限制了每一个进程打开的fd数,他也会返回EMFILE的错误。
#include <unistd.h>
#include <stdio.h>
#include <sys/resource.h>
int main(void)
{
struct rlimit rlim;
getrlimit( RLIMIT_NOFILE , &rlim);
printf( "MFDS is %ld\nCFDS is %ld\n" , rlim.rlim_max , rlim.rlim_cur);
return 0;
}
运行这个程序查询一下你的系统对进程资源的限制,如果是这个原因可以调用setrlimit修改RLIMIT_NOFILE,把这个数改大,该操作需要root用户权限
C语言编辑部结
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |