linux 태그에 응답하고 있습니다. 내 대답은 Linux 에만 해당됩니다 .
예, 큰 페이지는 조각화되기 쉽습니다. 메모리에 대한 두 가지보기가 있는데, 하나는 프로세스가 가져오고 (가상) 커널이 관리하는 (실제)입니다. 모든 페이지가 클수록, 특히 서비스가 기본적으로 할당되어 더 많은 메모리에 쓰는 다른 시스템을 지원해야하는 시스템에서 서비스를 실행하는 경우 주변 장치를 그룹화 (및 유지)하기가 더 어려워집니다. 실제로 사용합니다.
커널의 (실제) 부여 된 주소 매핑은 비공개입니다. 커널이 사용자 공간을 혼동하지 않고 오버 커밋 할 수 있어야하기 때문에 사용자 공간이 커널이 제시하는 것으로 사용자 공간을 보는 이유는 매우 좋습니다. 프로세스는 훌륭하고 연속적인 "Disneyfied" 주소 공간을 얻습니다 . 커널이 실제로 메모리 뒤에서 수행하는 작업을 알지 못합니다 .
당신이 오랫동안 실행하는 서버에서 성능 저하를 볼 수있는 이유는 대부분 명시 적으로 고정 (예를 들면되지 않은 할당 된 블록 때문입니다 mlock()
/ mlockall()
또는 posix_madvise()
한 동안 수정)하지가 한 페이지 아웃 읽기가있을 때 디스크에 서비스 스키드을 의미한다, 그들. 이 동작을 수정하면 프로세스가 나쁜 이웃 이되므로 많은 사람들이 RDBMS를 web / php / python / ruby / whatever와 완전히 다른 서버에 배치합니다. 이 문제를 해결하는 유일한 방법은 인접한 블록에 대한 경쟁을 줄이는 것입니다.
페이지 A가 메모리에 있고 페이지 B가 스왑으로 이동 한 경우에만 조각화가 눈에 able니다 (대부분의 경우). 당연히 서비스를 다시 시작하면 이것을 '치료'하는 것처럼 보이지만 커널이 아직 초과 커밋 비율의 범위 내에서 새로 할당 된 블록 (현재)을 프로세스를 페이징 아웃 할 기회가 없었기 때문입니다.
실제로, 높은로드 상태에서 'apache'를 다시 시작하면 (아파치) 다른 서비스가 소유 한 블록을 디스크로 바로 보낼 수 있습니다. 따라서 'apache'는 짧은 시간 동안 향상되지만 'mysql'은 .. 최소한 충분한 물리적 메모리가 부족할 때 커널이 똑같이 고통을 겪을 때까지 겪을 수 있습니다.
더 많은 메모리를 추가하거나 까다로운 malloc()
소비자를 분리하십시오 .
시도 vmstat
실제로 어디에 저장되어 있는지에 대한 개요를 얻을 수 있습니다.