免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10561 | 回复: 37
打印 上一主题 下一主题

[C] 探讨一个读文件内核IO cache的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-20 15:08 |只看该作者 |倒序浏览
最近大数据做索引的时候发现的一个问题, 只要是读很频繁的, 系统内存不停的增长,
我在os x 和 linux测试都是这样, 这个不是内存泄露的问题, 我认为是内核对文件做cache的问题.
os x会影响系统性能, linux只要内存用光以后会明显的想能下降, 有哪位遇到过或者解决过这样的问题, 按理应该是可以设置内核cache的.


  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #include <errno.h>
  7. #define BUF_SIZE 1024 * 1024 * 8
  8. // gcc -o test test.c -D_FILE_OFFSET_BITS=64
  9. int main(int argc, char **argv)
  10. {
  11.         int fd = 0, n = 0, i = 0;
  12.         char *s = (char *)calloc(1, BUF_SIZE);
  13.     if(argc < 2)
  14.     {
  15.         fprintf(stderr, "Usage:%s hispider_file\n", argv[0]);
  16.         _exit(-1);
  17.     }
  18.     for(i = 1; i < argc; i++)
  19.     {
  20.         if((fd = open(argv[i], O_RDONLY)) > 0)
  21.         {
  22.             n = 0;
  23.             while((read(fd, s, BUF_SIZE)) > 0)n++;
  24.             fprintf(stdout, "times:%d\n", n);
  25.             close(fd);
  26.         }
  27.         else
  28.         {
  29.             fprintf(stderr, "open file failed, %s\n", strerror(errno));
  30.         }
  31.     }
  32.     if(s) free(s);
  33.         return 0;
  34. }

复制代码

论坛徽章:
0
2 [报告]
发表于 2009-01-20 15:41 |只看该作者
原帖由 redor 于 2009-1-20 15:08 发表
最近大数据做索引的时候发现的一个问题, 只要是读很频繁的, 系统内存不停的增长,
我在os x 和 linux测试都是这样, 这个不是内存泄露的问题, 我认为是内核对文件做cache的问题.
os x会影响系统性能, linux只要 ...


是的,不管是在Linux还是Windows上面,都会对读写的文件在内核中进行cache。
对于Linux,可以使用free -m,查看此时Cache的文件大小,在最后面一栏。
如果想将文件cache清空,则运行
sync && echo 3 > /proc/sys/vm/drop_caches

论坛徽章:
0
3 [报告]
发表于 2009-01-22 14:01 |只看该作者
原帖由 scutan 于 2009-1-20 15:41 发表


是的,不管是在Linux还是Windows上面,都会对读写的文件在内核中进行cache。
对于Linux,可以使用free -m,查看此时Cache的文件大小,在最后面一栏。
如果想将文件cache清空,则运行
sync && echo 3 > / ...



你的方法管用, 呵呵


不过我已经用了办法解决这个占内存的问题了, open(file, |O_DIRECT) or fcntl(fd, F_NOCACHE, 1);

论坛徽章:
0
4 [报告]
发表于 2009-01-22 14:18 |只看该作者
个人觉得没必要这么做,能使用cache不是更好吗。
内存不足的时候,肯定会减少cache大小的。还是那个理念:空闲的内存不用白不用。

论坛徽章:
0
5 [报告]
发表于 2009-01-22 22:50 |只看该作者
原帖由 Sorehead 于 2009-1-22 14:18 发表
个人觉得没必要这么做,能使用cache不是更好吗。
内存不足的时候,肯定会减少cache大小的。还是那个理念:空闲的内存不用白不用。



linux下你说的办法是可行的, OS X 下就不是这样了, 内存被cache占了速度越来越慢, 我刚刚测试了一下, linux还在做swap, 我14G内存也搞swap......
不知道BSD下的实现是否需要设置关闭cache?

论坛徽章:
0
6 [报告]
发表于 2009-01-23 07:27 |只看该作者
这个应该叫文件通道缓存,用来提高文件访问效率的。
你将其清空,仍占同样大小的空间。要等文件关闭时才回收这块空间。

论坛徽章:
0
7 [报告]
发表于 2009-01-23 09:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2009-01-23 11:44 |只看该作者
操作系统应该提供设置cache最大值的功能吧

论坛徽章:
0
9 [报告]
发表于 2009-01-23 12:27 |只看该作者
原帖由 redor 于 2009-1-22 22:50 发表



linux下你说的办法是可行的, OS X 下就不是这样了, 内存被cache占了速度越来越慢, 我刚刚测试了一下, linux还在做swap, 我14G内存也搞swap......
不知道BSD下的实现是否需要设置关闭cache?

实践出真知

论坛徽章:
0
10 [报告]
发表于 2009-01-23 12:29 |只看该作者
原帖由 jamesr 于 2009-1-23 09:46 发表
有看到一个想关闭cache的。

不用cache只有两种情况:
1、cache不能用;
2、数据只流过一次,只需buffer就行了。

无论如何direct IO都是最慢的。


前提很重要,取决应用的具体需求情况. 而且有时候有个定性和定量的问题.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP