Linux에서 램 디스크 만들기 디스크를 만들어 컴파일 할 것이라고 생각했습니다.

RAM이 62GB 인 머신과 7GB에 불과한 트렁크가 있으므로 RAM 디스크를 만들어 컴파일 할 것이라고 생각했습니다. 저는 Linux 전문가가 아닙니다. 인터넷에서 RAM 디스크를 만드는 지침을 찾았습니다.

mkfs -q /dev/ram1 8192

그러나 16GB의 램 디스크를 할당하기 위해 8192를 16777216으로 변경했습니다.

다음과 같은 오류가 발생했습니다.

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n)

그 시점에서 나는 겁에 질려 도망 쳤다.

sudo dmidecode --type 17 | grep Size

8x8192MB + 2048MB = 67584 MB

하지만 du/dev제공합니다 804K.

그게 문제 야? 그 /dev크기를 극복 할 수 있습니까 ?



답변

리눅스에서 램 디스크를 만드는 가장 좋은 방법은 tmpfs입니다. 램에있는 파일 시스템이므로 ext2가 필요하지 않습니다. 다음을 사용하여 16Gb 크기의 tmpfs를 작성할 수 있습니다.

mount -o size=16G -t tmpfs none /mnt/tmpfs


답변

Linux는 RAM을 사용하는 데 매우 효율적입니다. 와 속도가 향상되면 거의 볼 수 없다는 사실은 거의 놀랍지 않습니다 tmpfs. 메모리로 읽어서 처리 속도를 늦출 수있는 가장 큰 부분은 도구 (컴파일러, 어셈블러, 링커)이며, make시작시 메모리에로드되어 떠나지 않습니다. 남아있는 것은 소스에서 읽는 것입니다 (메모리를 많이 사용하지 않으면 결과를 쓰는 것이 느려지지 않습니다). 다시 말하지만 comon 헤더 파일은 그대로 유지되며 사용자의 소스 만 읽을 필요가 있습니다. 그리고 그것은 몇 메가 바이트 이상일 것 같지 않습니다. 큰 RAM 디스크를 만들거나을 많이 사용 tmpfs하면 빌드 메모리를 제한하여 RAMdisk 또는 파일을 tmpfs 만들 수 없습니다. 거기에서 직접 사용하십시오.


답변

문제는 램 디스크의 최대 크기,보다 구체적으로 램 디스크 드라이버를 통해 액세스 할 수있는 메모리 크기가 컴파일 타임에 구성되고 부팅시 덮어 쓸 수 있지만 커널이 메모리에로드되면 고정 된 상태로 유지된다는 것입니다. 기본값은 아마도 메가 바이트로 측정됩니다. 드라이버를로드 할 때 램 디스크의 메모리가 올바르게 예약되어 있으면 모든 램 디스크의 크기가 동일하며 기본적으로 16 램 디스크가 있습니다. 따라서 16G의 램 디스크 크기도 원하지 않습니다 🙂

다른 답변에서 언급했듯이 tmpfs는 사용하려는 것입니다. 또한 전체 디스크를 ramdisk / tmpfs에 두어도 많은 승리를 거두지 못할 것입니다. builddir을 tmpfs에 복사하고 컴파일을 수행하십시오. 모든 임시 결과가 tmpfs의 위치에 기록되도록해야 할 수도 있습니다.


답변

부팅 후 큰 램 디스크를 만들려면 커널 매개 변수를 엉망으로 만들지 않는 것이 좋습니다. tmpfs를 사용하고 파일을 만들고 루프를 통해 마운트 한 다음 파일 시스템을 통해 마운트하십시오.

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

아마도 여러 다른 계층을 거치는 약간의 성능 저하가 있지만 적어도 작동합니다.


답변

tmpfs및 이외에도 ramfs다른 옵션은 /dev/ram0블록 장치입니다. 최근 Ubuntu 버전에서는이 장치가 기본적으로 존재하지 않지만을 통해 만들 수 있습니다 modprobe brd.

이 접근 방식은 실제 ext4파일 시스템을 생성하고 사용자가 지정한 제한을 초과하지 않기 때문에 더 예측 가능 합니다. 그러나 설정하는 데 더 많은 단계가 필요하며 RAM을 덜 효율적으로 사용합니다.

brd 커널 모듈 (/ dev / ram0) 사용

4GB RAM 디스크를 만들고 초기화하려면 :

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nr매개 변수는 작성할 RAM 디스크 수를 지정합니다 (기본적으로 16 개를 작성 /dev/ram0합니다 /dev/ram15). rd_size매개 변수의 크기 킬로바이트 . $(( ... ))구문은 쉘에서 산술 연산을 수행 할 수 있습니다.

RAM 디스크를 할당 해제하려면 디스크를 마운트 해제하고 brd커널 모듈을 제거하십시오 .

umount /ramdisk
modprobe -r brd

내부에 블록 장치 만들기 ramfs

또는 내부에 블록 장치를 만들 수 있습니다 ramfs.

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncate명령은 온 디맨드가 초기화되도록 주어진 크기의 빈 파일 (즉, 소비하는 메모리)을 생성한다.

RAM 디스크를 할당 해제하려면 디스크를 마운트 해제하고 디스크 이미지를 삭제하십시오.

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

과의 비교 tmpfsramfs

