단일 프로세스에 대해 블록 캐싱을 끄는 방법은 무엇입니까?

단일 프로세스에 대해 블록 캐싱을 끄는 방법은 무엇입니까?

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

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

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

백업은 하나의 블록 장치를 다른 블록 장치로 복사하여 수행됩니다.buffer주문하다. 캐싱이 필요할 가능성은 거의 0입니다.

그러나 백업이 실행 중이면 정상적인 서비스가 저하됩니다. 낮게 주다ionice별로 도움이 되지 않습니다. 문제는 IO 우선순위가 아니라 블록 캐시를 원치 않는 데이터로 덮어쓰는 것입니다.

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

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

답변1

찾았어요nocache작업을 위한 도구.

일반적으로 말하면 Linux에서는 이것이 불가능합니다.프로세스.

하지만, 그posix_fadvise(...)순차적 읽기/쓰기 작업이 필요할 때 호출을 사용하여 블록/버퍼 캐시 하위 시스템에 알릴 수 있습니다. A는 POSIX_FADV_DONTNEED커널에 "추가 정보"를 제공하는데, 가까운 시일 내에 다시 읽혀지지 않으므로 캐시해서는 안 됩니다.

nocacheposix_fadvise(...)환경 변수를 통해 주입된 공유 라이브러리를 통해 모든 중요한 파일 작업을 차단합니다 LD_PRELOAD.

이름에서 알 수 있듯이 이것은 단지 제안일 뿐이지만 내 실험에서 알 수 있습니다.거대한성능 향상(실제로 최종 사용자에게 눈에 띄는 성능 저하 없이 다른 중요한 작업을 백그라운드 백업과 병렬로 실행할 수 있습니다).

답변2

nocache실제로 이와 같은 도구 는아니요적절한 솔루션. 인용하다캐시 없음원산지 :

이 도구는 무엇입니까?아니요적합한:

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

따라서 프로세스가 사용할 수 있는 캐시의 양을 제한하려면 cgroups(보다 정확하게는 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.scopeparent 라는 그룹을 생성합니다 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

관련 정보