VPS에 스왑 공간을 추가하는 해킹을 배포했는데, 그렇지 않으면 VPS를 사용하여 swapon
파일을 생성할 수 없었습니다.
스크립트를 추가하고 실행하기 전에 다음 단계를 따랐습니다.여기에서 개요를 확인하세요.그리고 다음과 같이 요약했습니다.
- 먼저 스왑 파일을 만듭니다.
sudo dd if=/dev/zero of=/swapfile bs=1024 count=512k
- 그 다음에
sudo mkswap /swapfile
. - 다음 단계는 일반적으로
sudo swapon /swapfile
.이 게시물. 해결 방법으로 다음 스크립트를 사용할 수 있다고 주장합니다.
아래를 참조하세요:
#!/bin/bash
SWAP="${1:-512}"
NEW="$[SWAP*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"
umount /proc/meminfo 2> /dev/null
sed "/^Swap\(Total\|Free\):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo
mount --bind /etc/fake_meminfo /proc/meminfo
더 자세한 내용을 보려면 프로세스를 자세히 설명하세요.이 답변에서. (이것은 대부분 bash 스크립트를 밀어넣는 것입니다.)
모든 것이 괜찮아 보이지만 htop(또는 그 문제에 대해)을 보면 free -m
메모리 사용량은 스크립트를 실행했을 때의 값으로 유지되고 사용된 스왑 공간은 0으로 유지됩니다. 이것은 서버에서 실행 중인 프로세스와 아무 관련이 없습니다. 메모리 할당에서 무슨 일이 일어나고 있는지에 대한 나의 이해는 매우 제한적입니다. 말 그대로 내가 그것을 망친 것은 이번이 처음입니다. 내가 실행 중인 스크립트를 고려할 때 이것이 의미가 있는지, 그리고 그 이유가 무엇인지 누가 말해 줄 수 있습니까?
답변1
해당 게시물의 "가짜 교환"이 무엇을 의미하는지 크게 오해하셨습니다. 일부 프로그램에서는 다양한 이유로 시스템에서 스왑 공간을 활성화해야 한다고 주장합니다(기침신탁기침). 그렇지 않다면 프로그램(또는 적어도 설치 프로그램)이 불평할 것입니다. 물론 위의 데이터베이스에는 계속해서 실행할 수 있는 방법이 있지만 사람들은 이에 대해 모르는 경우가 많습니다.
찾은 "가짜 스왑"이 해결 방법입니다. 이는 이러한 프로그램에 거짓말을 하고 스왑이 활성화된 것처럼 가장하는 방법입니다.교환은 거짓말입니다.실제 교환은 없습니다. 그러나 프로그램은 그것이 존재한다고 믿으므로 불평하지 않습니다. 솔루션에는 etc. 및 free
의 다른 모든 값도 포함됩니다. /proc/meminfo
(솔직히 말하면, 관리는 고사하고 작업 중인 시스템에서 이 용어가 사용되는 것을 발견했다면 "해결 방법"보다 더 가혹한 용어를 사용하겠습니다. 이러한 용어는 정중한 대화에는 적합하지 않습니다.)
다른 질문에 대한 Tante의 답변아마도 맞을 것입니다. OpenVZ는 가상 머신에서의 스와핑을 지원하지 않습니다. 다른 옵션은 없습니다 swapon
. 일련의 검사를 수행한 다음 커널의 swapon
시스템 호출을 호출합니다. 시스템 호출이 지원되지 않으면 완료된 것입니다. 당신은 할 수 없습니다. 죄송합니다.
해결하려는 실제 문제에 따라 작동할 수 있는 몇 가지 다른 접근 방식이 있습니다.
- 특정 프로세스에 많은 양의 데이터를 처리해야 하는 경우에도
mmap
여전히 유효할 수 있습니다. 또는 보다 공간 효율적인 알고리즘을 사용하십시오. - 가상 머신에 더 많은 메모리를 할당(또는 공급자에게 요청/지불)합니다. 호스트에서 스와핑을 활성화할 수도 있습니다.
- 다른 가상화 솔루션으로 전환하거나 베어메탈에서 실행하세요.
- OpenVZ 컨테이너 내에서 사용자 모드 Linux를 실행할 수 있습니다. 이 UML 인스턴스에서는 교환을 활성화할 수 있습니다. 나는 성능이 끔찍할 것이라고 완전히 예상했습니다.
답변2
스크립트를 올바르게 이해하면 실제로 어떤 식으로든 스왑이 활성화되지 않습니다. 대신 시스템을 교체하여 스왑 영역이 있는 것처럼 가장하고 /proc/meminfo
시스템 에 스왑 영역이 있다고 free
믿지만 htop
커널은 이 가짜 스왑 영역을 전혀 사용할 수 없습니다. 스크립트를 보면 스왑 파일이나 파티션에 대한 언급이 어디에도 없으므로 커널이 사용할 것이 없다는 것을 알 수 있습니다.
그래서 이거:
스왑 공간은 0으로 유지됩니다.
이것이 바로 제가 예상했던 일입니다.