비록 tmpfsramfs블럭 장치를 사용하는 것보다 더 효율적이며, 그 아래의 단점 중 일부이다.

tmpfs디스크로 교체 될 수 있습니다. 이 방법이 더 효율적이지만 순수한 RAM 디스크를 원하는 경우가 있습니다.

  • 작업중인 파일은 중요합니다 (예 : 암호화 된 파티션의 파일).
  • 성능 테스트를 수행하고 있으며 디스크 I / O가 요인이되기를 원하지 않습니다 (SSD 쓰기 시간은 크게 다를 수 있음).
  • 큰 파일의 압축을 풀고 SSD를 닳고 싶지 않습니다.

ramfs파일을 삭제하면 공간을 확보하고 RAM을보다 효율적으로 사용할 수 있습니다 (시스템은 파일이 RAM에 있다는 것을 알고 있기 때문에 파일을 버퍼링하지 않습니다). 그러나 자체 단점과 놀라움이 있습니다.

  • df유틸리티는 공간 사용량을보고하지 않습니다.

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • 크기 제한 매개 변수가 없습니다. 램 디스크를 너무 많이 넣으면 시스템이 중단됩니다.

  • 스파 스 파일은 최소한 기대할 때 스파 스되지 않을 수 있습니다. 오늘 아침에 VM 이미지 (150G, 49G 디스크에 사용됨)를 ramfs(128G의 RAM이 있음)에 복사했습니다 . 효과가있었습니다. 내가 복사 할 때 부터ramfs 대상으로, 내 시스템이 응답하지되었다. cp유틸리티는 분명히에 구멍을 채워 읽기 가 아니라 쓰기에.

모두 tmpfsramfs실제와 다르게 작동 할 수 있습니다 ext4파일 시스템. RAM으로 블록 장치를 생성하고 초기화 ext4하면 이것을 피할 수 있습니다.

보다 심도있는 비교를 위해 : https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


답변

OP RAM의 양은 MB로 표시됩니다. 따라서 입력해야 할 것은 16384입니다.


답변

ramfs파일 시스템을 마운트하고 프로젝트를 파일 시스템에 복사 한 다음 거기서 작업 할 수 있습니다. 이렇게하면 입력 파일이 RAM에로드되고 훨씬 느린 디스크 드라이브에서 다시 읽지 않습니다. 그러나 당신이 발견 한 것처럼, 이것은 일반적으로 유용한 전략이 아닙니다. 이미 동일한 혜택을 누리고 있습니다.

Ramfs는 Linux의 디스크 캐싱 메커니즘 (페이지 캐시 및 dentry 캐시)을 동적으로 크기를 조정할 수있는 RAM 기반 파일 시스템으로 내보내는 매우 간단한 파일 시스템입니다.

-https : //github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

입력 파일을 처음 읽을 때 RAM에 캐시되어 있다는 것을 이미 신뢰할 수 있습니다. 출력 파일도 캐시되므로 디스크에 기록 될 때까지 기다리지 않습니다.

캐시 할 수있는 양, 캐시 된 기간 등에 대한 인위적인 제한은 없습니다. RAM을 채우면 캐시가 삭제되기 시작합니다. 어떤 캐시가 먼저 삭제되는지는 매우 정교한 알고리즘에 의해 선택됩니다. 첫 번째 근사값은 최근 사용 된 것으로 표시합니다. 참조 OS 파일 캐시를위한 리눅스 커널에 사용되는 어떤 페이지 교체 알고리즘?

텍스트 편집기는 fsync()파일을 디스크에 명시 적으로 저장합니다.

를 포함하는 프로그램의 테스트를 실행 fsync()하는 경우 파일 시스템에서 테스트를 실행하면 ramfs속도가 빨라질 수 있습니다. 또 다른 전략은 / 로 시도하고 비활성화 fsync()하는 것 입니다.eatmydatanosync.so

다른 운영 체제에는 램 디스크를 사용하여 무시할 수있는 특정 제한이있을 수 있습니다. 한쪽 끝에서의 부족 어떤 램 디스크에 인기가 왜 파일 캐싱은 DOS .

tmpfs

tmpfsramfs스왑 공간이있는 경우이를 사용할 수 있다는 점을 제외하고 와 동일하게 작동합니다 . 즉, 다른 용도로 RAM이 필요한 경우 가장 최근에 사용한 알고리즘이 tmpfs에서 데이터 블록을 선택하여 디스크로 교체 할 수 있습니다.

대부분의 사람들 tmpfs은 총 크기를 제한 할 수 있고 예를 들어 df명령 에서 올바르게 사용 된 공간을 보여주기 때문에를 사용합니다 . 이 차이가 왜 존재하는지 잘 모르겠습니다. 크기 제한 tmpfs은 실수로 전체 RAM을 채우고 기본적으로 시스템을 종료하지 못하게합니다. 기본적으로 RAM의 절반입니다.

쓰기가 느려지는 다른 이유

위의 내용은 귀하의 경우에 맞게 단순화되었습니다. 귀하의 경우 파일에 대한 쓰기는 디스크를 기다릴 필요가 없습니다. 그러나 일부 쓰기 작업이 있습니다. 버퍼링 된 쓰기가 때때로 정지되는 이유 는 훌륭한 블로그 게시물을 참조하십시오 . 가장 놀라운 사례는 최근 “안정적인 페이지 쓰기”라는 Linux 변경입니다.