首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用C编写大量文件后Ubuntu冻结

在用C编写大量文件后Ubuntu冻结
EN

Stack Overflow用户
提问于 2019-07-27 02:39:51
回答 1查看 204关注 0票数 2

我的整个系统(Ubuntu 18.04)总是在大约一个小时后死机,因为我的c程序不断地向文件中写入一些日志。每个创建的文件大小约为100 - 200MB,系统关闭前这些文件的总大小约为40-60 40。通常,此时我有150 at以上的SSD空间可用。

我通过系统监视器检查了系统状况,但没有发现任何问题。当我的程序运行时,八个核心中只有一个有100%的使用率。其他的则相当低。在系统关闭之前,只使用了15.5 of内存中的2.5 of。每次我重新启动我的机器,最新创建的4-6个文件都是空的。尽管它们中的大多数在结冰的那一刻都显示出一些大小。(看起来它们并未实际写入SSD)

我的c代码可以简化如下:

代码语言:javascript
运行
复制
#define MEM_LEN 50000 
#define FILE_LEN 10000*300

struct log_format {
        long cnt;
        long tv_sec;
        long tv_nsec;
        unsigned int user;
        char rw;
        char pathbuffer[256];
        size_t count;
        long long pos;
};

int main(int argc, const char *argv[])
{
    int fd=0;
    struct log_format *addr  = NULL;
    int i=0;
    FILE *file;
    char filestr[20];
    int data_cnt = 0;
    int file_cnt =0;

    // open shared memory device //
    fd = open("/dev/remap_pfn", O_RDWR);
    if (fd < 0) {
        perror("....open shared memory device1 failed\n");
        exit(-1);   }
    // memory mapping to shared memory device //
    addr = mmap(NULL, BUF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, fd, OFFSET);
    if (!addr) {
        perror("....mmap1 failed\n");
        exit(-1);   }

    // open a file //
    sprintf(filestr, "%d.csv", file_cnt);
    file = fopen(filestr, "w");
    printf("%s created\n",filestr);

    // continuously check the memory replacement of last, and write to file // 
    while(1){

        fprintf(file, "%lu,%lu,%lu,%u,%c,%s,%zu,%lld\n", addr[i].cnt, addr[i].tv_sec,
                                addr[i].tv_nsec, addr[i].user, addr[i].rw, addr[i].pathbuffer,
                                addr[i].count, addr[i].pos);
        i++;
        data_cnt++;
        if(i>=MEM_LEN)
            i=0;

        // when reaching a threshold, create another file to write //
        if(data_cnt>=FILE_LEN){
            data_cnt = 0;
            fclose(file);
            file_cnt++;

            // open a file //
            sprintf(filestr, "%d.csv", file_cnt);
            file = fopen(filestr, "w");
            printf("%s created\n",filestr);
        }
    }

    fclose(file);   

    return 0;
}

我没有发现来自syslog & kern.log的任何错误消息。它就会结冰。有谁知道问题出在哪里吗。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-07-27 06:26:34

我尝试在While循环中添加一些延迟,以减慢写入速度:(由于1纳秒对于循环来说仍然太长,所以我将其设置为每10次运行一次睡眠)

代码语言:javascript
运行
复制
While(1){
struct timespec ts = {0,1L};
        if(data_cnt%10==0)
            nanosleep(&ts, NULL);
......
}

冻结问题现在似乎已经消失了。

所以..。这可能是什么原因呢?目前,我只看到该内核的写速度变慢了,CPU负载降到了50%。中间是否有写缓冲区,我的程序超出了它的限制,导致系统崩溃?

(如果是过热问题导致机器停机,我也会跟踪)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57225486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档