Linux 커널 메모리 제한

Linux 커널 메모리 제한

혼란스러운 질문이 있습니다. 나는 다음을 사용하는 라이브러리를 가지고 있습니다.싱가포르사용자 정의를 수행하기 위한 CDB입니다. 일부 시스템에는 종종 메모리 할당 문제가 있습니다.싱가포르. 대개,싱가포르드라이버에는 약 4MB의 하드 제한이 있지만 이러한 몇몇 시스템에서는 약 2.3MB를 요청하는 것으로 나타났습니다. 즉, CDB는 2.3mb의 전송 할당을 준비하고 있는 것입니다. 여기에는 아무런 문제가 없어야 합니다: 2.3 < 4.0.

이제 기계의 개요입니다. 64비트 CPU이지만 CentOS 6.0 32비트를 실행하고 있습니다(저는 직접 구축하지 않았으며 이 결정과 관련이 없습니다). 이 CentOS 배포판의 커널 버전은 2.6.32입니다. 16GB의 RAM이 있습니다.

이것은 시스템의 메모리 사용량입니다. (단, 이 오류는 자동화 테스트 중에 발생하기 때문에 이 errno가 반환된 시점의 상태를 반영하는지 확인하지 않았습니다.)싱가포르).

top - 00:54:46 up 5 days, 22:05,  1 user,  load average: 0.00, 0.01, 0.21
Tasks: 297 total,   1 running, 296 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  15888480k total,  9460408k used,  6428072k free,   258280k buffers
Swap:  4194296k total,        0k used,  4194296k free,  8497424k cached

내가 찾은이 기사~에서리눅스 매거진이것은 커널에 메모리를 할당하는 것에 관한 것입니다. 기사는 오래되었지만 2.6과 관련이 있는 것 같습니다(머리 부분에 저자에 대한 일부 의견이 있습니다). 기사에서는 커널의 메모리 제한이 약 1GB라고 언급합니다(실제 메모리와 가상 메모리 각각 1GB 또는 총 메모리라는 텍스트에서 완전히 명확하지는 않지만). 이것이 2.6.32에 대해 정확한지 궁금합니다. 궁극적으로 이러한 시스템이 이 한계에 도달했는지 궁금합니다.

이것이 실제로 내 질문에 대한 대답은 아니지만 2.6.32 설명의 정확성을 알고 싶습니다. 그렇다면 커널의 실제 메모리 제한은 얼마나 됩니까? 문제를 해결할 때 이 점을 고려해야 할 수도 있습니다. 다른 제안도 환영합니다. 혼란스럽게도 이러한 시스템은 다른 많은 시스템과 동일하지만 동일한 문제를 나타내지 않습니다.

답변1

32비트 시스템에서 Linux 커널 메모리의 1GiB 제한은 32비트 주소 지정의 결과이며 매우 엄격한 제한입니다. 변화는 불가능하지 않지만 변화에는 결과가 따르는 정당한 이유가 있습니다.

Linux가 막 탄생했던 1990년대 초반으로 돌아가 보겠습니다. 그 당시 우리는 Linux가 2MiB RAM에서 실행될 수 있는지 여부에 대해 논쟁을 벌였습니다.진짜필요4 전체 MiB. 물론 고급 속물들은 16MiB 몬스터 서버를 가지고 우리를 비웃고 있습니다.

이 흥미로운 작은 에피소드는 어떤 것과 관련이 있습니까? 그 세계에서는 단순한 32비트 주소 지정에서 얻은 4GiB 주소 공간을 어떻게 분할할지 결정하기가 쉽습니다. 일부 운영 체제는 주소의 최상위 비트를 "커널 플래그"로 처리하여 이를 절반으로 분할합니다. 주소 0 ~ 2 31 -1에는 사용자 공간 코드에 대해 최상위 비트가 지워지고, 주소 2 31 ~ 2 32 - 1 세트 가장 높은 비트 , 커널에서 사용됩니다. 주소만 보고 알 수 있습니다: 0x80000000 이상은 커널 공간이고 그렇지 않으면 사용자 공간입니다.

PC 메모리 크기가 4GiB 메모리 제한으로 부풀어 오르면서 이 간단한 2/2 분할이 문제가 되기 시작했습니다. 사용자 공간과 커널 공간 모두 많은 RAM이 필요하지만, 컴퓨터를 갖는 목적은 일반적으로 커널을 실행하는 것이 아니라 사용자 프로그램을 실행하는 것이므로 운영 체제는 사용자/커널 분할을 사용하기 시작합니다. 3/1 분할은 일반적인 절충안입니다.

실제와 가상에 대한 귀하의 질문은 실제로 중요하지 않습니다. 기술적으로 이는 가상 메모리 제한이지만 이는 Linux가 VM 기반 운영 체제이기 때문입니다. 32GiB의 물리적 RAM을 설치해도 아무런 변화가 없으며 swapon32GiB 스왑 파티션을 생성하는 데도 도움이 되지 않습니다. 무엇을 하든 32비트 Linux 커널은 동시에 4GiB 이상을 처리할 수 없습니다.

(네, 알아요PAE. 이제 64비트 운영 체제가 마침내 자리를 잡았으므로 성가신 해킹을 잊어버릴 수 있기를 바랍니다. 어쨌든, 나는 그것이 이 상황에서 당신에게 도움이 될 것이라고 믿지 않습니다. )

또한 1GiB 커널 VM 제한에 도달하면 2/2 분할로 커널을 다시 빌드할 수 있지만 이는 사용자 공간 프로그램에 직접적인 영향을 미칩니다.

64비트가 정답입니다.

답변2

뭔가 추가하고 싶습니다워렌 영(Warren Young)의 훌륭한 답변, 진실은 그가 쓴 것보다 더 나쁘기 때문입니다.

1GB 커널 주소 공간은 두 부분으로 더 나뉩니다. 의 경우 128MB vmalloc, 의 경우 896MB입니다 lowmem. 실제로 무엇을 의미하는지 신경쓰지 마세요. 메모리를 할당할 때 커널 코드는 원하는 메모리를 선택해야 합니다. 여유 공간이 있는 풀에서 메모리를 가져올 수는 없습니다.

을 선택하는 경우 vmalloc한도는 128MB입니다. 이제 1GB도 나쁘지 않아보이네요...

을 선택하는 경우 lowmem한도는 896MB입니다. 1GB와 크게 다르지 않지만 이 경우 모든 할당은 2의 다음 거듭제곱으로 반올림됩니다. 따라서 2.3MB 할당은 실제로 4MB를 소비합니다. 또한, 사용 시 단일 호출에 할당된 메모리는 4MB를 초과할 수 없습니다 lowmem.

64비트가 정답입니다.

관련 정보