我的整个系统(Ubuntu 18.04)总是在大约一个小时后死机,因为我的c程序不断地向文件中写入一些日志。每个创建的文件大小约为100 - 200MB,系统关闭前这些文件的总大小约为40-60 40。通常,此时我有150 at以上的SSD空间可用。
我通过系统监视器检查了系统状况,但没有发现任何问题。当我的程序运行时,八个核心中只有一个有100%的使用率。其他的则相当低。在系统关闭之前,只使用了15.5 of内存中的2.5 of。每次我重新启动我的机器,最新创建的4-6个文件都是空的。尽管它们中的大多数在结冰的那一刻都显示出一些大小。(看起来它们并未实际写入SSD)
我的c代码可以简化如下:
#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的任何错误消息。它就会结冰。有谁知道问题出在哪里吗。谢谢。
发布于 2019-07-27 06:26:34
我尝试在While循环中添加一些延迟,以减慢写入速度:(由于1纳秒对于循环来说仍然太长,所以我将其设置为每10次运行一次睡眠)
While(1){
struct timespec ts = {0,1L};
if(data_cnt%10==0)
nanosleep(&ts, NULL);
......
}冻结问题现在似乎已经消失了。
所以..。这可能是什么原因呢?目前,我只看到该内核的写速度变慢了,CPU负载降到了50%。中间是否有写缓冲区,我的程序超出了它的限制,导致系统崩溃?
(如果是过热问题导致机器停机,我也会跟踪)
https://stackoverflow.com/questions/57225486
复制相似问题