mysql 백엔드가있는 PHP 웹 사이트를 실행하는 16GB RAM을 갖춘 듀얼 쿼드 코어 XEON에서 CentOS를 얼마나 많은 SWAP에 설치 하시겠습니까?
mysql 백엔드가있는 PHP 웹 사이트를 실행하는 16GB RAM을 갖춘 듀얼 쿼드 코어 XEON에서 CentOS를 얼마나 많은 SWAP에 설치 하시겠습니까?
답변:
하나 또는 두 개를 넘지 말고 약간의 스왑을 원할 경우를 대비하여 약간의 스왑을 원하지만 상황이 조금 더 잘 작동하기 때문에 스왑을 많이 수행하는 지점에 도달하면 기계가 작동합니다. 쓸모없고 실제로 치명적인 상황에서는 더 작은 스왑 공간을 사용하는 것이 좋습니다. 나중에 OOM 킬러를 더 빨리 시작하기 때문입니다.
매우 긴 답변에 대해 사과드립니다. 나는이 물건을 잠시 동안 어딘가에 접근하기를 원했습니다!
TLDR; 이론적으로 말하면, "모든 응용 프로그램에서 사용하려는 총 상주 메모리 양보다 적을 것입니다"
당신이 나와 함께 있으면 설명하려고합니다 ..
가상 메모리에 대해 조금
요즘 스왑의 가치와 그 목적이 무엇인지에 대한 일반적인 오해가 있다고 생각합니다. 스왑은 메모리가 부족할 때 메모리의 '리저브 뱅크'로 간주되는 경우가 많습니다. 예, 이것은 사실이지만 커널 은 스왑을 예비 은행으로 사용하고 싶지 않습니다 . 또한 커널은 디스크를 호출하여 원하는 데이터를 얻기를 원하지 않습니다!
어플리케이션 공간에는 커널이 메모리에 보관할 것들이 많이 있습니다.
메모리 관리의 목적으로, 메모리 할당이되고 지지 하는지지 장치에 의해 어떤 형태로든.
파일 백업 메모리는 파일에서 가져온 메모리이며 일반적인 O / S는 시스템에서 대부분의 메모리 할당을 구성합니다. 여기에는로드 된 공유 라이브러리, 디스크에서 읽거나 페이지 캐시에 저장된 파일 및 디스크에서 축소 된 파일과 같은 파일이 포함됩니다 (사실 커널은 페이지 캐시의 파일과 기본적으로 축소 된 파일간에 페이지를 구분하지 않습니다) 똑같은 것).
커널 관점에서 볼 때이 메모리의 가장 큰 장점은 일회용입니다. 즉, 다른 것을 위해 메모리가 필요한 경우 이러한 페이지를 덤프 할 수 있어야하며, 메모리가 갑자기 필요한 경우 페이지 캐시가하는 것입니다.
익명으로 지원되는 메모리는 다른 문제입니다. 디스크에 실제로이 데이터를 포함하는 파일이 없기 때문에이 영역의 메모리는 익명입니다. 이것은 일반적으로 응용 프로그램 스택, 힙, tmpfs 및 개인용이며 수정 된 mmapped 데이터로 구성됩니다 (이 내용을 디스크와 다시 동기화 할 수 없기 때문에). 파일 시스템에 이러한 페이지가 변경 될 경우 다시 쓸 유효한 파일이 없기 때문에 익명으로 백업 된 메모리는 스왑 미디어에 의해 백업됩니다.
이제 커널은 메모리가 부족할 때 익명으로 매핑 된 메모리에 파일 백업 메모리를 버리는 것이 훨씬 저렴하다는 것을 알고 있습니다. 이는 익명 데이터가 파일 백업 데이터보다 "더러워 질"가능성이 높기 때문입니다. 익명으로 백업 된 메모리가 파일 백업 메모리보다 80 배 더 가치 있다고 평가합니다. 이것은 실제로 swappiness 수정자가 Linux에서 수행하는 작업입니다 ( swappiness 매개 변수가 정확히 무엇을 변경하는지 알고 싶다면 여기를 참조하십시오 ).
최악의 시나리오
서버 제어 및 OOMing에 관한 최악의 시나리오는 메모리 할당 요청을 처리하는 것보다 I / O 요청을 처리하는 데 너무 많은 시간을 소비한다는 사실에 근거합니다. 이 기준을 호출 할 수있는 두 가지 조건이 있습니다.
첫 번째는 일반적으로 문제의 생각입니다. 즉, 많은 메모리가 스왑 내부에 존재하기 때문에 익명 메모리를 RAM에서 스왑하고 다시 스왑에 넣은 다음 스왑에서 무언가를 가져 와서 실제 RAM에 넣어야합니다. 이 작업은 비용이 많이 들고 시스템이 복구 할 수없는 상황이 될 수있는 지점까지 느려집니다 (I / O에서 제공 할 수있는 것보다 페이지 요구에 더 많은 항목이 대기 중이므로).
두 번째는 덜 고려되지만 중요합니다. 거의 모든 메모리를 실제 응용 프로그램 데이터에 할당하면 오래 가지 않습니다. 거의 모든 응용 프로그램은 파일 시스템에서 파일을 읽어 작동하기 위해 의존합니다. 일부 명령은 공유 라이브러리에 있거나 라이브러리 호출 또는 기타 목적으로 /etc/resolv.conf를 읽어야하기 때문일 수 있습니다. 운영 체제를 중지하는 것은 그럴듯하지만 모든 응용 프로그램에 맞는 메모리는 충분하지만 너무 많은 I / O 요청을 큐에 넣을 때 아무것도 제대로 완료 할 수 없습니다.
커널이 스왑으로하고 싶은 것
커널은 스왑을 사용하여 메모리를 낭비하는 페이지를 제거하여 해당 메모리를 다른 용도로 사용할 수 있기를 원합니다.
기본적으로 커널은 정상적인 작동에서 디스크에서 읽은 데이터로 페이지 캐시를 적극적으로 채우는 것을 좋아합니다. 이는 동일한 데이터에 대해 디스크를 읽지 않음을 의미합니다. 이것은 좋은 디자인이며 I / O를 크게 줄일 수 있습니다. 이제는 응용 프로그램이 메모리에 3 일 동안 잠자고 깨어나고 많은 작업을 수행 한 다음 3 일 동안 잠 들어있을 수 있습니다.
커널이이 데이터와 관련하여 수행하는 작업은 파일 시스템 활동을위한 공간을 확보하기 위해 대신 스왑하는 것입니다. 응용 프로그램에 사용하는 페이지보다 실제로이 페이지를 더 자주 사용할 가능성이 높기 때문입니다. 이런 의미에서 스와핑은 거의 느끼지 못할 스왑 미디어에 대한 16kb 트랜잭션 일 수 있지만 그 대신에 4 개의 파일에 해당하는 데이터를 저장하는 데 사용할 수 있는 16kb의 메모리를 확보했습니다 .
커널이 스왑을 사용하고 싶지 않은 것
커널은 다른 익명 메모리를 교체하여 더 많은 익명 메모리를 할당하기 위해 스왑을 사용하고 싶지 않습니다. 이것이 사람들이 가장 걱정하는 상황입니다.
그러나 만약 당신이 너무 많은 메모리를 할당했다면 커널이 선택의 여지가없는 것이라면, 이것은 커널 자체가 아닌 시스템 관리자의 구성 문제입니다. 당신이 그것을 준 옵션!
스왑이 큰 경우 스왑을 사용할 확률이 높아 집니까?
아니! 1G 램과 4G 스왑이있는 경우 데이터가 스왑 될 확률은 80 %가 아닙니다! 커널은 메모리의 페이지가 다른 일을 더 잘 수행 할 수있을 때만 스왑을 사용하려고합니다!
스왑을 전혀 사용하지 않는 것이 유리합니까?
나는 이것을하지 않을 것입니다. 스와핑을 통해 O / S는 필요한 메모리를 제거 할 수 있지만 사용하지는 않습니다. 스왑이 없다면 메모리를 삼킬 때 다시는 돌아 오지 않을 것입니다.이 경우 페이지 캐시가 대신 캐시를 허용함으로써 성능이 크게 향상 될 수 있습니다.
최고의 스왑은 무엇입니까
이론적으로 말해서 힙에서 메모리를 할당 해야하는 재진입 라이브러리 호출과 같은 안전을 위해 상주 메모리 양이 +20 %인지 확인한 다음 스왑을 해당 양으로 설정하십시오. 이것은 (이론적으로 어쨌든) 운영 체제가 모든 익명 메모리를 더 유용한 것으로 만들어야 할 경우 모든 익명 메모리를 스왑 할 수있게합니다.
커널에게 기회가 있다면 위험한 모든 것을 바꿀 수 있습니까?
커널은 여기에서 더 익명의 메모리 할당을 위해 교환하기를 원하지 않으며, 공간을 더 잘 사용할 수있는 다른 것을 선호하기 위해 사용하지 않는 페이지 만 교환합니다.
익명 메모리를 스왑하면 더 많은 익명의 메모리에서 할당하는 경우에만 잘못된 작업을 수행하고 RAM이 더 필요하거나 응용 프로그램 스택을 다시 조정해야합니다.
필요한 RAM 용량
물론 모든 응용 프로그램을 실행할 수있는 충분한 RAM을 허용해야하지만 페이지 캐시를 채우려면 추가 2G의 RAM을 허용해야합니다. 페이지 캐시를 사용하면 컴퓨터가 훨씬 빨라지고 디스크가 더 오래 지속됩니다. 웹 서버 실행에 대한 생각, 페이지 캐시에 대한 더 많은 것을 갖는 것이 페이지 캐시에서 검색하고 재사용 할 수있는 정적 콘텐츠의 양이 많기 때문에 좋은 생각입니다 (웹 서버 처리량이 5MB / s 인 경우 실제로는 그렇지 않습니다) 디스크에서 생성 한 5mb / s 컨텐츠를 검색하고 싶습니다!).
리눅스를 제대로 바꾸지 못한다면 어떻게해야합니까?
정말로 염려된다면 다음보다 많은 메모리를 할당 할 수 있습니다.
내 응용 프로그램의 메모리를 조정하는 가장 좋은 방법은 무엇입니까
공급 업체는 다른 구성을 권장합니다.
대신 들어보세요. 일부 응용 프로그램은 의도적으로 커널을 호출하여 페이지를 다른 모든 응용 프로그램보다 활성화하는 방식으로 작성되었습니다. 이것은 정직한 것은 나쁜 일이지만 메모리가 발생할 때 매끄럽게 관리 할 수있는 커널 기능을 손상시킵니다. 공급 업체가 특정 정보를 제공하는 경우이 범주에 속하고 대신 말하는 내용을들을 수 있습니다.
요약하자면
커널은 일반적으로 가상 메모리를 올바르게 관리하는 데 매우 효과적입니다. 거의 항상 응용 프로그램이 작업 할 수있는 것보다 많은 메모리를 할당하고 있으며 그로 인해 OOM이 발생합니다.
스왑은 '예비 메모리'로 사용되었지만 더 이상 주요 목적은 아니므로 그렇게 사용하지 마십시오. 대신, 커널이 메모리를 사용하고자하는 것을 가장 잘 알고있을 것입니다. 이러한 결정을 내릴 수있는 공간을 확보하면 전반적인 성능 향상의 혜택을 누릴 수 있습니다.
"Red Hat® Enterprise Linux® 5 배포 권장 사항의 Oracle 10g 서버"문서에서.
Oracle은 MetaLink Note 169706.1에서 스왑 크기에 대한 일반적인 권장 사항을 제공합니다. 이러한 권장 사항으로 인해 메모리가 많은 시스템에서 매우 큰 스왑 공간이 생성 될 수 있습니다. 매우 큰 스왑은 시스템 성능 저하를 초래할 수 있으며 스왑 공간을 줄이면 해결할 수 있습니다. Red Hat은 Red Hat Enterprise Linux 5에서 스왑을 위해 4GB보다 큰 할당을 권장하지 않습니다.
따라서 16GB의 경우 4GB를 넘지 않아야합니다.
추신. 또한 oom
전체 I / O 대역폭을 사용하는 사용 불가능한 스왑 아웃 프로세스보다 호출 이 거의 항상 낫다는 점에 주목할 가치가 있습니다.
현재 CentOS 스왑 권장 사항은 다음 공식을 사용합니다.
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
따라서 16G의 경우 스왑 양은 18G 여야합니다.
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html을 참조하십시오 .
이 문서를 찾았습니다. 결정을 내리는 데 도움이됩니다. 여기는 다음과 같습니다. 스왑 공간이란 무엇입니까? 위의 답변 중 어느 것도 맞지 않습니다.
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file