2015-01-21 11 views
1

요청을 받아들이고, 처리를 수행하고, 결과를 커밋 로그에 저장하고, 결과를 반환하는 여러 스레드가 있습니다. 최대 x 초의 분량의 데이터가 손실되지 않도록하려면이 커밋 로그를 매 x 초마다 fsync'd해야합니다.복수 파일 대 하나의 파일에 대해 fsync를 호출 할 때의 성능

스레드 간의 동기화를 피하고자합니다. 즉, 공유 로그가 아닌 각각의 커밋 로그가 필요합니다. 모든 다른 커밋 로그를 성능이 좋은 fsync로 정기적으로 동기화 할 수 있습니까?

이 리눅스, ext4에 (EXT3 나)에

은 (주 : 인해 코드의 특성, 스레드가 커밋 로그에서 자신의 최근 데이터의 일부를 다시 읽어 필요도 처리하는 정상적인 과정을 (하지만 다른 스레드는 로그 데이터를 커밋하지 않습니다.) 따라서 많은 스레드가 읽고 쓰는 것이 필요하기 때문에 공유 로그를 사용하는 것은 비현실적입니다.)

답변

0

몇 초마다 플러시 만하면됩니다. fsync()를해야합니까? 나는. 운영 체제는 공정하게 정기적으로 수행해야합니다 (시스템에 과부하가 걸리고 디스크 I/O가 부족한 경우 제외).

그렇지 않으면 스레드가 그런 짓을 한 :

n은, 예를 들어이 될 것입니다 값입니다
if (high_resolution_time() % n == 0) { 
    fsync(); 
} 

high_resolution_time()이 Unix EPOCH 시간 (초 단위로 표시)을 반환 한 경우 3입니다. 스레드가 매 3 초마다 파일을 플러시하도록합니다.

문제는 물론, 당신이 빠르게 연속의 파일을 여러 번 세척하지 초당이 코드 섹션을 여러 번 전달하는 스레드를 피하기 위해 더 높은 클럭 해상도를 필요로한다는 것이다. 나는 당신이 사용하는 프로그래밍 언어를 모른다. 그러나 리눅스에서는 C에서 사용할 수있다. gettimeofday :

struct timeval tv; 
gettimeofday(&tv, null); 
double x = (double)tv.tv_sec * (double)1000000 + (double)tv.tv_usec; 
if (x % 3000000 == 0) { // fsync every 3 seconds 
    fsync(); 
}