[unix] Linux에서 버퍼 캐시 크기 제한

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

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

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



답변

절대 제한을 원하지 않고 커널이 버퍼를 더 빨리 플러시하도록 압력을 가하는 경우, 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 자원 관리 안내서


답변

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+$


답변

나는 당신의 질문 끝에 당신의 직감이 올바른 길에 있다고 생각합니다. 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) 플래그를 확인하여 실제로 어떤 물리적 페이지에 실제 페이지가 매핑되어 있는지 확인할 수 있습니다.)

행운을 빕니다!


답변

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


답변

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 ).


답변