思一克 发表于 2005-04-12 11:21

读写文件不是效率很低的嘛,那么数据库为何效率高呢

DIRECT-IO如果自己不buffer一定比普通IO慢。
数据库自己要BUFFER。

它也用系统调用read, write, open, close等,只是不用OS的buffer.




//一个简单DIRECT-IO例子 (linux i386)。 JOHN SEEKER

#include <stdio.h>;
#include <sys/types.h>;
#include <sys/stat.h>;
#include <asm/fcntl.h>;
#include <unistd.h>;
#define _XOPEN_SOURCE 600
#include <stdlib.h>;

//int posix_memalign(void **memptr, size_t alignment, size_t size);
      
//#include <fcntl.h>;

char buf = "123456kasf dklasfkasfkldkladsfklafskldsfkl";
char buf1;
main()
{
int fd;
int i, r;
char *bp;

    r = posix_memalign(&bp, 512, 4096*8);
    printf("r = %d\n", r);
    memcpy(bp, buf, 4096);
   
    fd = open("data", O_CREAT | O_RDWR | O_TRUNC | O_DIRECT, 0644);
   
    printf("fd = %d\n", fd);
   
    r = write(fd, bp, 4096);
    printf("%d bytes written.\n", r);

    close(fd);
}

albcamus 发表于 2005-04-12 11:50

读写文件不是效率很低的嘛,那么数据库为何效率高呢

长见识!!呵呵

请教几个问题,再劳烦思兄一下:

1, 象传统的write系统调用,通过文件系统象磁盘文件写数据,写入的过程是在内核态中完成的;上面的这个程序是不是?
2, 你说的“不用OS的buffer”,是什么意思呢?APUE把write/open这些系统调用称为“unbuffered IO”(与标准C库相比),跟你的意思有何区别呢?


Sorry,这个问题一直没弄明白 :D

北京野狼 发表于 2005-04-12 11:55

读写文件不是效率很低的嘛,那么数据库为何效率高呢

原帖由 "思一克"]


你有这个经历,干嘛不试试读写一个文件,和读写数据库
到底速度差别多少

linux_newbie 发表于 2005-04-12 11:56

读写文件不是效率很低的嘛,那么数据库为何效率高呢

数据库的特性决定了它在进行写操作的时候必须确实写物理磁盘,而不能使用延时写的方式。当然写入的内容可以放在cache中方便下次读取。

否则使用write等api,实际上os内部还是有buffer的,如果这个时候crash了,事务又已经提交了,但是具体的log没有更新到磁盘上,数据就corrupt了,recover都没有机会。

思一克 发表于 2005-04-12 11:59

读写文件不是效率很低的嘛,那么数据库为何效率高呢

To albcamus,

2). 之所以read write 叫UNBUFFER/IO是和fread, fwrite比,因为后者有自己在函数库中的BUFFER。前者直接交给OS,无库BUFFER。但OS中有PAGE BUFFER(linux的buffer_head等结构)。比如write写文件,不是一定写到盘上(比如你写了,然后硬关电,数据可能丢失)。   

1). direct/io饶过了OS page buffer,调用驱动将数据直接写盘。所以应该不怕关电。

DIRECT/IO和普通IO写盘调用的驱动完全相同,调用的系统调用相同(除了O_DIRECT项目外)。对用户几乎是透明的。

albcamus 发表于 2005-04-12 11:59

读写文件不是效率很低的嘛,那么数据库为何效率高呢

原帖由 "linux_newbie" 发表:

否则使用write等api,实际上os内部还是有buffer的,如果这个时候crash了,事务又已经提交了,但是具体的log没有更新到磁盘上,数据就corrupt了,recover都没有机会。


你的意思是不是说,文件系统的日志功能是不可靠的? 因为日志未必总是与磁盘上的保持同步。
有点理解了。。

bleem1998 发表于 2005-04-12 12:03

读写文件不是效率很低的嘛,那么数据库为何效率高呢

谁知道怎样mount一个direct I/O的文件系统
solaris就可以
linux可以咩

思一克 发表于 2005-04-12 12:04

读写文件不是效率很低的嘛,那么数据库为何效率高呢

还有两者读写文件都是在KENREL中执行的,但DIRECT/IO DIO是直接将数据搞到用户的BUFFER,而普通IO先搞到page buffer, 再COPY到用户buffer.

所以如果仅仅写一次一个文件DIO应该快,但对于一般的文件操作(读写,SEEK,再读写),因为无PAGE BUFFER,DIO应该慢许多。

北京野狼 发表于 2005-04-12 12:07

读写文件不是效率很低的嘛,那么数据库为何效率高呢

原帖由 "思一克" 发表:
还有两者读写文件都是在KENREL中执行的,但DIRECT/IO DIO是直接将数据搞到用户的BUFFER,而普通IO先搞到page buffer, 再COPY到用户buffer.

所以如果仅仅写一次一个文件DIO应该快,但对于一般的文件操作(读写,SE..........

一般的文件,读写,SEEK,再读写,仍然比数据库快的多。

bleem1998 发表于 2005-04-12 12:21

读写文件不是效率很低的嘛,那么数据库为何效率高呢

谁知道怎样mount一个direct I/O的文件系统
是不是用raw命令?
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: 读写文件不是效率很低的嘛,那么数据库为何效率高呢