OOM(Out Of Memory) killer를 모니터링 할 방법은 없나요?

ukyoukyo의 이미지

아래와 같이 리눅스에서 user memory space를 할당해서 lock하려고 합니다.

size_t free_memory = sysconf( _SC_PAGE_SIZE ) * sysconf( _SC_AVPHYS_PAGES ); // 유저 메모리 영역크기 구하기
 
size_t *buf = malloc( free_memory ); // 유저 메모리 영역 할당하기
 
mlock( buf, free_memory ); // 할당된 사이즈만큼 락킹하기(페이징 방지)

free_memory라는 변수를 프로그래머가 임의로 지정하지 않고

유저 메모리중에서 사용하지 않는 영역의 크기를 저장하게 하였습니다.

이렇게 하니까,

OOM Killer가 동작해서 킬링될때도 있고, 정상적으로 메모리 라킹이 될때도 있습니다.

OOM killer를 모니터링해서 프로그래머가 먼저 OOM Killer를 제어할 방법이 없을까요?

powerson의 이미지


oom-killer는 kernel에서 관리하는 memory management쪽입니다. 즉, Application에서 제어하시기는 힘드실 거 같습니다. 단, procfs or sysfs에서 oom-killer와 관련된 것이 있던걸로 기억합니다. 사실 좋은 방법은 아니지만, 이 부분을 설정하시면, oom-killer로부터 제거되는 것을 막을 수 있으실 겁니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

tj의 이미지

OOM killer는 커널이 더 이상 forward progress를 할 수 없다고 판단할 때 작동합니다. 데드락되서 죽느니 누구라도 죽이는게 낫다고 판단하는 건데요. _SC_AVPHYS_PAGES를 다 mlock해버리면 커널 작동에 현재보다 더 메모리가 많이 필요해지면 데드락이 될 수 밖에 없겠죠? 애초에 불가능한 걸 요구하고 그래서 죽으니, 얘를 어떻게 모니터링하죠? 라고 물어보고 계세요.

ukyoukyo의 이미지


tj님, 조언감사합니다.

아, 그렇다면, _SC_AVPHYS_PAGES 대신에 유저 스페이스 메모리를 구하는 방법은 없을까요?

그러니까, '커널 작동에 현재보다 더 메모리가 많이 필요한 경우'를 방지하려면

_SC_AVPHYS_PAGES 에서 약 50MB 정도 남겨두고 락을 한다던가... 이렇게 해야하는지요?

------------------ System programmer...^^


------------------ System programmer...^^

tj의 이미지

워크로드마다 다르니 좋은 숫자 하나가 있을 것 같진 않습니다. 정말로 대부분의 메모리를 mlock해야한다면 작동상황을 모니터링하면서 파라미터를 그냥 잘 정하는 수 밖에 없습니다. 근데 아마 훨씬 더 의미있는 질문은 과연 mlock이 필요한가와 정말로 mlock이 필요하다면 어느 부분이 mlock될 필요가 있는지 일 것 같습니다. mlock이 왜 필요하신가요?

ukyoukyo의 이미지

아, tj님. 정곡을 찌르는 질문에 정말 감사드립니다.

mlock()을 하려는 이유는 페이징 방지를 위함입니다.
할당받고 -> 페이징 안되게해서 -> 그 영역에 임의의 테스트 패턴을 read/write할 생각입니다.

물론, memtest86이나 다른 메모리 검사 프로그램은 있으나,
제가 원하는 방식은 리눅스가 로딩된 후에 리부팅 없이 일반 응용프로그램처럼 실행되어야 합니다.
(memtest86은 플로피로 리부팅을 해야하죠)

짧은 지식으로는, 할당받은 메모리 영역을 락킹하지 않고 read/write등을 하면
속도가 느려지거나 페이징으로 인하여 정확한 메모리 rea/write가 안된다는 text를 보아서요...

mlock를 하지 않고 다른 방법이 있을까요?

그리고, mlock을 해야한다면, 정말 메모리 작동상황을 모니터링 하면서 파라메터를 넘겨주는 방식 밖에는 없을까요?

