동일한 파일에서 동시 읽기가 수행되면 Linux가 미리 읽습니다.

동일한 파일에서 동시 읽기가 수행되면 Linux가 미리 읽습니다.

Linux는 파일을 순차적으로 읽을 때 미리 읽기(/sys/block//queue/read_ahead_kb에 지정)를 수행합니다.

관심 있는 OS: 레드햇 리눅스 관심 있는 파일 시스템: xfs, ext4

순차 읽기가 수행되었는지 결정하는 기준은 무엇입니까?pread를 사용하여 동일한 파일에서 여러 동시 읽기를 수행하는 것을 고려하십시오(https://man7.org/linux/man-pages/man2/pwrite.2.html) 동일하거나 다른 FD를 사용합니다.

예를 들어

같은 FD. 위치 10-20-30-78-89(seq 읽기 중) -40-50-60-70 - 23-34(seq 읽기 중)- 80-90-100...에서 읽습니다.

이 경우 위의 미묘한 순서를 벗어난 읽기로 인해 미리 읽기를 피할 수 있습니까?

그렇다면 두 개의 서로 다른 FD를 사용하면 이 문제가 해결됩니까(예: 78-89-23-34에서 읽기에 사용되는 별도의 FD)? (즉, 미리 읽기는 10-20-30-40-50 읽기에 대해 평소와 같이 발생합니다)

답변1

이 경우 위의 미묘한 순서를 벗어난 읽기로 미리 읽기를 피할 수 있습니까?

예, 동일한 파일 설명자에서 순서를 벗어난 읽기는 미리 읽기에 영향을 미칠 수 있지만 커널은 최소한 순차 읽기와 병렬로 진행되는 작은 "무작위" 읽기의 경우 이를 고려하려고 합니다. 보다주문형 미리읽기 설계에 대한 설명, 특히:

인터리빙된 순차 읽기에서는 동일한 fd의 동시 스트림이 서로의 미리 읽기 상태를 무효화할 수 있습니다. 따라서 PG_readahead를 사용하여 (start+size-async_size)에서 새 미리 읽기 페이지에 플래그를 지정하고 이를 미리 읽기 표시기로 사용합니다. 이미 캐시된 페이지에는 플래그가 설정되지 않아 미리 읽어야 하는 번거로움을 피하고 무의미한 페이지 캐시 조회를 절약할 수 있습니다.

다음을 보면 이것이 어디에 적합한지 알 수 있습니다.ondemand_readahead, 특히그 호출try_context_readahead그리고 주변 댓글들.

성능 병목 현상을 제거하려고 할 때 항상 그렇듯이 힌트를 제외하고는 잠재적인 병목 현상을 고려해서는 안 됩니다. 자신만의 벤치마크를 고안하고 특정 시나리오의 성능 특성을 분석해야 합니다. 예를 들어, 순서를 벗어난 읽기는 순차 읽기에 대한 미리 읽기의 결과로 이미 페이지 캐시에 있는 적중 페이지만 읽는 경우가 있을 수 있습니다.

관련 정보