리눅스 커널의 메모리 제한


12

난처한 문제가 있습니다. 사용자 정의 CDB를 실행하기 위해 sg 를 사용하는 라이브러리가 있습니다. sg의 메모리 할당에 문제가있는 시스템이 몇 가지 있습니다 . 일반적으로 sg 드라이버는 약 4mb의 하드 한계를 갖지만 ~ 2.3mb 요청이있는 몇 가지 시스템에서 볼 수 있습니다. 즉, CDB는 2.3mb 전송을 할당 할 준비를하고 있습니다. 여기에는 아무런 문제가 없어야합니다 : 2.3 <4.0.

이제 기계의 프로파일입니다. 64 비트 CPU이지만 CentOS 6.0 32 비트를 실행합니다 (빌드하지 않았 으며이 결정과 관련이 없습니다). 이 CentOS 배포판의 커널 버전은 2.6.32입니다. 그들은 16 기가 바이트의 RAM이 있습니다.

다음은 시스템에서 메모리 사용량이 어떻게 보이는지입니다 (자동 테스트 중에이 오류가 발생하기 때문에이 오류가 sg 에서 반환 된 상태를 반영하는지 여부는 아직 확인되지 않았습니다 ).

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

커널에 메모리를 할당하는 것에 관한 Linux Journal 에서이 기사 를 찾았습니다 . 이 기사는 날짜가 있지만 2.6과 관련이있는 것 같습니다 (머리에 저자에 대한 의견). 이 기사는 커널이 약 1GB의 메모리로 제한되어 있다고 언급합니다 (물리적 또는 가상 또는 전체에 대해 1GB가 텍스트라면 완전히 명확하지는 않지만). 이것이 2.6.32에 대한 정확한 진술인지 궁금합니다. 궁극적으로 이러한 시스템이이 한계에 도달하는지 궁금합니다.

이것이 실제로 내 문제에 대한 답변은 아니지만 2.6.32에 대한 주장의 진실성에 대해 궁금합니다. 그렇다면 커널의 실제 메모리 제한은 얼마입니까? 문제 해결을 위해 고려해야 할 수도 있습니다. 다른 제안은 환영합니다. 이것이 당황스럽게 만드는 이유는 이러한 시스템이 동일한 문제를 나타내지 않는 다른 시스템과 동일하다는 것입니다.

답변:


21

32 비트 시스템에서 Linux 커널 메모리에 대한 1GiB 제한은 32 비트 주소 지정의 결과이며 매우 엄격한 제한입니다. 변경이 불가능하지는 않지만 아주 좋은 이유가 있습니다. 변경하면 결과가 발생합니다.

리눅스가 만들어 졌던 1990 년대 초반에 기계를 가져가 보자. 당시에는 Linux를 2MiB의 RAM에서 실행할 수 있는지 또는 실제로 4 개의 전체 MiB가 필요한지 에 대한 논쟁이있었습니다 . 물론, 16 개의 MiB 몬스터 서버와 함께 하이 엔드 snob이 모두 우리에게 몰려 들었습니다.

재미있는 작은 소품은 무엇과 관련이 있습니까? 그 세계에서는 간단한 32 비트 주소 지정에서 얻은 4GiB 주소 공간을 어떻게 나누는 지에 대한 결정을 쉽게 내릴 수 있습니다. 일부 운영체제는 단지 "커널 플래그"로 주소의 상위 비트를 치료, 반으로 분할 : 주소 0 2 31 -1 상단 비트, 삭제 및 사용자 공간 코드를했다 있었고, 주소 2 (31) (2)를 통해 32 - 1은 최상위 비트를 설정했으며 커널을위한 것입니다. 주소를보고 말할 수 있습니다 : 0x80000000 이상, 커널 공간이고 그렇지 않으면 사용자 공간입니다.

