Linux에서 RAM으로 파일 캐싱 / 사전로드


74

나는 4GB의 RAM을 가진 다소 오래된 서버를 가지고 있으며 하루 종일 동일한 파일을 제공하지만 3GB의 RAM은 "무료"인 반면 하드 드라이브에서 그렇게하고 있습니다.

램 드라이브를 사용해 본 사람이라면 누구나 속도면 에서 최고 라는 것을 목격 할 수 있습니다 . 이 시스템의 메모리 사용량은 일반적으로 1GB / 4GB보다 높지 않으므로 추가 메모리를 좋은 방법으로 사용할 수 있는지 알고 싶습니다.

  • 파일 시스템에 RAM에서 특정 파일을 항상 제공하도록 지시 할 수 있습니까?
  • RAM을 사용하여 파일 읽기 기능을 향상시키는 데 사용할 수있는 다른 방법이 있습니까?

더 구체적으로, 나는 여기서 '핵'을 찾고 있지 않다. 램 드라이브를 만들고 파일을 수동으로 복사하지 않고도 RAM에서 파일을 제공하기 위해 파일 시스템 호출을 원합니다. 또는 적어도 나를 위해 이것을하는 스크립트.

가능한 응용 프로그램은 다음과 같습니다.

  • 많이 읽히는 정적 파일이있는 웹 서버
  • 큰 라이브러리가있는 응용 프로그램 서버
  • RAM이 너무 많은 데스크탑 컴퓨터

어떤 아이디어?

편집하다:

  • :이 매우 유익한 찾을 리눅스 페이지 캐시와 pdflush
  • Zan이 지적했듯이 메모리는 실제로 비어 있지 않습니다. 내 말은 응용 프로그램에서 사용하지 않고 메모리에 캐시 해야하는 것을 제어하고 싶다는 것입니다.

1
나도이 노선을 따라 무언가를 찾고 있습니다. 일반적인 파일 시스템 디스크 블록 캐싱이 답이라고 생각하지 않습니다. 디스크 블록 X가 항상 캐시되기를 원한다고 가정하십시오. 무엇인가가 접근하고 커널이 그것을 캐시합니다. 지금까지는 좋지만 다음 프로세스는 블록 Y를 원하므로 커널은 블록 X를 버리고 대신 Y를 캐시합니다. X를 원하는 다음 프로세스는 X가 디스크에서 나올 때까지 기다려야합니다. 그것이 내가 피하고 싶은 것입니다. 내가 원하는 것은 (그리고 원래의 포스터도 나중이라고 생각하는 것) 파일에 항상 쓰기를 보장하는 파일 시스템에 연속 기입 캐시를 오버레이하는 것입니다

1
리눅스가 이미 자주 사용하는 파일을 캐싱해야한다는 의견이 일치한다는 것을 감안할 때, 여기에있는 조언을 사용하여 실제로 개선 작업을 수행했는지 궁금합니다. 캐싱을 수동으로 제어하려고 시도하면 캐시를 워밍업하는 것이 유용 할 수 있지만 설명하는 사용 패턴 ( "하루 종일 같은 파일을 제공")을 사용하면 이미 워밍업 된 서버에 도움이되지 않습니다. 아주 많이 요
Nate CK

당신은 핵을 찾고 있지 않다고 말하지만, 리눅스는 이미 기본적으로 원하는 것을 수행합니다. 다음 방정식 : "하루 종일 같은 파일을 제공"+ "RAM에서 특정 파일을 항상 제공하도록 파일 시스템에 알리기"는 정의상 "해킹"과 같습니다. 실제로 성능 개선이 있었습니까? 필자의 경험에 따르면 Linux 캐시는 파일 시스템에서 읽은 베 지수입니다.
Mike S

2
설명을 위해 Linux는 파일을 캐시하지만 각 요청에 대해 각 파일에 대해 메타 데이터의 유효성이 검사됩니다. 녹이 슬거나, 파일이 많은 바쁜 웹 서버에서 IO 경합이 발생하고 드라이브가 조기에 마모 될 수 있습니다. 정적 컨텐츠 및 스크립트는 / dev / shm으로 rsync하거나 앱 시작시 사용자 정의 tmpfs 마운트 할 수 있습니다. 나는 이것을 수십 년 동안 해왔고 드라이브는 조기에 마모되지 않습니다. 또한 내 사이트는이 방법으로 심한 버스트 부하를 훨씬 잘 견뎌냅니다. 이는 가장 비싼 엔터프라이즈 하드웨어에서 상용 하드웨어에 이르기까지 모든 작업에 도움이됩니다.
아론

