Linux에서 버퍼 캐시 크기 제한


25

리눅스 커널에게 버퍼 캐시에 특정 비율의 메모리 만 사용하도록 지시하는 방법이 있습니까? 내가 알고 /proc/sys/vm/drop_caches일시적으로 캐시를 지우는 데 사용할 수 있지만 영구적 인 설정이 그 메인 메모리의 50 %를 예보다 이상 성장에서 방지를?

내가 원하는 이유는 디스크에서 데이터를 지속적으로 제공하고 몇 시간 내에 전체 물리적 메모리를 버퍼 캐시로 사용하도록 관리하는 Ceph OSD를 실행하는 서버가 있기 때문입니다. 동시에 많은 양의 (수십 GB) 물리적 메모리를 할당 할 응용 프로그램을 실행해야합니다. 일반적인 생각과는 달리 (버퍼 캐시에 관한 거의 모든 질문에 대한 조언 참조) 클린 캐시 항목을 삭제하여 메모리를 자동으로 확보하는 것은 즉각적 이지 않습니다 . *), 캐시를 비운 후 (사용 echo 3 > /proc/sys/vm/drop_caches) 동일한 응용 프로그램이 거의 즉시 시작됩니다.

(*) 시작 시간의이 분 동안 응용 프로그램은 새 메모리에 결함이 있지만 Vtune에 따르면라는 함수의 커널에서 100 %의 시간을 커널에서 보냅니다 pageblock_pfn_to_page. 이 기능은 거대한 페이지를 찾는 데 필요한 메모리 압축과 관련이있는 것 같습니다. 실제로 조각화가 문제라고 생각합니다.


1
캐시 계층화라는 것이 있습니다. ceph osd 풀 세트 {cachepool} hit_set_count 1 ceph osd 풀 세트 {cachepool} hit_set_period 3600 ceph osd 풀 세트 {cachepool} target_max_bytes 1000000000000 예를 참조하십시오. docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.

2
이 문제는 분명히 메모리 집약적 인 응용 프로그램의 시작에만 영향을 미치기 때문에 실제로 시작하기 전에 캐시를 지우는 스크립트를 통해 응용 프로그램을 시작할 수 있습니다. 어쩌면 캐시 관리가 실행되는 동안 캐시 관리를 유지하면서 더 빨리 시작할 수 있습니다.
Thawn

답변:


14

절대 제한을 원하지 않고 커널이 버퍼를 더 빨리 플러시하도록 압력을 가하는 경우, vm.vfs_cache_pressure

이 변수는 커널이 VFS 캐시를 캐시하는 데 사용되는 메모리를 페이지 캐시 및 스왑과 비교하는 경향을 제어합니다. 이 값을 늘리면 VFS 캐시가 재생되는 속도가 증가합니다.

더 높은 압력을 얻으려면 200쪽으로 이동하십시오. 기본값은 100으로 설정되어 있습니다. slabtop명령을 사용하여 메모리 사용량을 분석 할 수도 있습니다 . 귀하의 경우 dentry*_inode_cache값이 높아야합니다.

절대 제한을 원하면을 찾아보십시오 cgroups. Ceph OSD 서버를 cgroup 내에 배치하고 cgroup의 memory.limit_in_bytes매개 변수를 설정하여 사용할 수있는 최대 메모리를 제한하십시오 .

memory.memsw.limit_in_bytes메모리와 스왑 사용량의 최대량을 설정합니다. 단위를 지정하지 않으면 값이 바이트로 해석됩니다. 그러나 접미사를 사용하여 더 큰 단위 (킬로바이트의 경우 k 또는 K, 메가 바이트의 경우 m 또는 M, 기가 바이트의 경우 g 또는 G)를 나타낼 수 있습니다.

참고 문헌 :

[1] -GlusterFS Linux 커널 조정

[2] -RHEL 6 자원 관리 안내서


1
limit_in_bytes세트가 있는 cgroup이 그렇게하는 것 같습니다. 감사!
Wim

4
나는 vfs_cache_pressuredentry와 inode 캐시 만 지우고 버퍼 캐시와는 아무런 관련이 없다고 생각합니다.
kawing-chiu

작업량에 충분한 RAM이없는 경우 vfs_cache_pressure위의 값을 늘리면 100도움이 될 수 있습니다. RAM 사용량은 줄이지 만 전반적으로 I / O 성능이 저하됩니다.
Mikko Rantalainen

3

A %는 모르지만 시간 제한을 설정하여 x 분 후에 떨어 뜨릴 수 있습니다.

터미널에서 처음

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

현재 캐시를 지우려면

그것이 확인 cron-job Alt-F2 누른다는, 유형 gksudo gedit /etc/crontab, 그리고 하단에이 줄을 추가합니다.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

15 분마다 청소합니다. 첫 번째 매개 변수를 * / 15 대신 * 또는 * / 5로 변경하여 실제로 원하는 경우 1 분 또는 5 분으로 설정할 수 있습니다.

캐시를 제외한 여유 RAM을 보려면 :

free -m | sed -n -e '3p' | grep -Po "\d+$

