다음 칼럼에서는 리눅스 시스템 튜토리얼 칼럼에서 배운 리눅스 디스크 캐시 관련 지식을 소개하고 정리하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
머리말
최근에 디스크 관련 온라인 장애를 접하게 되어 이전에 잘 몰랐던 리눅스 디스크 캐시에 대한 지식을 정리하고자 합니다.
일반적으로 디스크 캐시가 등장하는 데는 두 가지 이유가 있을 수 있습니다. 첫 번째는 디스크에 액세스하는 속도가 메모리에 액세스하는 속도보다 훨씬 느리기 때문입니다. 두 번째는 액세스 속도가 프로그램의 로컬 부분을 기반으로 한다는 것입니다. 성의 원칙에 따라 데이터에 액세스하면 짧은 시간 내에 다시 액세스할 가능성이 높습니다. 메모리의 디스크 내용은 프로그램의 실행 속도를 향상시킬 수 있습니다.
Principle of locality
Principle of Program Locality: 프로그램은 실행될 때 지역성을 나타냅니다. 즉, 일정 시간 내에 전체 프로그램의 실행은 프로그램의 특정 부분으로 제한됩니다. 이에 따라 실행을 통해 접근하는 저장 공간도 특정 메모리 영역으로 제한됩니다. 구체적으로 지역성은 일반적으로 시간적 지역성과 공간적 지역성의 두 가지 형태를 갖습니다.
시간적 지역성: 한 번 참조된 메모리 위치는 나중에 여러 번 참조됩니다.
공간적 지역성: 메모리 위치를 참조하면 나중에 가까운 위치도 참조됩니다.
페이지 캐시
디스크의 IO 작업을 줄이기 위해 Linux 시스템은 열린 디스크의 내용을 캐시하며 캐시 위치는 물리적 메모리이므로 디스크에 대한 액세스를 메모리를 효과적으로 향상시킵니다. Linux의 캐싱 방법은 물리적 메모리를 사용하여 페이지 캐시라고 하는 디스크의 콘텐츠를 캐시합니다.
페이지 캐시는 메모리의 물리적 페이지로 구성되며 해당 내용은 디스크의 물리적 블록에 해당합니다. 페이지 캐시의 크기는 시스템의 사용 가능한 메모리 크기에 따라 동적으로 조정됩니다. 메모리를 점유하여 크기를 확장할 수도 있고, 메모리 사용량 부담을 완화하기 위해 자체적으로 축소할 수도 있습니다.
가상 메모리 메커니즘이 등장하기 전에는 운영 체제에서 블록 캐시 계열을 사용했지만, 가상 메모리가 등장한 이후에는 운영 체제가 IO를 더 세밀하게 관리하므로 페이지 캐시 메커니즘이 채택되었습니다. 페이지 기반, 파일 지향 메커니즘.
페이지 캐시 읽기
Linux 시스템은 파일을 읽을 때 먼저 페이지 캐시에서 파일 내용을 읽습니다. 페이지 캐시가 없으면 시스템은 먼저 디스크에서 파일 내용을 읽은 다음 페이지 캐시로 업데이트한 다음 페이지 캐시에서 파일 내용을 읽고 반환합니다.
일반적인 프로세스는 다음과 같습니다.
프로세스는 읽기 파일 요청을 시작하기 위해 라이브러리 함수 read를 호출합니다.
커널은 열린 파일 목록을 확인하고 파일 시스템에서 제공하는 읽기 인터페이스를 호출합니다
파일에 해당하는 inode를 찾은 다음 읽을 특정 페이지를 계산합니다.
inode를 통해 해당 페이지 캐시를 찾습니다. 1) 페이지 캐시 노드에 도달하면 파일 내용이 직접 반환됩니다. 2) 해당 페이지 캐시가 없으면 페이지 폴트(Page Fault)가 발생합니다. 이때 시스템은 새로운 빈 페이지 캐시를 생성하고 디스크에서 파일 내용을 읽고 페이지 캐시를 업데이트한 다음 4단계를 반복합니다
파일을 읽고 반환
따라서 모든 파일 내용 페이지 캐시가 처음에 적중되었는지 여부에 관계없이 궁극적으로 페이지 캐시에서 직접 가져옵니다.
페이지 캐시에 쓰기
페이지 캐시가 존재하기 때문에 프로세스가 쓰기를 호출하면 파일에 대한 업데이트가 해당 파일의 페이지 캐시에만 기록되고 해당 페이지는 다음과 같이 표시됩니다. 더러운. 과정이 끝났습니다. Linux 커널은 주기적으로 더티 페이지를 디스크에 다시 쓴 다음 더티 플래그를 지웁니다.
쓰기 작업은 페이지 캐시에만 변경 사항을 쓰기 때문에 디스크 IO가 발생할 때까지 프로세스가 차단되지 않습니다. 이때 컴퓨터가 충돌하면 디스크에서 쓰기 작업의 변경 사항이 발생하지 않을 수 있습니다. 따라서 데이터 시스템과 같이 요구 사항이 엄격한 일부 쓰기 작업의 경우 fsync 및 기타 작업을 적극적으로 호출하여 변경 사항을 적시에 디스크에 동기화해야 합니다. 읽기 작업은 다릅니다. 읽기 작업의 지연을 줄이기 위해 일반적으로 Linux 시스템은 디스크에서 데이터를 읽을 때 "사전 읽기" 기술을 사용합니다. 커널은 페이지 캐시로 더 많은 페이지를 읽습니다.
쓰기 저장 스레드
페이지 캐시의 쓰기 저장은 커널의 별도 스레드에 의해 완료됩니다. 쓰기 저장 스레드는 다음 3가지 상황에서 다시 씁니다.
사용 가능한 메모리가 임계값보다 낮은 경우. 사용 가능한 메모리가 부족하면 캐시의 일부를 해제해야 합니다. 더티가 아닌 페이지만 해제할 수 있으므로 모든 더티 페이지를 디스크에 다시 기록하여 재활용할 수 있는 클린 페이지로 바꿔야 합니다.
메모리의 더티 페이지 처리 시간이 임계값을 초과하는 경우. 이는 더티 페이지가 메모리에 무기한 남아 있지 않도록 하여 데이터 손실 위험을 줄이기 위한 것입니다.
사용자 프로세스가 sync 및 fsync 시스템 호출을 호출할 때. 이는 엄격한 쓰기 저장 요구 사항이 있는 사용 시나리오를 충족하기 위해 사용자 프로세스에 강제 쓰기 저장 방법을 제공하기 위한 것입니다.
쓰기 저장 스레드 구현
Name | Version | Description |
---|---|---|
bdflush | bdflush 커널 스레드는 2.6 이전 버전 | bdflush 커널 스레드가 백그라운드에서 실행되며, 메모리 소비가 아래일 때 시스템에는 bdflush 스레드가 하나만 있습니다. 특정 임계값, bdflush 스레드가 활성화됩니다. kupdated는 주기적으로 실행되며 더티 페이지를 다시 작성합니다. 그러나 전체 시스템에는 bdflush 스레드가 하나만 있습니다. 시스템 쓰기 저장 작업이 많은 경우 특정 디스크의 I/O에서 bdflush 스레드가 차단되어 다른 디스크의 I/O 쓰기 저장 작업이 수행되지 않을 수 있습니다. 시간에 맞춰 실행됩니다. |
pdflush | 버전 2.6에 도입 | pdflush 스레드 수는 동적이며 시스템의 I/O 로드에 따라 달라집니다. 이는 시스템의 모든 디스크에 대한 전역 작업입니다. 그러나 pdflush는 모든 디스크를 지향하므로 혼잡한 디스크에서 여러 pdflush 스레드가 모두 차단될 수 있으며 이로 인해 다른 디스크의 I/O 쓰기 저장이 제때 실행되지 않을 수도 있습니다. |
플러셔 스레드 | 버전 2.6.32 이후 도입됨 | 플러셔 스레드 개수가 고유하지 않으며, 플러셔 스레드가 모든 디스크에 적용되는 것은 아니지만 각 플러셔 스레드가 하나의 디스크에 해당합니다 |
페이지 캐시 재활용
Linux에서 페이지 캐시의 교체 논리는 이중 체인 전략이라고도 알려진 수정된 LRU 구현입니다. 이전과 달리 Linux는 더 이상 하나의 LRU 연결 목록을 유지하지 않고 활성 연결 목록과 비활성 연결 목록이라는 두 개의 연결 목록을 유지합니다. 활성 목록의 페이지는 "핫"으로 간주되어 교체되지 않지만, 비활성 목록의 페이지는 교체될 수 있습니다. 활성 목록의 페이지는 액세스할 때 비활성 목록에 있어야 합니다. 연결된 목록은 모두 의사 LRU 규칙에 의해 유지됩니다. 페이지는 대기열처럼 꼬리에서 추가되고 머리에서 제거됩니다. 두 개의 연결 목록은 균형을 이루어야 합니다. 활성 연결 목록이 너무 커지고 비활성 연결 목록을 초과하면 활성 연결 목록의 헤드 페이지가 비활성 연결 목록으로 다시 이동되어 다시 재활용될 수 있습니다. 이중 연결 리스트 전략은 기존 LRU 알고리즘의 단일 액세스 딜레마를 해결합니다. 그리고 의사 LRU 의미 체계를 구현하는 것이 더 쉽습니다. 이 이중 연결 리스트 방법을 LRU/2라고도 합니다. 가장 일반적인 것은 n개의 연결 리스트이므로 LRU/n이라고 합니다.
[추천 학습: "linux video tutorial"]
Summary
이번에 발생한 온라인 장애의 근본 원인은 비즈니스 로직에서 캐싱을 위해 임시 파일을 사용하고, 임시 파일을 짧은 시간 내에 삭제되면 이때 이 파일에 대한 작업은 페이지 캐시에서 수행되며 실제로 디스크에 다시 기록되지 않습니다. 프로그램에 문제가 발생하여 응답 속도가 느려지면 임시 파일의 생존 시간이 길어지고 이로 인해 디스크에 다시 기록되어 과도한 디스크 압력이 발생하고 전체 시스템에 영향을 미칠 수 있습니다.
위 내용은 Linux 디스크 캐시 관련 지식 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!