파일 atime 미 변 문제 연구

5078 단어 time
1. atime, ctime 및 mtime
이 세 명 사 는 파일 / 폴 더 의 속성 으로 inode 데이터 구조 에 존재 합 니 다.
시스템 호출 stat 를 통 해 stat 구 조 를 얻 을 수 있 습 니 다. 그 중에서 atime (accesstime), ctime (create time) 과 mtime (modify time) 의 정보, man stat 후의 정 보 를 포함 합 니 다.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
atime: The field st_atime is changed by file accesses, e.g. byexecve, mknod, pipe, utime and read (of more than zero bytes).
ctime: The field st_ctime is changed by writing or by settinginode information (i.e., owner, group, link count, mode, etc.).
mtime: The field st_mtime is changed by file modifications, e.g.by mknod, truncate, utime and write (of more than zero bytes).  Moreover, st_mtime of a directory is changedby the creation or deletion of files in that directory. The st_mtime field isnot changed for changes in owner, group, hard link count, or mode.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
주의해 야 할 것 은 엄격 한 의미 에서 ctime 은 파일 을 만 드 는 시간 이 아 닙 니 다.
마찬가지 로 우 리 는 ls 명령 을 통 해 파일 의 atime, ctime, mtime 를 가 져 올 수 있 습 니 다.
 
  atime:ls –lu [filename]

  ctime:ls –lc [filename]

  mtime:ls –l [filename]

 
2. atime 변 함 없 는 상황
Centos 6 또는 Redhat 6 플랫폼 에서 제품 이 파일 을 스 캔 한 후에 파일 의 atime 이 변 하지 않 았 음 을 발 견 했 고 이 어 자신 도 명령 'cat [filename]' 을 사용 한 후에 atime 도 변 하지 않 았 다.이 작업 들 은 모두 파일 을 읽 기 작업 을 하 는데, 왜 atime 은 변 하지 않 았 습 니까?
그러나 이런 조작 은 Redhat 5 등 플랫폼 에서 atime 을 정상적으로 바 꿀 수 있다.그런데 왜 Centos 6 / Redhat 6 에서 변 하지 않 았 을 까?
3. 근본 원인
처음에 저 는 OS 의 bug 로 인 한 것 이 아니 냐 고 의심 한 적 이 있 습 니 다. 나중에 kernel 버 전 2.6.30 전에 Liux 의 핵심 개발 자 들 은 Ext 3 / Ext 4 파일 시스템 의 성능 에 대해 토론 을 했 습 니 다. 그 중에서 atime 을 포함 합 니 다.kernel 2.6.30 이전에 파일 시스템 에서 기본적으로 atime 를 신속하게 업데이트 합 니 다. 그러면 두 가지 문 제 를 가 져 올 수 있 습 니 다.
(1)    시스템 에 대량의 파일 접근 을 통 해 atime 을 디스크 에 기록 하고 시간 을 소모 하여 성능 을 떨 어 뜨 립 니 다.
(2)    이런 조작 도 전기 에 너 지 를 소모 할 수 있다.
리 눅 스에 서 실행 되 는 매우 적은 응용 프로그램 은 정확 한 atime 시간 을 가 져 야 한다. 또한 리 눅 스 핵심 개발 자 는 Ext 3 / Ext 4 파일 시스템 의 성능 측면 에서 2.6.30 버 전의 커 널 에서 atime 의 업데이트 방식 을 수정 하기 로 결정 했다. 다음 세 가지 상황 중 하나 만 atime 을 업데이트 할 수 있다.
(1)    파 티 션 mount 를 마 운 트 할 때 비 relatime 방식 (기본적으로 relatime 방식) 을 지정 합 니 다. 예 를 들 어 strictatime.
보충: OS 가 시 작 될 때 각 파 티 션 을 다른 디 렉 터 리 에 마 운 트 하고 마 운 트 (mount) 인자 에서 strictatime 을 사용 하여 atime 를 제때에 업데이트 하 는 것 을 표시 합 니 다.2.6.30 이후 mount 에 'relatime' 과 'strictatime' 두 가지 옵션 을 추 가 했 습 니 다. 자세 한 것 은 'man mount' 를 통 해 볼 수 있 습 니 다.
(2) atime 이 ctime 보다 작 거나 mtime 보다 작 을 때
(3) 이번 access time 과 지난번 atime 은 24 시간 이 넘 습 니 다.
이 방법 은 잦 은 업데이트 atime 를 피하 고 파일 시스템 의 성능 을 향상 시 켰 다.역시 리 눅 스 커 널 을 만 드 는 큰 소 는 모든 디 테 일 에서 잡 을 수 있 습 니 다. 존경 합 니 다.
그리고 제 가 사용 하 는 CentOS 6 과 Redhat 6 의 kernel 버 전 은 2.6.32 이 고 제 가 사용 하 는 Redhat 5 는 2.6.30 전의 커 널 버 전 입 니 다. 아니 나 다 를 까. 그리고 2.6.32.22 의 kernel 코드 를 다운로드 하여 atime 를 업데이트 하기 전에 호출 된 검사 함수 relatime 을 보 았 습 니 다.need_update:
 
/*

 *With relative atime, only update atime if the previous atime is

 *earlier than either the ctime or mtime or if at least a day has

 *passed since the last atime update.

 */

static int relatime_need_update(structvfsmount *mnt, struct inode *inode,

                                 struct timespec now)

{

 

         if(!(mnt->mnt_flags & MNT_RELATIME))

                   return1;

         /*

          * Is mtime younger than atime? If yes, updateatime:

          */

         if(timespec_compare(&inode->i_mtime, &inode->i_atime) >= 0)

                   return1;

         /*

          * Is ctime younger than atime? If yes, updateatime:

          */

         if(timespec_compare(&inode->i_ctime, &inode->i_atime) >= 0)

                   return1;

 

         /*

          * Is the previous atime value older than aday? If yes,

          * update atime:

          */

         if((long)(now.tv_sec - inode->i_atime.tv_sec) >= 24*60*60)

                   return1;

         /*

          * Good, we can skip the atime update:

          */

         return0;

}

 
 
4. 정확 한 atime 시간 획득
하지만 커 널 2.6.30 이후 제품 이 atime 의 정확 한 시간 을 가 져 야 한다 면?
OS 가 시 작 될 때 / etc / fstab 파일 을 읽 고 디스크 파 티 션 을 마 운 트 합 니 다. strictatime 옵션 을 추가 할 수 있 습 니 다.
 
UUID=d2a07167-d979-4cb8-a50e-dde36f4c7139/                       ext4    defaults,strictatime        1 1

그러나 이 방법 은 OS 를 다시 시작 해 야 합 니 다. OS 를 다시 시작 하지 않 으 면 reount (마 운 트 된 파일 시스템 을 예 로 들 면) 을 사용 할 수 있 습 니 다.
 
mount -o remount,rw,strictatime /

"/" 디 렉 터 리 에 마 운 트 된 파일 시스템 은 atime 를 제때에 업데이트 할 수 있 습 니 다.
5. 참고
1. http://stackoverflow.com/questions/15547649/is-it-necessary-to-enable-atime-in-etc-fstab-to-get-the-correct-last-accessed
2. http://www.h-online.com/open/news/item/Kernel-Log-What-s-coming-in-2-6-30-File-systems-New-and-revamped-file-systems-741319.html

좋은 웹페이지 즐겨찾기