2017-03-07 2 views
2

응용 프로그램에서 카운터 값을 여러 호출간에 유지해야하므로 응용 프로그램이 다시 시작될 때마다 카운터 값이 다시 읽혀지고 거기에서부터 계속 카운팅됩니다. 이 값은 사람이 읽을 수있는 형식으로 저장해야하므로 쉽게 검사 할 수 있으므로 필요에 따라 값을 변경해야하며 원자 적으로 업데이트해야 이전의 지속 값이 실패하지 않습니다.심볼릭 링크를 사용하여 데이터 저장

평범한 오래된 텍스트 파일을 사용하는 것은 너무 지루해 보였습니다. 따라서 창의적인 사고가 발생하면 카운터를 심볼 링크 대상으로 저장하여 동일한 목표를 달성 할 수있었습니다.

기본적으로, 프로토 타입 언어로 쉬를 사용하는 대신

echo $counter > file.tmp && mv file.tmp file || rm -f file.tmp 

을하고 내가

ln -s $counter file.tmp && mv file.tmp file || rm -f file.tmp 

에게 후자의 접근 방식의 장점을 할 것입니다 것은 나는 쓰기를 하나의 시스템 콜을 필요로한다는 것입니다 파일과 대조적으로 은 적어도 3입니다. 쉘에서 ls -l을하고 추가 보너스로

는 자동적으로 파일의 내용 표시에 두 가지 방법 ( see it here)을 비교하는 테스트 프로그램을 실행, 공연에 관한 무엇인지에 관해서는

$ ls -l the.counter.is 
lrwxrwxrwx 1 fabio fabio 4 mar 7 01:08 the.counter.is -> 1234 

을 내 PC 표준 접근 방식보다 약 7 배 빠른 symlink 접근법을 사용하여 기대치와 일치하는 결과를 얻습니다. (이 테스트에서는 원 자성에 대해 신경 쓰지 않습니다.)

$ uname -a && ./linkfile 10000 4095 /tmp/test 
Linux Fabio-Asus 4.8.0-40-generiC#43-Ubuntu SMP Thu Feb 23 16:01:19 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 
Starting test... [10000, 4095] 
writeToFile: 155.537ms 
writeToLink: 23.4132ms 

그러나 on coliru 나는 약간 표준 접근 방식에 찬성, 다른 결과를 얻을 :

uname -a && g++ -O3 -o test main.cpp && sync && ./test 10000 4095 x 
Linux stacked-crooked 4.4.0-57-generiC#78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 
Starting test... [10000, 4095] 
writeToFile: 21.8001us 
writeToLink: 33.9217us 

시험은 자신의 실행 시간을 각각의 반복에서 4095 바이트를 작성하고 평균, 각 방법에 대한 10000 반복으로 구성되어 있습니다.

4095 바이트의 이유는 symlink 시스템 호출이 ENAMETOOLONG과 함께 실패하는 이유 때문입니다.

그래서, 질문은 다음과 같습니다

  1. 전에 데이터를 저장하는 미친 나, 지금까지 사용이 방법을 제외하고, 사람을 했습니까?
  2. 예인 경우 어떤 유스 케이스입니까? 내 PC가 i7-6500U CPU @ 2.50GHz 스포츠를 염두에
  3. 베어링, 당신은 현재의 어떤 생각을 할 이유 표준 접근 방식을 coliru에 그래서 훨씬 더 빨리 내 PC보다, 모두 심볼릭 링크 접근 관련 절대 시간 ? 캐시 때문에 캐시가 문제가되지 않는다면 왜 내 PC에 영향을 미치지 않을 것이며, 왜 symlink 접근에 긍정적 인 영향을 미치지 않을까요?
+0

당신의 성능 테스트 결과가 극도로 파일 시스템이고 하드웨어에 달려 있다고 생각합니다. 로컬로 어떤 파일 시스템을 사용하고 있습니까? 어떤 디스크 하드웨어입니까? –

답변

0

내 답변 :

  1. 그래, 내가 본 심볼릭 링크는 데이터를 저장하는 데 사용된다. 이미 설명했듯이, 파일이 아니라 심볼릭 링크에 작은 데이터 조각을 저장하는 것은 엄청난 성능 향상입니다. 나는 symlink 값이 inode에 직접 저장되어 더 많은 스토리지를 효율적으로 사용할 수 있다고 생각한다. 또 하나의 큰 장점은 원 자성입니다. symlink 생성은 원자 프로세스이며 동시성 문제를 처리하는 데 도움이됩니다.
  2. symlinks에 저장된 값은 대부분 특정 응용 프로그램의 메타 데이터입니다. 예를 들어 많은 수의 동적 로그 파일을 점차적으로 구문 분석하는 파서를 작성해야하는 경우 심볼 링크에 마지막 바이트 위치를 저장하는 것이 좋습니다. Symlink는 잠금 구현에 사용될 수도 있습니다. flock이 NFS에서 안정적이지 않고 symlinks가 대신 사용 된 경우를 보았습니다.
  3. 나는 이것에 대해 잘 모르겠다 - 구현 차이가있을 것인가?
관련 문제