Linux의 High Memory에 관해..

eminency의 이미지

인텔 CPU의 PC서버에 메모리를 4G이상 꽂으려 합니다. 서버는 살 예정이구요...

근데 리눅스 커널 컴파일 옵션 중에 High Memory Support란게 있는데요.

저 옵션의 help대로라면 x86에서도(펜 프로 이상이라고 나와있습니다만) 4G 이상의 메모리를 설치하는게 가능하다는 얘긴데 그런 걸 지원하는 보드는 어떤 게 있는지... 그리고 그 외 유의사항이나, 또는 리눅스에서 고용량 메모리를 관리하는 것에 문제점은 없는지 알고 싶습니다.

익명 사용자의 이미지

x86 에서는 4K / 4M byte page 기법 2가지가 있습니다.

기본적으로 메모리가 2G이하라면 4K page를 사용하도록 컴파일하여 사용합니다.

하지만 그 이상이 되면 4M page를 써야 합니다.

Kernel 옵션에 CPU선택하면서 그 근처에 4G어쩌구 저쩌구 하는게 있습니다.

쉽게 찾을수 있으니 찾아서 바꿔서 하세요.

참고로 4K page는 이론상 4G의 메모리를 다룰수 있으나
가상 메모리를 고려한 영역이 필요하므로 보통은 2G의 물리적 메모리 이하만
사용하는것이 적당하다고 생각이 듭니다.

4M page는 이론상 64T 까지 주소를 사용할수 있습니다.

일반 PC에서는 이런 거대한 메모리 관리가 필요 없고

오히려 메모리 효율이 조금 떨어집니다.

익명 사용자의 이미지

메모리가 2G 이상이면 4M 페이지를 써야한다는 것은 사실이 아닙니다. x86의 모든 기본 메모리 영역(4G 이하)은 4k 페이지를 써서 접근할 수 있게 되어 있습니다. 그 이상의 메모리를 쓸 때 PSE(page size extension)라고 해서 4M 페이지를 쓰는 방법이 있지만, 통상은 별로 안씁니다. 페이징 인/아웃이 4M 단위로 된다면 부하가 어마어마해지니까요. PSE를 이용하면 14비트 페이지 디렉토리와 22비트 오프셋으로 64GB까지 액세스할 수 있습니다. 64T라고 하신 것은 64G의 오타인 것 같군요.

인텔 계열에서 4G 이상의 메모리를 쓸때 대개 사용하는 방법은 PAE(physical address extension)이라고 합니다. 이걸 쓰면 36비트 주소지정법으로 최대 64GB까지 액세스할 수 있습니다. 또한 64G 전영역에 대해 4k 페이지를 그대로 쓸 수 있습니다. PSE는 4G 이하 영역에서만 4k 페이지를 사용할 수 있습니다.

더 자세한 내용은 인텔 매뉴얼이나 아래 페이지를 참조하시기 바랍니다:
http://www.microsoft.com/whdc/hwdev/platform/server/pae/pae_os.mspx

그리고 제가 알기로 리눅스에서 이미 PAE를 지원하므로 대용량 지원 메인 보드를 구입하시면 사용에 문제가 없을 듯 합니다. 자세한 것은 공급 업체쪽으로...

익명 사용자의 이미지

방준영 wrote:
메모리가 2G 이상이면 4M 페이지를 써야한다는 것은 사실이 아닙니다. x86의 모든 기본 메모리 영역(4G 이하)은 4k 페이지를 써서 접근할 수 있게 되어 있습니다. 그 이상의 메모리를 쓸 때 PSE(page size extension)라고 해서 4M 페이지를 쓰는 방법이 있지만, 통상은 별로 안씁니다. 페이징 인/아웃이 4M 단위로 된다면 부하가 어마어마해지니까요. PSE를 이용하면 14비트 페이지 디렉토리와 22비트 오프셋으로 64GB까지 액세스할 수 있습니다.

인텔 계열에서 4G 이상의 메모리를 쓸때 대개 사용하는 방법은 PAE(physical address extension)이라고 합니다. 이걸 쓰면 36비트 주소지정법으로 최대 64GB까지 액세스할 수 있습니다. 또한 64G 전영역에 대해 4k 페이지를 그대로 쓸 수 있습니다. PSE는 4G 이하 영역에서만 4k 페이지를 사용할 수 있습니다.

더 자세한 내용은 인텔 매뉴얼이나 아래 페이지를 참조하시기 바랍니다:
http://www.microsoft.com/whdc/hwdev/platform/server/pae/pae_os.mspx

그리고 제가 알기로 리눅스에서 이미 PAE를 지원하므로 대용량 지원 메인 보드를 구입하시면 사용에 문제가 없을 듯 합니다. 자세한 것은 공급 업체쪽으로...

정말입니까?
메모리가 2G이상인경우 4Kpage를 써도 성능저하가 발생하지 않습니까?
직접 보호모드 진입코드로 테스트를 부탁드리겠습니다.

저는 이것을 486에서 테스트해본적이 있어서 그런 생각을 적은것인데
지금은 모르겠군요. 조망간 제가 Pentium III에서 테스트해서
증거를 만들어보려고 노력해봐야 겠군요.

참고로 리눅스에 빗대어 4k는 4G까지만을 예기했습니다.
리눅스 현 시스템에서 정말로 4G이상을 4K페이지로 사용가능하다고 보시는지요?
일단 리눅스는 3단계 페이지를 구현하고 있는거로 아는데....
자세한거 제가 좀더 공부하고 테스트좀 하고 대화를 해야 겠군요.

익명 사용자의 이미지

minzkn wrote:
정말입니까?
메모리가 2G이상인경우 4Kpage를 써도 성능저하가 발생하지 않습니까?

