2014-10-22 9 views
0

여러 노드가 파일에 데이터를 순서대로 쓰고 파일이 NFS에있는 프로젝트가 있습니다.C++ ofstreams를 사용하여 비동기 NFS에 파일 쓰기 또는 플러시

우리는 동기 NFS를 사용하기 전에 파일 스트림에 대한 플러시가 정상적으로 작동했습니다. 이제 우리는 비동기 NFS를 가지고 있으며 작동하지 않습니다. 분명히 캐싱은 그림으로 나타나고 다른 노드는 특정 노드에 의해 만들어진 변경 사항을 보지 않습니다.

강제로 캐시에서 디스크로 데이터를 플러시하는 방법이 있는지 알고 싶습니다. 나는 이것이 효율적이지 않다는 것을 안다. 그러나 우리가 실제 해결책을 제자리에 잡을 때까지 일을 얻을 것이다.

+0

ofstream에는 기본 파일 시스템에 대한 아이디어가 없습니다. sync (2) 시스템 콜이 도움이 될 수 있습니다. 그러나 모든 미해결 파일 버퍼를 동기화합니다. – Oncaphillis

+0

나는'flush()'에 대한 호출이'fsync()'또는'ioctl()'에 대한 기본 호출을 초래할 것이라고 추측합니다. 아마도 strace를 실행하여 그것이 가능한지 확인하십시오. 그렇다면 아마도'sync()'? 그렇지 않다면, 아마도'rdbuf()'에서 파일 디스크립터를 가져 와서'fsync()'또는'ioctl()'을 명시 적으로 호출 할 것인가? – Jason

답변

0

VxWorks에서 NFS를 사용하여 비슷한 문제가 발생했습니다.

int fd; 
fd = open("/ata0a/test.dat", O_RDWR | O_CREATE); 
write(fd, "Hallo", 5); 
/* data is having a great time in some buffers... */ 
ioctl(fd, FIOSYNC, 0); // <-- may last quite a while... 
/* data is flushed to file */ 

내가 ofstreams도 당신의 OS가 위의 코드와 유사 뭔가를 제공하는 경우 어떻게 알 수 있습니까 ...

함께 일한 적이 : 일부 실험 후 나는 장치에 확실하게 플러시 데이터가있는 방법을 발견했습니다

하지만 한 가지 방법은 파일을 단순히 닫는 것입니다. 이렇게하면 모든 버퍼가 플러시됩니다. 그러나 파일 닫기와 응용 프로그램에서 볼 수없는 모든 데이터 플러시 사이에는 데이터가 기록되기 전에 "닫기"호출이 반환 될 수 있기 때문에 시간이 걸릴 수 있습니다. 또한 나중에 파일을 다시 열어야하므로 오버 헤드가 많이 발생합니다.

이 옵션을 선택하지 않으면 데이터 뒤에 많은 양의 "더미 데이터"를 쓰면 버퍼가 가득 차게됩니다. 그러면 데이터가 파일에 기록됩니다. 그러나 이렇게하면 데이터 크기에 따라 많은 디스크 공간이 낭비 될 수 있습니다.