그래서 50메가를 빼주니마니...이런 생각도 해봤던것이구요.

------------------ System programmer...^^


------------------ System programmer...^^

Hyun의 이미지

어플리케이션 메모리 페이징을 막기 위해서는 스왑을 모두 없애고 사용하면 할당한(사용중인) 메모리에 대해서는 커널이 페이징을 하지 않습니다.

하지만, 리눅스의 어플리케이션 위치에서 메모리 디바이스의 동작을 read, write 동작으로 확인한다는 것은 의미가 없는 것 같습니다.
어플리케이션이 시스템 메모리의 특정 메모리영역을 강제로 사용할 수 없을 분더러, 특정 영역을 강제로 할당하더라도, 그 메모리 위치에 다른 프로세스나 커널이 점유하고 있으면 그곳을 건드려서는 안됩니다. 또한, 리눅스 커널이 올라갈 때는 이미 메모리 디바이스가 잘 동작한다는 가정이 있으므로, 커널이 동작하고 있는 상황에서 또다시 메모리 디바이스를 확인하는 것은 순서에도 맞지 않습니다.


나도 세벌식을 씁니다
ukyoukyo의 이미지

강제할당하고 mlock()하는것 자체가 다른 프로세스나 커널이 못 건들게 하는것 아닌가요?

그리고,

커널 올라올때 메모리는 당연히 정상이라는 가정을 합니다... 저도 알고 있습니다만,

실무에서는 커널이 동작하고 있는 상황에서 메모리가 종종 죽곤 하더군요...(부팅 불량은 제외)

------------------ System programmer...^^


------------------ System programmer...^^

Hyun의 이미지

Quote:
실무에서는 커널이 동작하고 있는 상황에서 메모리가 종종 죽곤 하더군요...(부팅 불량은 제외)

그렇다면 부트로더에서 메모리를 검사하는게 좋지 않나요? 커널 올라와 있는 상태에서 메모리검사하다 죽어버리는 경우보다는 부트로더에서 안전하게 검사하는게 더 좋을 듯 한데...
나도 세벌식을 씁니다
tj의 이미지

런타임중 메모리 오류는 single bit인 경우가 많은데 ECC 메모리면 실제 문제가 되기전에 MCE 뜨지않나요?

tj의 이미지

아... 온라인 메모리 테스팅을 해야하는거군요. ㅎㅎ 그럼 뭐 눈치껏 최대한 잡고 하는 수 밖엔;;; 메모리 테스트 중엔 다른 커널 서비스를 거의 사용안하니 조금만 빼줘도 큰 문제는 없을겁니다. 참고로 이미 프로그램이 있습니다.

http://pyropus.ca/software/memtester/

tj의 이미지

그리고 kernel 뷜드할 때 CONFIG_MEMTEST 켜고 하면 부팅중 메모리 초기화하면서 메모리 테스트 하도록 할 수 있습니다. 커널 텍스트, 데이터 영역 제외하곤 거의 다 테스트 할 수 있고 문제가 있을 땐 물리 주소도 알 수 있습니다. 커널 파라미터로 memtest 지정하면 모든 패턴으로 테스트하고 memtest=N 으로 몇개 패턴으로 할지도 정할 수 있구요.

ukyoukyo의 이미지


command line argument로 사용자가 원하는 메모리 용량을 입력해야하더군요... 쩝.

'눈치껏 최대한 잡고' <--- 이걸 안하기 위해서 질문을 드린겁니다^^

즉, 눈치껏 최대한 잡는걸 프로그램짜서 알아서, 자동으로, 최대한 잡도록 하는게 목적이었습니다.

그래서 OOM Killer에 잡힐까봐 50메가를 빼니 마니.... 이런 말씀을 드린거구요.

------------------ System programmer...^^


------------------ System programmer...^^

tj의 이미지

네 없습니다. 그냥 눈치껏 재주껏 하셔야합니다. 애초에 범용 오에스에서 고려하는 워크로드가 아닌걸요. 그냥 AVPHYS에서 적당히 빼면서 여러번 해봐서 괜찮을 거 같은 값에 조금 더 빼줘서 사용하는 수 밖에 없을 듯 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.