답변:


57

vmtouch 는 작업에 유용한 도구 인 것 같습니다.

하이라이트:

  • 얼마나 많은 디렉토리가 캐시되는지 쿼리
  • 캐시되는 파일의 양을 쿼리합니다 (또한 페이지, 그래픽 표현).
  • 캐시에 파일로드
  • 캐시에서 파일을 제거
  • 캐시에 파일 잠금
  • 데몬으로 실행

vmtouch 매뉴얼

편집 : 질문에 표시된 사용법은 vmtouch Hompage의 예 5에 나와 있습니다.

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2 :주목 코멘트에, 지금이 자식 저장소 가능합니다.


5
향후 뷰어의 경우 링크 된 페이지의 지시 사항을 따르지 않고 vmtouch git 저장소 를 사용 하십시오. 그렇게하면 makefile을 얻고 업데이트를 가져올 수 있습니다.
무작위

파일 크기 (4GB)에 제한이있는 것 같습니다. 다른 대안이 있습니까?
Alix Axel

자, 실제 사용 사례는 다음과 같습니다. 오래된 SD 카드가있는 RPi1이 있습니다. 여행을 떠나기 전에 카드 (및 가능하면 전원 공급 장치)를 교체하기 전에 OS가 카드를 조금만 터치하는 것이 바람직합니다. FS 캐시는 훌륭하지만 내 통제 범위를 벗어납니다. / bin 및 / sbin은 이미 tmpfs에 있으므로 / home / user를 가져 오는 것도 다른 단점이 있습니다. vmtouch이 틈새 시장에 잘 맞습니다.
Piskvor

vmtouch는 tmpfs와 어떻게 다르게 작동합니까?
Edward Torvalds

26

vmtouch Virtual Memory Toucher 유틸리티를 사용하여 가능 합니다 .

이 도구를 사용하면 Linux 시스템에서 파일 시스템 캐시를 제어 할 수 있습니다. VM 캐시 서브 시스템에서 특정 파일 또는 디렉토리를 강제로 잠 그거나이를 사용하여 파일 / 디렉토리의 어떤 부분이 VM에 포함되어 있는지 확인할 수 있습니다.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

또는...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
이것은 훌륭한 유틸리티이며 OP가 요청한 것을 정확하게 수행합니다. 만약 그가 이걸 대답으로 받아 들일 것이라면.
laebshade

이것이 ZFS와 함께 작동하는지 알고 있습니까?
CMCDragonkai

1
@CMCDragonkai ZFS에는 필요하지 않다고 생각합니다 ... Think : ARC and L2ARC .
ewwhite

22

파일 시스템 캐시로 물건을 가져 오는 데 대한 가난한 사람의 트릭은 단순히 캐시하여 / dev / null로 리디렉션하는 것입니다.


1
동의하다. 특정 파일이 캐시되도록 cat하려면 파일을 주기적으로 / dev / null로 보내는 크론 작업을 수행하십시오.
Josh

18

리눅스는 가능한 많은 메모리에 디스크 IO를 캐시 할 것이다. 이것이 캐시 및 버퍼 메모리 통계입니다. 올바른 것을 저장하는 것보다 더 나은 작업을 수행 할 것입니다.

그러나 데이터를 메모리에 저장해야한다면 tmpfs 또는 ramfs를 사용하여 램 드라이브를 만들 수 있습니다. 차이점은 ramfs가 요청한 모든 메모리를 할당한다는 것입니다. tmpfs는 블록 장치가 사용하는 메모리 만 사용하기 때문입니다. 내 기억은 조금 녹슬지 만, 당신은 할 수 있어야합니다 :

 # mount -t ramfs ram /mnt/ram 

또는

 # mount -t tmpfs tmp /mnt/tmp

그런 다음 데이터를 디렉토리에 복사하십시오. 머신을 끄거나 파티션을 마운트 해제하면 데이터가 손실됩니다.


