파일이 캐시되기 전에 tmpfs가 스왑되도록 만들거나 강제 실행

파일이 캐시되기 전에 tmpfs가 스왑되도록 만들거나 강제 실행

다음 시나리오를 고려해보세요. 너가 하나 가지고 있네느린읽기 전용 미디어(예: 쓰기 금지된 썸 드라이브, CD/DVD 등)(Live CD 자체가 아니라 일반 버전)에서 Linux를 마운트하고 다른 형태의 저장 장치가 없는 컴퓨터에서 사용하세요. USB2라서 느립니다. 루트 파일 시스템은 로그 및 기타 많은 임시 작업에 "쓰기"할 수 있도록 overlayfs로 마운트되지만 모든 쓰기는 RAM(tmpfs upperdir)에 기록됩니다. 이는 라이브 배포의 매우 일반적인 시나리오입니다.

다른 형태의 저장소가 없기 때문에 스왑은 zram에 마운트됩니다. 따라서 Linux는 교체하기로 결정하면 해당 페이지를 압축하고 여전히 RAM에 저장하지만 적어도 압축됩니다. 대부분의 응용 프로그램의 RAM은 쉽게 압축되므로 이는 실제로 좋습니다(RAM은 일반적으로 "빠르다"는 의미이므로 데이터와 매우 중복됩니다). 이는 애플리케이션 메모리에는 작동하지만 tmpfs에는 작동하지 않습니다.

문제는 다음과 같습니다. zram은빠르게,믿을 수 없는. 반면에 Thumb 드라이브는 느립니다. 20MiB/s라고 가정해 보겠습니다. 이는 비교해 보면 정말 느린 속도입니다. 여기에서 문제와 커널이 올바른 작업을 수행하지 않는 이유를 확인할 수 있습니다.

참고로 이 질문은아니요반복의TMPFS 내의 파일을 교환할 가능성을 높이는 방법. 질문은 거의 동일하지만 해당 질문에 대한 답변이 만족스럽지 않습니다. 죄송합니다. 커널은 다음과 같아야합니다아니요무슨 일이 있어도 스스로 "올바른 일"을 하십시오.영리한디자인한 사람이 그랬어요. 나는 사람들이 상황을 이해하지 못하고 자신이 더 잘 안다고 생각하는 것을 좋아하지 않습니다. 그들은 일반적인 상황을 충족시킵니다. 이것이 바로 Linux가 적응력이 뛰어난 이유입니다. 아무리 똑똑하더라도 자신이 무엇을 할지 예측할 수 없기 때문입니다.

예를 들어, 설정할 수 있습니다.가상 머신 전환 가능성(/proc/sys/vm/swappiness)를 100으로 설정합니다. 이는 애플리케이션 메모리를 적극적으로 교체하고 파일 캐시를 보존하도록 지시합니다. 이 옵션은 훌륭하지만 불행히도 이것이 전부는 아닙니다.

우선순위로 두고 싶습니다파일 캐시 유지스왑을 처리할 때 다른 어떤 RAM 사용량보다 더 많은 RAM을 사용합니다. 이는 파일 캐시를 제거하면 속도가 훨씬 느린 느린 20MiB/s 드라이브에서 다시 읽어야 하기 때문입니다.많은zram으로 바꾸는 것보다 느립니다. vm.swappiness는 애플리케이션에서는 작동하지만 tmpfs에서는 작동하지 않습니다.

tmpfs는 페이지 캐시로 마운트되므로 파일 캐시와 우선순위가 동일합니다. tmpfs에서 파일을 읽으면 이전 파일 캐시 항목(가장 최근에 사용된 항목)보다 우선합니다. 하지만 이건 짜증나, 커널은 분명해확실히여기서 옳은 일을 하세요. 드라이브에서 데이터를 읽는 속도가 매우 느리기 때문에 tmpfs를 zram으로 바꾸는 것이 "최근 사용된" 파일 캐싱보다 훨씬 낫다는 점을 고려해야 합니다.

따라서 파일 캐시보다 tmpfs에서 더 자주 교체하도록 명시적으로 지시해야 합니다. 즉, tmpfs보다 파일 캐시를 더 자주 보존해야 합니다. /proc/sys/vm에는 많은 옵션이 있지만 관련 옵션을 찾을 수 없습니다. 정말 실망 스럽습니다.

이것이 실패하면 일부 장치/드라이버가 다른 장치/드라이버보다 훨씬 느리고 다른 장치보다 캐시를 ​​예약하는 것을 선호해야 한다고 커널에 알리는 방법이 있습니까? tmpfs와 zram은 빠릅니다. 썸 드라이브는 그렇지 않습니다. 커널에 이 정보를 알릴 수 있나요?

모든 드라이브를 동일하게 취급하면 자체적으로 "올바른 작업"을 수행할 수 없습니다. tmpfs를 zram과 같은 빠른 드라이브로 교체하는 것은 최근에 tmpfs를 사용한 경우에도 느린 드라이브에서 캐시를 제거하는 것보다 훨씬 빠릅니다.