왜 발생하죠?
Quote:
직접 보호모드 진입코드로 테스트를 부탁드리겠습니다.

저를 프로그래머로 정식 고용하신다면... 8)
익명 사용자의 이미지

방준영 wrote:
minzkn wrote:
정말입니까?
메모리가 2G이상인경우 4Kpage를 써도 성능저하가 발생하지 않습니까?

왜 발생하죠?
Quote:
직접 보호모드 진입코드로 테스트를 부탁드리겠습니다.

저를 프로그래머로 정식 고용하신다면... 8)

금방 댓글이 올라왔군요.
열심히 글쓴거 편집좀 하고 있었는데.....
빠르시군요.....

일단 4Kpage인경우 Scheduler가 좀 바빠집니다.
제가 테스트했던 486에서 Scheduler가 좀 꼬져서 그런지는 모르겠군요.
아무튼 기본 골격은 Linux와 비슷했거든요.... (완전히 같지 않아서
좀더 봐야될 부분이기도 합니다.)

제가 경험한 테스트코드로 보면 분명 토발즈도 그런 경험을 했을듯 한데...
토발즈의 글을 많이 못봐서.... 아쉽네요. 토발즈는 이런거 겪어보지 않았을리는 없고....
어딘가 글로 남겨둘듯한.....
아니면 Scheduler를 만든 사람이 누구더라... 암튼 그사람이 쓴글중에.....

익명 사용자의 이미지

리눅스는 2001년부터 PAE를 지원하고 있었군요. 참고 자료는:
http://mail.nl.linux.org/kernelnewbies/2001-06/msg00197.html

익명 사용자의 이미지

minzkn wrote:
일단 4Kpage인경우 Scheduler가 좀 바빠집니다.

물론 페이지 개수가 많아질 수록 스케줄러나 페이저가 바빠지는 건 사실이지만, 그것이 2G라는 메모리 경계선과 상관 관계를 갖는 것은 아닙니다.

그리고 두번째는 인텔 계열에선 4k 페이지가 아니면 대안이 2M, 4M 페이지 밖에 없는데, 이건 페이징 부하가 엄청나서 애플리케이션용으로는 부적합합니다. 메모리에 상주하는 커널이나 장치 드라이버의 주소 공간을 구성할 때만 사용하지요.

익명 사용자의 이미지

방준영 wrote:
minzkn wrote:
일단 4Kpage인경우 Scheduler가 좀 바빠집니다.

물론 페이지 개수가 많아질 수록 스케줄러나 페이저가 바빠지는 건 사실이지만, 그것이 2G라는 메모리 경계선과 상관 관계를 갖는 것은 아닙니다.

그리고 두번째는 인텔 계열에선 4k 페이지가 아니면 대안이 2M, 4M 페이지 밖에 없는데, 이건 페이징 부하가 엄청나서 애플리케이션용으로는 부적합합니다. 메모리에 상주하는 커널이나 장치 드라이버의 주소 공간을 구성할 때만 사용하지요.

금방 댓글올라오니 편하네요...

일단 4M페이징이 훨씬 부하가 적을텐데요.

그리고 굳이 2G의 경계선을 준 이유는

가상메모리공간의 확보에 대한 용이성을 준다는 의미로 경계를 둔겁니다.

가상메모리주소공간이 많으면 좋은게 많지 않을까요?

아예 없으면 이건 분명히 메모리를 100% 활용할수 없다는 예기가 되지 않는지요?

간단하게 예로는 스택메모리 주소를 확인해보시면 가상메모리 주소를 사용하지요?

2G에서 제한을 두면 나머지 2G는 스택으로 가변할당이 용이하다는 것일테고요.

많은 Thread들이 동작하는데 수월하지 않을까 생각해봅니다.

익명 사용자의 이미지

minzkn wrote:
금방 댓글올라오니 편하네요...

8)

Quote:
일단 4M페이징이 훨씬 부하가 적을텐데요.

프로그램들이 한참 열심히 돌아가고 있는데 메모리가 모자라서 4M 단위로 페이지가 스왑 인/아웃된다고 생각해 보세요. 그런 이유로 제가 아는 한 어떤 운영체제도 4M 페이지를 애플리케이션용으로 쓰지 않습니다. 메모리에 상주하는 커널 공간만 4M 페이지로 구성하는데, 그렇게 하면 4k 페이지용 TLB 엔트리를 절약할 수 있어서지요.

Quote:
그리고 굳이 2G의 경계선을 준 이유는

가상메모리공간의 확보에 대한 용이성을 준다는 의미로 경계를 둔겁니다.

가상메모리주소공간이 많으면 좋은게 많지 않을까요?

아예 없으면 이건 분명히 메모리를 100% 활용할수 없다는 예기가 되지 않는지요?

간단하게 예로는 스택메모리 주소를 확인해보시면 가상메모리 주소를 사용하지요?

2G에서 제한을 두면 나머지 2G는 스택으로 가변할당이 용이하다는 것일테고요.

많은 Thread들이 동작하는데 수월하지 않을까 생각해봅니다.


말씀대로 2G에서 자르지 말고 4G 전부 쓰면 메모리 공간이 2배 되니까 더 좋은 거 아닌가요?! 그리고 2G에서 잘랐는데 어떻게 스택을 그 위 공간에 할당한다는 뜻인지도 잘 모르겠구요(사용자 스택은 사용자 공간에만 잡히는데). 좀 명확하게 설명을 해주시길 부탁드립니다.
jj의 이미지

아주 모범적인 쓰레드입니다. 8)
두분께 감사...

--
Life is short. damn short...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.