나는 약간의 중복성을 느낍니다. 내가 아는 3 > drop_cachessync
andras.tim

1
@ andras.tim no-sync는 더티 페이지를 디스크에 쓰고 3을 drop_caches는 클린 페이지와 기타 캐시에서 사용하는 메모리 만 회수 / 해제합니다. 동기화를 실행할 필요는 없지만 그렇게하면 캐시를 삭제하면 더티 대신 더 많은 메모리가 깨끗 해지고 더 많은 메모리가 확보됩니다.
Daniel S. Sterling

2

나는 당신의 질문 끝에 당신의 직감이 올바른 길에 있다고 생각합니다. CPU 사이에서 A, NUMA 인식 메모리 할당 마이그레이션 페이지 또는 B, 연속 정렬 된 영역을 찾으려고하는 투명 거대한 페이지의 조각 모음 코드 일 가능성이 큽니다.

Hugepages와 투명한 hugepages는 특정 워크로드에서 현저한 성능 향상과 많은 이점을 제공하지 않고 엄청난 양의 CPU 시간을 소비하는 것으로 식별되었습니다.

실행중인 커널, / proc / meminfo의 내용 (또는 적어도 HugePages_ * 값) 및 가능하면 pageblock_pfn_to_page ()를 참조하는 더 많은 vtune 프로파일 러 호출 그래프를 아는 것이 도움이됩니다.

또한 내 추측에 빠지면 다음과 같이 hugepage 조각 모음을 비활성화하십시오.

echo 'never'> / sys / kernel / mm / transparent_hugepage / defrag

(커널에 따라 대신이 될 수 있습니다.)

echo 'never'> / sys / kernel / mm / redhat_transparent_hugepage / defrag

마지막으로,이 응용 프로그램은 당신이 쓴 무언가의 수십 기가를 사용합니까? 어떤 언어?

"메모리 페이지에서 오류 발생"이라는 용어를 사용 했으므로 운영 설계 및 가상 메모리에 익숙하다고 생각합니다. 나는 거의 I / O에서 읽지 않는 공격적으로 오류가 발생하는 상황 / 응용 프로그램을 구상하려고 노력합니다. 거의 항상 버퍼 캐시에서 제한하려고합니다.

(호기심이 있다면 MAP_ANONYMOUS 및 MAP_POPULATE 및 mincore (2)와 같은 mmap (2) 플래그를 확인하여 실제로 어떤 물리적 페이지에 실제 페이지가 매핑되어 있는지 확인할 수 있습니다.)

행운을 빕니다!


2

Ceph OSD가 별도의 프로세스 인 경우 cgroup 을 사용하여 프로세스가 사용하는 리소스를 제어 할 수 있습니다 .

메모리 제한이있는 group1과 같은 cgroup을 만듭니다 (예 : 50GB, CPU와 같은 다른 제한이 지원됩니다 (예 : CPU도 언급)).

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

그런 다음 앱이 이미 실행중인 경우 앱을이 cgroup으로 가져옵니다.

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

또는이 cgroup 내에서 앱을 실행하십시오.

cgexec -g memory,cpu:group1 your_app_name

0

tuned 는 사용량에 따라 시스템 설정을 동적으로 조정하는 동적 적응 시스템 조정 데몬입니다.

 $ man tuned

관련 문서 및 구성 파일을 참조하십시오.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

추가 정보

동기 명령은 버퍼, 즉, 힘의 모든 기록되지 않은 데이터가 디스크에 기록하고, 하나는 확실히 모든 것을 안전하게 작성되어있을하고자 할 때 사용할 수 있습니다 플러시합니다. 전통적인 UNIX 시스템 에는 백그라운드에서 update 라는 프로그램이 30 초마다 동기화 되는 프로그램이 있으므로 일반적으로 sync를 사용할 필요는 없습니다. Linux에는 추가 데몬 인 bdflush 가있어 동기화가 가끔 발생 하는 디스크 I / O로 인한 갑작스런 정지를 피하기 위해보다 불완전한 동기화를 더 자주 수행합니다 .

Linux에서 bdflush 는 업데이트로 시작됩니다. 걱정할 이유는 없지만 bdflush가 어떤 이유로 죽으면 커널이 이에 대해 경고하므로 직접 시작해야합니다 ( / sbin / update ).


1
더러운 항목에만 해당되지 않습니까? 시스템이 모두 깨끗하기 때문에 이것이 문제라고 생각하지 않습니다. 지연은 더티 페이지를 다시 쓰는 것이 아니라 깨끗한 페이지를 제거하여 남은 공간을 조각 모음하는 것입니다.
Wim

예, 이것은 더티 페이지를위한 것입니다. 동조 모드로 조정하여 다른 성능 문제를 해결할 수도 있습니다.
Ijaz Ahmad Khan

"Linux 2.6부터 [bdflush] 시스템 호출은 더 이상 사용되지 않으며 아무 것도 수행하지 않습니다. 향후 커널 릴리스에서는 완전히 사라질 것입니다. 현재 bdflush ()에 의해 수행되는 작업은 커널 pdflush 스레드에 의해 처리됩니다." man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.