사용 가능한 메모리가 부족해지면 스왑 가능성으로 인해 애플리케이션 메모리 스왑을 시작하거나(좋음) 오래된 파일 캐시를 삭제합니다(나쁨). 결국 이 파일을 다시 읽으면 속도가 매우 느려질 것입니다. 일부 tmpf를 교체하고(최근에 사용한 경우에도) 다시 읽는 것보다 훨씬 느립니다. zram이 훨씬 더 빠르기 때문입니다.

답변1

증가하다교환성값을 사용하면 커널이 tmpfs 페이지를 더 많이 교환하고 스와핑을 지원하지 않는 다른 파일 시스템에서 캐시된 페이지를 제거하려는 의지를 덜 갖게 됩니다.

zram 스왑은 썸 드라이브보다 빠르므로 이상적으로는 스왑성을 100 이상으로 늘리는 것이 좋습니다. 이는 커널 버전 5.8 이상에서만 가능합니다. Linux 5.8에서는 스왑성을 최대 200으로 설정할 수 있습니다.

zram이나 zswap과 같은 메모리 스왑의 경우 100 이상의 값을 고려할 수 있습니다. 예를 들어 스왑 장치에 대한 임의 IO가 파일 시스템의 IO보다 평균 2배 빠른 경우 스왑 가능성은 133(x + 2x = 200, 2x = 133.33)이어야 합니다.

--문서/AdminGuide/sysctl/vm.rst


추가 읽기

tmpfs는 다른 스왑 가능한 메모리처럼 취급됩니다.

커널 커밋 보기"vmscan: LRU 목록을 익명 및 파일 세트로 분할"——

LRU 목록을 두 부분으로 분할합니다. 하나는 실제 파일 시스템이 지원하는 페이지("파일")이고 다른 하나는 메모리 및 스왑이 지원하는 페이지("익명")입니다. 후자에는 tmpfs가 포함됩니다.

- 그리고 코드linux-4.16/mm/vmscan.c:2108-

/*
 * Determine how aggressively the anon and file LRU lists should be
 * scanned.  The relative value of each set of LRU lists is determined
 * by looking at the fraction of the pages scanned we did rotate back
 * onto the active list instead of evict.
 *
 * nr[0] = anon inactive pages to scan; nr[1] = anon active pages to scan
 * nr[2] = file inactive pages to scan; nr[3] = file active pages to scan
 */
static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
               struct scan_control *sc, unsigned long *nr,
               unsigned long *lru_pages)
{
    int swappiness = mem_cgroup_swappiness(memcg);

...

    /*
     * With swappiness at 100, anonymous and file have the same priority.
     * This scanning priority is essentially the inverse of IO cost.
     */
    anon_prio = swappiness;
    file_prio = 200 - anon_prio;

Linux 5.8에서는 다음을 허용합니다.교환성최대값은 200입니다.

mm: 교환을 허용하고 파일 작업 세트보다 익명 재활용을 우선시합니다.

빠른 임의 IO 장치(SSD, PMEM) 및 메모리 내 스왑 장치(예: zswap)의 출현으로 스와핑은 파일 시스템보다 훨씬 빨라질 수 있으며 파일 시스템 캐시를 스래싱하는 것보다 스와핑이 더 좋습니다.

스왑 기본 설정 범위를 구성하여 이러한 상황을 반영하도록 스왑 기능(페이지 캐시와 스왑 지원 페이지 간 캐시 누락의 대략적인 상대적 IO 비용을 정의)을 설정할 수 있습니다.

이는 Linux 5.8에 제공되는 일련의 패치 중 일부입니다. 이전 버전에서 Linux는 "주로 페이지 캐싱을 사용하고 가상 머신이 심각한 메모리 부족을 겪을 때까지 스와핑을 연기했습니다." 이는 "알고리즘 개발 중에 회전하는 드라이브의 탐색 비용이 높기 때문입니다. 이는 버그가 지나치게 공격적인 스와핑(주로 무작위 IO)으로 인해 빠르게 작동 중지로 이어질 수 있음을 의미합니다."

이 시리즈는 이 문제를 해결하는 것을 목표로 합니다. 커밋("a528910e12ec mm: Flutter 감지에 따라 파일 캐시 크기 조정") 이후 오류 IO를 정확하게 추적할 수 있게 되었으며 이는 오류 페이지를 회수하는 데 드는 궁극적인 비용입니다. 이를 통해 불필요한 스왑 스톰을 피하면서 캐시 스래싱 중에 익명 메모리를 보다 적극적으로 검사하는 IO 비용 기반 균형 조정 모델을 사용할 수 있습니다.

이러한 패치는 각 목록의 실패율에 스왑 장치와 파일 시스템 간의 상대적 IO 비용(스왑성)을 곱한 LRU 밸런싱을 기반으로 하므로 발생하는 IO 비용을 최소화하도록 재생이 최적화됩니다.

--[패치 00/14] mm: 상대 지터 v2를 기반으로 한 균형 잡힌 LRU 목록

관련 정보