OOM(Out Of Memory) killer를 모니터링 할 방법은 없나요?
글쓴이: ukyoukyo / 작성시간: 금, 2009/09/04 - 6:16오후
아래와 같이 리눅스에서 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를 제어할 방법이 없을까요?
Forums:
oom-killer는 kernel에서
oom-killer는 kernel에서 관리하는 memory management쪽입니다. 즉, Application에서 제어하시기는 힘드실 거 같습니다. 단, procfs or sysfs에서 oom-killer와 관련된 것이 있던걸로 기억합니다. 사실 좋은 방법은 아니지만, 이 부분을 설정하시면, oom-killer로부터 제거되는 것을 막을 수 있으실 겁니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
OOM killer는 커널이 더
OOM killer는 커널이 더 이상 forward progress를 할 수 없다고 판단할 때 작동합니다. 데드락되서 죽느니 누구라도 죽이는게 낫다고 판단하는 건데요. _SC_AVPHYS_PAGES를 다 mlock해버리면 커널 작동에 현재보다 더 메모리가 많이 필요해지면 데드락이 될 수 밖에 없겠죠? 애초에 불가능한 걸 요구하고 그래서 죽으니, 얘를 어떻게 모니터링하죠? 라고 물어보고 계세요.
tj님,
tj님, 조언감사합니다.
아, 그렇다면, _SC_AVPHYS_PAGES 대신에 유저 스페이스 메모리를 구하는 방법은 없을까요?
그러니까, '커널 작동에 현재보다 더 메모리가 많이 필요한 경우'를 방지하려면
_SC_AVPHYS_PAGES 에서 약 50MB 정도 남겨두고 락을 한다던가... 이렇게 해야하는지요?
------------------ System programmer...^^
------------------ System programmer...^^
워크로드마다 다르니
워크로드마다 다르니 좋은 숫자 하나가 있을 것 같진 않습니다. 정말로 대부분의 메모리를 mlock해야한다면 작동상황을 모니터링하면서 파라미터를 그냥 잘 정하는 수 밖에 없습니다. 근데 아마 훨씬 더 의미있는 질문은 과연 mlock이 필요한가와 정말로 mlock이 필요하다면 어느 부분이 mlock될 필요가 있는지 일 것 같습니다. mlock이 왜 필요하신가요?
최대한 많이 mlock()을 하고 싶은데요,
아, tj님. 정곡을 찌르는 질문에 정말 감사드립니다.
mlock()을 하려는 이유는 페이징 방지를 위함입니다.
할당받고 -> 페이징 안되게해서 -> 그 영역에 임의의 테스트 패턴을 read/write할 생각입니다.
물론, memtest86이나 다른 메모리 검사 프로그램은 있으나,
제가 원하는 방식은 리눅스가 로딩된 후에 리부팅 없이 일반 응용프로그램처럼 실행되어야 합니다.
(memtest86은 플로피로 리부팅을 해야하죠)
짧은 지식으로는, 할당받은 메모리 영역을 락킹하지 않고 read/write등을 하면
속도가 느려지거나 페이징으로 인하여 정확한 메모리 rea/write가 안된다는 text를 보아서요...
mlock를 하지 않고 다른 방법이 있을까요?
그리고, mlock을 해야한다면, 정말 메모리 작동상황을 모니터링 하면서 파라메터를 넘겨주는 방식 밖에는 없을까요?
그래서 50메가를 빼주니마니...이런 생각도 해봤던것이구요.
------------------ System programmer...^^
------------------ System programmer...^^
어플리케이션 메모리
어플리케이션 메모리 페이징을 막기 위해서는 스왑을 모두 없애고 사용하면 할당한(사용중인) 메모리에 대해서는 커널이 페이징을 하지 않습니다.
하지만, 리눅스의 어플리케이션 위치에서 메모리 디바이스의 동작을 read, write 동작으로 확인한다는 것은 의미가 없는 것 같습니다.
어플리케이션이 시스템 메모리의 특정 메모리영역을 강제로 사용할 수 없을 분더러, 특정 영역을 강제로 할당하더라도, 그 메모리 위치에 다른 프로세스나 커널이 점유하고 있으면 그곳을 건드려서는 안됩니다. 또한, 리눅스 커널이 올라갈 때는 이미 메모리 디바이스가 잘 동작한다는 가정이 있으므로, 커널이 동작하고 있는 상황에서 또다시 메모리 디바이스를 확인하는 것은 순서에도 맞지 않습니다.
'강제할당'의 의미가...
강제할당하고 mlock()하는것 자체가 다른 프로세스나 커널이 못 건들게 하는것 아닌가요?
그리고,
커널 올라올때 메모리는 당연히 정상이라는 가정을 합니다... 저도 알고 있습니다만,
실무에서는 커널이 동작하고 있는 상황에서 메모리가 종종 죽곤 하더군요...(부팅 불량은 제외)
------------------ System programmer...^^
------------------ System programmer...^^
인용:실무에서는
그렇다면 부트로더에서 메모리를 검사하는게 좋지 않나요? 커널 올라와 있는 상태에서 메모리검사하다 죽어버리는 경우보다는 부트로더에서 안전하게 검사하는게 더 좋을 듯 한데...
런타임중 메모리
런타임중 메모리 오류는 single bit인 경우가 많은데 ECC 메모리면 실제 문제가 되기전에 MCE 뜨지않나요?
아... 온라인 메모리
아... 온라인 메모리 테스팅을 해야하는거군요. ㅎㅎ 그럼 뭐 눈치껏 최대한 잡고 하는 수 밖엔;;; 메모리 테스트 중엔 다른 커널 서비스를 거의 사용안하니 조금만 빼줘도 큰 문제는 없을겁니다. 참고로 이미 프로그램이 있습니다.
http://pyropus.ca/software/memtester/
그리고 kernel 뷜드할
그리고 kernel 뷜드할 때 CONFIG_MEMTEST 켜고 하면 부팅중 메모리 초기화하면서 메모리 테스트 하도록 할 수 있습니다. 커널 텍스트, 데이터 영역 제외하곤 거의 다 테스트 할 수 있고 문제가 있을 땐 물리 주소도 알 수 있습니다. 커널 파라미터로 memtest 지정하면 모든 패턴으로 테스트하고 memtest=N 으로 몇개 패턴으로 할지도 정할 수 있구요.
그 프로그램도 함 봤는데요,
command line argument로 사용자가 원하는 메모리 용량을 입력해야하더군요... 쩝.
'눈치껏 최대한 잡고' <--- 이걸 안하기 위해서 질문을 드린겁니다^^
즉, 눈치껏 최대한 잡는걸 프로그램짜서 알아서, 자동으로, 최대한 잡도록 하는게 목적이었습니다.
그래서 OOM Killer에 잡힐까봐 50메가를 빼니 마니.... 이런 말씀을 드린거구요.
------------------ System programmer...^^
------------------ System programmer...^^
네 없습니다. 그냥
네 없습니다. 그냥 눈치껏 재주껏 하셔야합니다. 애초에 범용 오에스에서 고려하는 워크로드가 아닌걸요. 그냥 AVPHYS에서 적당히 빼면서 여러번 해봐서 괜찮을 거 같은 값에 조금 더 빼줘서 사용하는 수 밖에 없을 듯 합니다.
댓글 달기