PC 메모리 크기가 4GiB 메모리 제한으로 확대되면서이 간단한 2/2 분할이 문제가되기 시작했습니다. 사용자 공간과 커널 공간은 모두 많은 RAM에 대한 좋은 주장을 가지고 있었지만 컴퓨터를 사용하는 목적은 일반적으로 커널을 실행하기보다는 사용자 프로그램을 실행하는 것이기 때문에 OS는 사용자 / 커널 분할을 가지고 놀기 시작했습니다. 3/1 분할은 일반적인 절충안입니다.

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

(예, PAE 에 대해 알고 있습니다. 이제 64 비트 OS가 마침내 인수되고 있으므로, 우리는 그 불쾌한 핵을 잊어 버리기를 희망합니다.

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

64 비트가 정답입니다.


1
감사. 이 글은 훌륭합니다. Windows에서 일반적으로 사용되는 2/2 분할로 실행되었습니다. 당시 나는 리눅스가 3/1 스플릿을 사용했다는 것을 알게되었다. 나는 기사를 읽을 때 점들을 연결했을 것이라고 생각하고 싶었다. 그래서 ... 이것은 내가 이것을 명심해야 할 것처럼 들립니다. 이러한 시스템이 테스트의 특성을 고려하여 한계에 도달했다고 생각하는 것은 그리 멀지 않을 것입니다. 가장 큰 문제는 다른 시스템에서도이 문제가 발생하지 않는 이유입니다. 다시 감사합니다.
앤드류 팔랑가

1
@AndrewFalanga : 사실, 현대 Windows는 퍼지 3/1 분할 도 사용합니다.
워렌 영

1
우리 중 일부는 12MB 서버를 얻기 위해 SSC에서 상속 된 세 가지 다른 시스템의 메모리를 결합 할 수있었습니다. 그래서 많은 우리는 우리가 원하는 무엇이든 할 수있는 메모리 ...
dmckee --- 전 사회자 고양이

3
"예, 저는 x86 세그먼트 메모리 모델 에 대해 알고 있습니다 . 이제 32 비트 OS가 마침내 인수되면서이 거친 핵을 잊어 버리기를 희망합니다."
CVn

32 비트와 64 비트 사이에는 16 비트와 32 비트 사이의 배가가 두 배로 증가하여 이러한 해킹을 해제하는 데 걸리는 시간이 두 배로 늘어납니다. 그러나 무어의 법칙이 어두워지면서 다른 모든 것은 평등 하지 않습니다 . 32 비트 x86 컴퓨팅에서 20 년이 걸렸습니다. 64 비트에서 몇 세기 가 걸릴 수 있습니다 . 오늘날의 DRAM 대역폭에서 2⁶⁴ 바이트의 RAM에 대한 단일 패스 읽기에는 약 30 이 소요 됩니다. 64 비트 한도에 도달하기 위해 대역폭 증가는 어디에서 발생합니까?
워렌 영

2

나는 그가 쓰는 것보다 실제로 상황이 좋지 않기 때문에 워렌 영의 훌륭한 대답에 약간을 추가하고 싶습니다 .

1GB 커널 주소 공간은 두 부분으로 나뉩니다. 128MB는 vmalloc이고 896MB는 lowmem입니다. 그것이 실제로 무엇을 의미하는지 신경 쓰지 마십시오. 메모리를 할당 할 때 커널 코드는 원하는 것을 선택해야합니다. 사용 가능한 공간이있는 풀에서 메모리를 얻을 수 없습니다.

을 선택 vmalloc하면 128MB로 제한됩니다. 이제 1GB는 그렇게 나쁘지 않습니다 ...

을 선택 lowmem하면 896MB로 제한됩니다. 1GB에서 멀지 않은이 경우 모든 할당은 다음 2의 제곱으로 올림됩니다. 따라서 2.3MB 할당은 실제로 4MB를 소비합니다. 또한을 사용할 때 한 번의 호출에서 4MB 이상을 할당 할 수 없습니다 lowmem.

64 비트가 정답입니다.


귀하의 답변과 관련된 질문이 있습니다. lowmem 이라는 메모리 공간 에서 kmalloc 및 kzmalloc과 같은 호출의 메모리는 어디입니까?
Andrew Falanga

@AndrewFalanga, 네,이 함수들은 lowmem을 사용합니다.
ugoren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.