이 질문은 스왑 파일을 tmpfs로 옮기면 성능이 향상된다는 동료들의 농담에서 비롯되었습니다. 물론 이것이 가능하더라도 좋은 생각은 아닙니다. 그냥 알고 싶은데요, 이게 가능할까요?
저는 현재 Ubuntu 14.04를 사용하고 있지만 대부분의 Linux/Unix 시스템에서도 프로세스가 비슷할 것이라고 생각합니다. 이것이 내가 하는 일이다:
> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!
> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument
그렇다면 Linux나 Unix에서든 RAM의 파일/파티션에 스왑을 설정할 수 있습니까(어떤 솔루션이든 관심이 있습니다). Invalid argument
위에서 발생한 오류를 해결할 수 있는 방법이 있나요 ?
다시 한번 말하지만, 이것이 실제 문제를 해결할 것이라고는 기대하지 않습니다. 그냥 재미있는 실험인 것 같아요.
답변1
이것은 불가능합니다. swapon
시스템 호출에는 readpage
파일 시스템 bmap
에 의해 구현된 (간접) 호출이 필요합니다.
http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412
if (!mapping->a_ops->readpage) {
error = -EINVAL;
goto bad_swap;
}
하지만 그 중 어느 것도 구현되지 않았습니다.임시 파일 시스템, 해당 항목이 누락되었습니다 address_space_operations
.http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104
같은 이유로 tmpfs는 루프 마운트를 저장할 수 없으며 ramfs도 작동하지 않습니다( bmap
호출하지 않음)
답변2
이 Q&A에서https://superuser.com/questions/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem(원래 참조된 웹사이트가 응답하지 않습니다):
따라서 "잘못된 매개변수"는 "파일 시스템이 스왑 파일을 지원하지 않습니다"로 읽어야 합니다.
비호환성의 원인은 "순환 종속성"이라고 생각됩니다. 이 기사에서:http://www.jamescoyle.net/knowledge/951-the-difference-Between-a-tmpfs-and-ramfs-ram-disk:
ramfs와 tmpfs의 이러한 두 가지 차이점으로 인해 tmpfs를 더 쉽게 관리할 수 있지만 tmpfs가 SWAP 공간을 사용할 수 있다는 큰 단점도 있습니다. 시스템에 물리적 RAM이 부족하면 tmpfs 파티션의 파일이 디스크 기반 SWAP 파티션에 기록될 수 있으며 다음에 파일에 액세스할 때 디스크에서 읽어야 합니다.
이는 귀하의 시나리오에서는 거의 불가능합니다.
그것가능한함께 일하면서, ramfs
이런 문제는 없었습니다.
답변3
약간 간접적이긴 하지만 함수 누락 문제를 쉽게 방지하고 tmpfs로 교체할 수 있습니다.
dd if=/dev/zero bs=1M of=/tmp/swapfs count=128
chmod 0600 /tmp/swapfs
mkfs.ext2 /tmp/swapfs
mount -o loop /tmp/swapfs /mnt
dd if=/dev/zero bs=1M of=/mnt/swap
mkswap /mnt/swap
swapon /mnt/swap
zswap과 결합하면 RasPi4가 거의 완전히 정지될 때까지 훌륭한 "메모리 확장기" 솔루션처럼 보였습니다(ssh 콘솔 정지, X 정지, Chrome의 YouTube는 몇 분 동안 계속 대화하다가 정지되었지만 시스템은 핑에 응답하고 감시자는 응답하지 않음) ssh를 통한 부팅(이전)은 유용한 작업을 수행하지 않습니다. 사용 가능한 RAM과 스왑 공간이 많은 것 같습니다. 실제로 OpenSolaris와 유사하지만(압축된 zvol로 스왑) 유사한 결과가 발생합니다.
답변4
그렇다면 Linux 또는 Unix(모든 솔루션에 관심이 있습니다)에서 어떻게든 메모리의 파일/파티션에 스왑을 설정할 수 있습니까?
틀림없이. FreeBSD에서:
# swapinfo -h
Device 1024-blocks Used Avail Capacity
/dev/mirror/swap.eli 4194300 0B 4.0G 0%
이는 현재 미러 중복성을 갖춘 4G 암호화 스왑 파티션이 있음을 보여줍니다. 또 다른 4G 비중복, 비암호화 스위치를 추가하겠습니다.
먼저 4G RAM이 지원되는 "메모리 디스크"( ) 장치를 만듭니다 md
.
# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0 malloc 4096M -
swapon
그런 다음 사용 가능한 스왑 장치 풀에 추가하라는 메시지가 표시되고 swapinfo
이제 8G의 스왑 공간이 있음을 확인합니다.
# swapon /dev/md0; swapinfo -h
Device 1024-blocks Used Avail Capacity
/dev/mirror/swap.eli 4194300 0B 4.0G 0%
/dev/md0 4194304 0B 4.0G 0%
Total 8388604 0B 8.0G 0%