| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1291 人关注过本帖
标题:linxu epoll问题,高手来指点或者探讨
只看楼主 加入收藏
windycat
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-3-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
linxu epoll问题,高手来指点或者探讨
我测试了网络上一些epoll通用模型,访问量很少没问题。
我做了个测试客户端并发50线程,就出现too many open files 错误提示, fd 不够的问题,有没有人解决过这个问题,
不是通过修改系统文件描述符数量解决。这个应该是epoll的问题
搜索更多相关主题的帖子: 探讨 linxu epoll 
2010-03-20 20:15
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 楼主 windycat
理论上是没有限制的,但实际上受到系统能打开的文件描述符的个数和系统设置的epoll可以检测的个数,分别在
/proc/sys/fs/file-max
/proc/sys/fs/epoll/max_user_watches

身体是玩命的本钱
2010-03-20 21:29
windycat
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-3-16
收藏
得分:0 
回复 2楼 zhddragon
你说的情况我都设置过,我把FD开到最大数量,还是出这个问题,所以我说不要从这个方面解决问题,
一定是epoll本身的close(fd)有疏漏,我查了很多地方,该加fd的地方都加了,还是出现这个情况,
看了网上有建议,开个线程,用定时器监控所有fd,超时自动关闭,这个方法可以解决,但是我想这样
解决由几个问题,一是增加了系统的开销,另外epoll没这么弱吧
2010-03-20 22:00
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 3楼 windycat
/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

身体是玩命的本钱
2010-03-20 22:12
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
如果你的程序返回的错误是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;
}

如果改完那个文件的值后还不行,可以重启一下网络服务

身体是玩命的本钱
2010-03-20 22:24
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:20 
如果不是/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用户权限

身体是玩命的本钱
2010-03-21 00:42
快速回复:linxu epoll问题,高手来指点或者探讨
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023610 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved