免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: redor
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2009-02-05 15:18 |只看该作者
原帖由 jamesr 于 2009-2-5 14:43 发表
能说说你是怎么测试的吗?
别告诉我你所谓的性能下降就是唤醒一个被swap到磁盘的程序时间变长了。



我实际测试的例子就是一直读不断增大的文件然后处理数据发给另外一个服务

我写了一个写 和 读文件的例子看看, 大家有兴趣都测试一下 看看是否会出现系统效率下降的问题,
最好找一个空间大一点的磁盘多测试一段时间, 直到出现swapd 占用很高的时候就知道了。

具体测试先执行写数据的程序:
gcc -o writefile writefile.c -D_FILE_OFFSET_BITS=64 && ./writefile abc.doc &
然后读文件
gcc -o readfile readfile.c -D_FILE_OFFSET_BITS=64 && ./readfile abc.doc &

writefile.c

  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 * 64
  8. // gcc -o writefile writefile.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 file\n", argv[0]);
  16.         _exit(-1);
  17.     }
  18.     if((fd = open(argv[1], O_WRONLY|O_CREAT, 0644)) > 0)
  19.     {
  20.             n = 0;
  21.             while((write(fd, s, BUF_SIZE)) > 0)n++;
  22.             close(fd);
  23.     }
  24.     else
  25.     {
  26.             fprintf(stderr, "open file failed, %s\n", strerror(errno));
  27.     }
  28.     if(s) free(s);
  29.     while(1)sleep(1);
  30.     return 0;
  31. }
复制代码


gcc -o readfile readfile.c -D_FILE_OFFSET_BITS=64
readfile.c

  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 readfile readfile.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 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.     while(1)sleep(1);
  34.         return 0;
  35. }

复制代码

[ 本帖最后由 redor 于 2009-2-5 15:27 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2009-02-05 16:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
23 [报告]
发表于 2009-02-05 17:25 |只看该作者
原帖由 jamesr 于 2009-2-5 16:41 发表
像你这样狂用内存:
#define BUF_SIZE 1024 * 1024 * 64
狂读写硬盘:
while((read(fd, s, BUF_SIZE)) > 0)n++;
while((write(fd, s, BUF_SIZE)) > 0)n++;
那个系统不会卡?卡是cache的原因吗?

给你个 ...


64M内存也多啊? 我这个是做测试, 很显然你没怎么 写/设计 过密集读写磁盘的应用
我说的就是读写磁盘, 因为内存占用的问题速度会减慢,
我现在大概知道原因了, 是因为我的实际读文件的时候不是页对齐的, 实际上是会造成很多零散的内存块,
等内存被cache光以后回去free内存的时候降低了性能.....

[ 本帖最后由 redor 于 2009-2-5 17:29 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2009-02-05 18:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
25 [报告]
发表于 2009-02-05 22:48 |只看该作者
原帖由 jamesr 于 2009-2-5 18:39 发表
速度减慢明显是因为读写磁盘,而不是内存占用!


没错,确切地说是因为iowait增加,IO成了瓶颈。

另:文件缓冲的推荐值不一定是PAGESIZE,应该按照stat(2)报告的数值设置。

[ 本帖最后由 JohnBull 于 2009-2-5 22:52 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2009-02-05 22:50 |只看该作者
原帖由 redor 于 2009-2-5 14:08 发表

你确认你了解事情的本质么?  你测试过么? 我在mac os x 下测试过, 在我的linux上也测试过, 内存用光的时候明显速度慢了, 因为系统在不断的swap....


问题在于,这个swap与cache究竟有什么关系,cache占用内存会不会造成内核提前进行换出。

在频繁发生swap的时候,麻烦你用vmstat看看那时候的cache还剩多少?

论坛徽章:
0
27 [报告]
发表于 2009-02-06 09:57 |只看该作者
原帖由 jamesr 于 2009-2-5 18:39 发表
速度减慢明显是因为读写磁盘,而不是内存占用!

另外,大哥,我就512M的,内存,你写一个文件,光缓冲就开了64M!文件缓冲推荐是页大小。

密集读写磁盘的应用瓶颈是在磁盘上,在文件系统上,系统调用上, ...



回到原来我的观点上: cache占用系统内存会降低性能.

很显然cache占满内存以后如果要使用内存就要swap一部分被cache的数据然后分配给新的内存使用, 这个会降低性能.

另外你说的磁盘IO密集度提高的时候减慢, 按照磁盘的原理来说, 磁盘的速度取决于磁盘的转速,
文件读取的时候都是要做在内核做cache的, 这个不管啥时候做都是一样的,不会影响总体的性能,
影响性能的就是swap部分.

论坛徽章:
0
28 [报告]
发表于 2009-02-06 09:59 |只看该作者
原帖由 JohnBull 于 2009-2-5 22:50 发表


问题在于,这个swap与cache究竟有什么关系,cache占用内存会不会造成内核提前进行换出。

在频繁发生swap的时候,麻烦你用vmstat看看那时候的cache还剩多少?



根据相关资料可以说明 cache是可以根据一定的算法被回收的, 但是从实验来看, cache在释放的时候会造成swap,
我服务器14G内存都会导致swap, 而且我机器没有设置swap 空间, 这个让我很疑惑.

论坛徽章:
0
29 [报告]
发表于 2009-02-06 10:40 |只看该作者
原帖由 redor 于 2009-2-6 09:59 发表



根据相关资料可以说明 cache是可以根据一定的算法被回收的, 但是从实验来看, cache在释放的时候会造成swap,
我服务器14G内存都会导致swap, 而且我机器没有设置swap 空间, 这个让我很疑惑.

----------------------------------------------

LZ:
用你的例子(不断添加写文件直到最大),肯定的结果是有CACHE的比没有慢。没有疑问的。

因为,你的CACHE没有用,是一次性的数据。最后内存会被CACHE用光。这时候无论如何(收回CACHE, SWAP等)都是系统变慢。
而没有CACHE, 这种时刻不会发生(假设磁盘足够大)。

正常的系统,不应该到这地步。CACHE是有命中的。对于系统性能,有CACHE的好。

论坛徽章:
0
30 [报告]
发表于 2009-02-06 11:02 |只看该作者
http://bbs.chinaunix.net/viewthread.php?tid=1333671#pid9786007
以前的帖子里做过测试 写大量日志之后  free内存确实被cache占用
直到删除日志文件之后 cache掉的内存才被回收---- 这个回收方法在实际应用当中肯定不行的

再着 系统内存被大量的io cache占用光  此时应用程序有频繁大量的 内存new和delete(不使用内存池)  
无论是从哪里回收  必然要靠内核从其他被占用的内存处回收  这样的回收 在效率上可以小到不计?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP