如何避免将数据写入磁盘的成本太高

时间:2013-04-19 01:51:01

标签: c linux

    static const int MAX_BUFFER_LEN = 1024*12; //in byets
    char *bff = new char[MAX_BUFFER_LEN];
    int fileflag = O_CREAT | O_WRONLY | O_NONBLOCK;

    fl = open(filename, fileflag, 0666);

    if(fl < 0)
    {
        printf("can not open file! \n");
        return -1;
    }

    do
    {

        ///begin one loop
        struct timeval bef;
        struct timeval aft;
        gettimeofday(&bef, NULL);

        write(fl, bff, MAX_BUFFER_LEN);

        gettimeofday(&aft, NULL);

        if(aft.tv_usec - bef.tv_usec > 20000) //ignore second condition
        {   
            printf(" cost too long:%d \n", aft.tv_usec - bef.tv_usec);
        }   
        //end one loop

        //sleep
        usleep(30*1000); //sleep 30ms


    }while(1);

当我在Linux ubuntu 2.6.32-24-generic上运行该程序时,我发现COST TOO LONG打印在一分钟内显示1~2次。我试过USB磁盘和硬盘。我也在arm平台上试过这个程序。这种情况也发生了。我认为3.2Mbps对于低速IO设备而言太高了。所以我降低到0.4Mbps。它大大降低了打印频率。是否有任何解决方案来控制时间成本?   write()只是将数据复制到kenal缓冲区并立即返回或等待磁盘IO完成吗? kenal IO缓冲区是否可能已满并且必须等待刷新,但为什么只有几次花费这么长时间?

3 个答案:

答案 0 :(得分:3)

您无法加速磁盘,但在磁盘工作时您可以执行其他操作。你无需等待它完成。

然而,这在C中非常重要。您需要非阻塞I / O,多线程或多处理。尝试使用Google搜索这些关键字以及如何使用不同的技术(您已经在那里使用了非阻塞fd)。

答案 1 :(得分:2)

您的磁盘I / O性能受到每次写入周围代码的负面影响,以测量时间(并且在此粒度下测量时间会随着计算机执行其他操作而偶尔出现峰值)。

相反,测量代码的性能以写入整个数据 - 开始/结束时间循环之外(当然,循环正确有限)。

答案 2 :(得分:1)

如果你正在调用一个你认为需要花费很多时间的文件写入,那么让你的进程运行两个线程,而一个正在执行主任务,让另一个写入磁盘。