2017-01-19 1 views
0

우리는 매우 빠른 10TB RAID 0jbod에 연결된 데이터 캡처 시스템을 보유하고 있습니다.fwrite가 MemFree를 모두 소모하므로 fflush가 작동하지 않습니까?

우리는 약 1.25 GB/s의 속도로 4 개의 MiB 데이터 버퍼를 수신합니다.이 버퍼는 fopen으로 열었던 순차 파일에 기록되며, 10 GiB는 fallocate되고 fwrite로 기록됩니다. 매 10 명의 GiB가 탈옥 한 다음 10 명의 GiB를 얻습니다. 마지막으로 캡처가 fclose로 완료되면 닫힙니다.

문제는 캡처가 진행되는 동안/proc/meminfo MemFree 드롭이 표시되고 캐시 된 샷이 발생합니다. 즉 fflush가 아무 것도하지 않는 것 같습니다. 이것은 시스템에 MiB MemFree가 약 200 개가 될 때까지 계속되며 데이터 속도가 극도로 빨라지므로 캡처가 실패하게됩니다.

우리는 fflush를 호출 할 때 스파이크가 10 GiB 주위에 떨어지길 바랬지 만, 아무 것도하지 않는 것 같습니다. 이 파일은 fclose를 호출 할 때까지 플러시되지 않습니다.

이 동작이 어떤 이유입니까? setvbuf (hFile, NULL, _IONBF, 0)를 사용하면 효과가없는 것 같습니다.

+0

특정 문제가 무엇인지 모르겠지만 낮은 수준의 호출을 사용하려면 '열기'와 '쓰기'를 사용하는 것이 좋습니다. 'fopen'과'fwrite'를 사용해야하는 특별한 이유가 있습니까? 또한 '탈당'은 어떤 이점을 제공합니까? 파일에 쓸 때 공간이 할당됩니다. –

+0

AndySchweig 동작은 또한 열기/쓰기/닫기를 사용하여 발생합니다. (나는 철거지의 아이디어가 성능을 향상시키는 것이라고 생각한다.) – Piotr

+0

명백한 질문 : 디스크 어레이가 1.25GB/초를 기록 할 수 있습니까? – duskwuff

답변

2

무료 메모리 삭제가 표시되면 OS가 버퍼 캐시 (기본적으로 사용 가능한 모든 메모리)에 쓰는 것입니다. 또한 stdio의 fwrite()은 자체적으로 버퍼링 중입니다. 이 때문에 자원 경쟁이 일어나고 있습니다. OS가 사용 가능한 메모리의 상한선에 도달하면이 자원 경합으로 인해 쓰기 속도가 느려지고 메모리 사용률이 높아집니다. 병목 현상으로 인해 데이터 캡처가 누락됩니다.

버퍼를 관리하고 있으므로 write()O_DIRECT을 사용하면이 모든 버퍼링을 피할 수 있습니다.

관련 문제