1
귀하의 답변에 감사드립니다, 그러나 이것은 분명히 피하고 싶은 것입니다. 그렇지 않으면 컴퓨터가 램 드라이브를 생성하고 파일을 복사하며 램 드라이브에 심볼릭 링크되도록 스크립트를 작성했습니다. 그러나 내 데이터가 일치하지 않습니다. 특정 파일을 메모리에 캐시 할 수있는 파일 시스템을 원했습니다. 하지만 어쩌면 나는 너무 낙관적입니다.
Andrioid

3
파일에 액세스하여 캐시 할 파일에 "태그"를 붙입니다.
womble

9
가장 일반적으로 사용되는 파일에 자동으로 태그를 지정할 수있는 방법이 있다면.
David Pashley

4
Blimey, sarcasm은 잘 여행하지 않습니다 :)
David Pashley

2
네 감사합니다. IO 캐싱의 개념을 이해합니다. 나는 심지어 내 대답으로 그것을 설명했다. 당신은 그것이 냉소적 이었다는 미묘한 의견을 읽지 않은 것 같습니다.
David Pashley

18

2.6 커널 스와핑 및 페이지 캐싱 기능에 대한 광범위한 내용을 읽은 후 'fcoretools'를 발견했습니다. 두 가지 도구로 구성됩니다.

  • fincore : 애플리케이션이 코어 메모리에 저장 한 페이지 수를 나타냅니다.
  • fadvise : 코어 메모리 (페이지 캐시)를 조작 할 수 있습니다.

(다른 누군가 가이 흥미로운 것을 발견하면 여기에 게시하고 있습니다)


1
나는 어딘가에 그것을 할 수있는 프로그램이 있다고 생각했다. +1
브래드 길버트

7

다른 도구를 사용하지 않아도 크게 도움이되는 두 가지 커널 설정이 있습니다.

교환

리눅스 커널에게 스왑을 얼마나 적극적으로 사용해야하는지 알려줍니다. Wikipedia 기사 인용 :

Swappiness는 시스템 페이지 캐시에서 페이지를 삭제하는 대신 런타임 메모리 교체 간의 균형을 변경하는 Linux 커널의 속성입니다. 교환 율은 0에서 100 사이의 값으로 설정할 수 있습니다. 값이 낮을수록 커널은 가능한 많이 스왑을 피하려고 시도하지만 값이 높을수록 커널이 적극적으로 스왑 공간을 사용하려고합니다. 기본값은 60이며 대부분의 데스크톱 시스템에서 100으로 설정하면 전체 성능에 영향을 줄 수 있지만 낮게 설정 (0이라도)하면 대화 형 작업이 향상 ​​될 수 있습니다 (응답 대기 시간 감소).

vfs_cache_pressure

vm.txt 에서 인용 :

커널이 디렉토리 및 inode 객체를 캐싱하는 데 사용되는 메모리를 회수하는 경향을 제어합니다.

vfs_cache_pressure = 100의 기본값에서 커널은 pagecache 및 swapcache 재생과 관련하여 "공정한"속도로 덴 트리 및 inode를 재생하려고 시도합니다. vfs_cache_pressure를 줄이면 커널은 dentry 및 inode 캐시를 유지하는 것을 선호합니다. ...


swappiness커널을 100과 같이 높게 설정 하면 커널은 교체 할 필요가없는 모든 것을 이동시켜 파일 캐싱을위한 RAM을 비 웁니다. 그리고 vfs_cache_pressure더 낮게 설정 하면 (0이 아닌 50 으로 설정 ) 응용 프로그램 데이터를 RAM에 유지하는 대신 파일 캐싱을 선호합니다.

(저는 큰 Java 프로젝트를 작업하고 실행할 때마다 많은 RAM이 필요하고 디스크 캐시를 플러시했습니다. 따라서 다음에 프로젝트를 컴파일 할 때 모든 것을 디스크에서 다시 읽었습니다.이 두 설정을 조정하여 관리합니다. 소스와 컴파일 된 출력을 RAM에 캐시하여 프로세스 속도를 크게 향상시킵니다.)


3

실제로 3GB RAM이없는 디스크에서 파일을 제공한다는 것은 의심의 여지가 있습니다. 리눅스 파일 캐싱은 매우 좋습니다.

디스크 IO가 표시되면 로깅 구성을 살펴 보겠습니다. 충돌시 최신 로그 정보를 사용할 수 있도록 많은 로그가 버퍼되지 않은 상태로 설정됩니다. 속도에 관계없이 속도가 빠른 시스템에서는 버퍼 로그 IO를 사용하거나 원격 로그 서버를 사용하십시오.


