개별 프로세스에 대해 블록 캐시를 끄는 방법은 무엇입니까?

개별 프로세스에 대해 블록 캐시를 끄는 방법은 무엇입니까?

나는 많은 디스크 바인딩 서비스를 갖춘 대규모 시스템을 가지고 있습니다. 블록 캐시를 사용하면 훨씬 더 잘 작동합니다.

그 외에도 일부 백업 프로세스도 실행 중입니다.

나는 그들이 블록 캐시를 어떻게 사용해야 하는지 알고 있습니다. 절대 사용해서는 안 됩니다.

백업은 블록 장치를 다른 블록 장치로 복사하여 발생합니다.buffer명령. 캐싱이 필요할 확률은 사실상 0입니다.

그러나 백업이 실행되면 일반 서비스가 저하됩니다. 낮은 것을 주는 것ionice그다지 도움이 되지 않습니다. 문제는 IO 우선순위가 아니라 블록 캐시를 불필요한 데이터로 덮어쓰는 것입니다.

buffer블록 캐시를 전혀 사용하지 않도록 이 명령을 어떻게든 설정할 수 있습니까 ?

중요한 경우 lvm 볼륨을 다른 볼륨으로 복사합니다.

답변1

나는 찾았다nocache작업을 위한 도구입니다.

일반적으로 Linux에서는 불가능합니다. 그러한 옵션이나 플래그 등을 설정할 수 있는 것이 없습니다.프로세스.

그러나, 그posix_fadvise(...)호출은 연속적인 읽기/쓰기 작업이 예상될 때 블록/버퍼 캐시 하위 시스템에 조언하는 데 사용될 수 있습니다. A는 POSIX_FADV_DONTNEED커널에 "추가 정보"를 제공하여 가까운 미래에 다시 읽혀지지 않으므로 캐시해서는 안 됩니다.

nocacheposix_fadvise(...)환경 변수 에 의해 주입된 공유 lib를 통해 모든 중요한 파일 작업을 가로챕니다 LD_PRELOAD.

이름에서 알 수 있듯이 이는 단지 조언일 뿐입니다. 그러나 내 실험에서는거대한성능 향상(효과적으로 최종 사용자에게 눈에 띄는 성능 저하 없이 다른 중요한 작업이 백그라운드에서 백업과 병렬로 실행될 수 있음)

답변2

nocache실제로는 다음과 같은 도구가 있습니다.~ 아니다적절한 솔루션. 인용하다노캐시님의 출처:

이 도구는 무엇입니까?~ 아니다좋은:

  • 페이지 캐시 사용 방법 제어
    • GitHub에서 찾은 임의의 도구가 Linux 커널보다 더 나은 성능을 발휘할 수 있는 이유가 무엇이라고 생각하시나요?
  • 캐시 스래싱 방어
    • cgroup을 사용하여 프로세스의 메모리 양을 제한합니다. 아래를 참조하거나 인터넷을 검색해 보세요. 이 방법은 널리 알려져 있고 안정적으로 작동하며 이 도구처럼 성능 저하나 잠재적으로 위험한 동작을 발생시키지 않습니다.

따라서 cgroup을 사용하여(더 정확하게 말하면 2023년에는 가능할 때마다 확실히 cgroupsv2가 됩니다) 프로세스가 사용할 수 있는 캐시의 양을 제한합니다(따라서 제거할 수 있는 캐시의 양을 제한합니다).

메모리 제한 cgroup에서 프로세스와 그 하위 프로세스를 실행하는 방법

예를 들어 백업을 실행하고 싶지만 페이지 캐시 스래싱으로 인해 시스템 속도가 느려지는 것을 원하지 않는 경우 이 작업을 수행하십시오.

systemd를 사용하는 경우

배포판이 를 사용하는 경우 systemd이는 매우 쉽습니다. Systemd를 사용하면 cgroup인 "범위"에서 프로세스(및 해당 하위 프로세스)를 실행할 수 있으며 cgroup 제한으로 변환되는 매개 변수를 지정할 수 있습니다.

백업을 실행할 때 다음을 수행합니다.

$ systemd-run --scope --property=MemoryLimit=500M -- backup command 

( MemoryMaxv2의 경우)

그 결과 캐시 공간은 추가 최대 500MiB로 제한됩니다.

전에:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.4G        1.3G        1.0G        3.7G        3.7G
Swap:          9.7G         23M        9.7G

동안(버프/캐시가 ~300MiB까지만 증가하는지 확인):

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.5G        1.0G        1.1G        4.0G        3.6G
Swap:          9.7G         23M        9.7G

어떻게 작동하나요?

systemd-cglssystemd가 생성하는 cgroup을 나열하는 데 사용됩니다 . 내 시스템에서 위 명령은 상위 그룹 run-u467.scope에서 호출되는 그룹을 생성합니다 system.slice. 다음과 같이 메모리 설정을 검사할 수 있습니다.

$ mount | grep cgroup | grep memory cgroup on
/sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec
latime,memory)

$ cat /sys/fs/cgroup/memory/system.slice/run-u467.scope/memory.limit_in_bytes
524288000

관련 정보