바로 당신은, 나는 캐시되는 것을 제어하고 싶습니다.
Andrioid

3

메모리가 충분하면 cat 또는 이와 유사한 것으로 캐시하려는 파일을 간단히 읽을 수 있습니다. 리눅스는 잘 관리 할 것이다.


3

mmap파일을 저장 한 다음 계속 실행 되는 프로그램을 가질 수 있습니다 .


3
그것은 내가 말할 수있는 한 'fadvise'(fcoretools) 가하는 일과 거의 같습니다.
Andrioid

0

사용할 수있는 다양한 ramfs 시스템 (예 : ramfs, tmpfs)이 있지만 일반적으로 파일을 실제로 읽는 경우 파일 시스템 캐시에 저장됩니다. 작업중인 파일 세트가 사용 가능한 램보다 크면 파일이 지워집니다. 그러나 작업 세트가 사용 가능한 램보다 큰 경우 램 디스크에도 모두 넣을 수있는 방법이 없습니다.

쉘에서 "free"명령의 출력을 확인하십시오. "Cached"아래 마지막 열의 값은 파일 시스템 캐시에 사용중인 여유 램의 양입니다.


0

후자의 질문에 관해서는, 프로세서가 데이터를 병렬로 가져올 수 있도록 RAM이 다른 메모리 채널에 앉아 있는지 확인하십시오.


0

나는 이것이 응용 프로그램 수준에서 더 잘 해결 될 것이라고 생각합니다. 예를 들어, 특수한 웹 서버가 있거나 Apache와 함께 mod_cache 를 고려할 수 있습니다 . 웹 콘텐츠를 더 빨리 제공하는 것과 같은 특정 목표가 있다면, 내가 생각하는 이런 종류의 개선을 얻을 수 있습니다.

그러나 귀하의 질문은 일반적으로 Linux 메모리 하위 시스템은 RAM을 가장 일반적으로 사용하도록 설계되었습니다. 특정 유형의 성능을 대상으로하려면 / proc / sys / vm의 모든 항목을 찾아보십시오.

fcoretools 패키지는 흥미 롭습니다. 응용 프로그램에 대한 기사에 관심 이 있습니다 ... 이 링크 는 응용 프로그램에 사용 된 실제 시스템 호출에 대해 설명합니다.


1
/ var / lib / mysql 찾기 | xargs fadvise -willneed (더러워 지지만 데이터베이스 파일에 더 빠르게 액세스해야합니다. 예를 들어)
Andrioid

. 아주 좋은 해킹,하지만 같은 해킹이 MySQL의에서 fsyncs을 기다리는 많은 비활성화되지 않습니다 :( fsyncs은 (원 자성, 일관성, 격리, 영속성) ACID를 보장하기 위해 필요하다
osgx

0

데스크탑 컴퓨터 (예 : 우분투)는 부팅시 메모리에 미리로드 파일 (적어도 인기있는 공유 라이브러리)을 이미 사용하고 있습니다. 서로 다른의 부팅과 시작 시간을 빠르게하는 데 사용됩니다 bloarware FF, OO, KDE와 (진화 팽창 메일러와) GNOME 등이.

이 도구의 이름은 readahead http://packages.ubuntu.com/dapper/admin/readahead

해당 syscall도 있습니다 : readahead (2) http://linux.die.net/man/2/readahead

프리로드 데몬 프로젝트도 있습니다 : http://linux.die.net/man/8/preload



0

방금 dd if = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill을 시도했습니다.

그것은 나에게 당신이 원하는 통제권을주지 않지만 적어도 낭비 된 메모리를 사용하려고합니다.


0

find / -name stringofrandomcharacter를 사용하여 많이 도움이됩니다.


0

정확히 무엇을 요구했지만, 나는

BASE_DIRECTORY -type f -exec cat {}> / dev / null \;을 찾으십시오.

스냅 샷에서 생성 된 AWS 볼륨의 파일 초기화를 트리거합니다. 일부 파일을 읽으려면 dd를 사용하는 공식 권장 사항보다 더 집중되어 있습니다.


-1

때로는 특정 폴더와 하위 폴더에 파일을 캐시하고 싶을 수도 있습니다. 이 폴더로 이동하여 다음을 실행합니다.

검색 . -exec cp {} / dev / null \;

그리고 그 파일들은 캐시됩니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.