주메뉴 바로가기 본문 바로가기 하단 바로가기

고객지원

기술문의

CPU와 Memory 사용률이 증가하는 문제점??

  • 김주범
  • 2012.08.10
  • 조회수 2,487
안녕하세요.
항상 본 게시판에서 많은 도움을 받고 있습니다. 감사드립니다.

현재 cplex를 이용해서 project를 진행하고 있습니다.
project안의 여러개의 입력 파라미터가 있고, 그 값들을 조금씩 변화시켜 가면서 결과값을 출력하고 있습니다.
그런데 입력 파라미터 값을 증가시키면서 실행하다보면 파라미터값이 특정값 이상 커지면 cplex에서 답을 찾지 못하는 상태가 됩니다. 예를 들어 a라는 값을 19.5에서 0.5 단위로 증가해서 값을 찾고 있습니다. 19.5, 20, 20.5, 21, 21.5 이런식으로요. 그리고 각 a 값마다 seed 값을 변화시켜 10회씩 실행합니다. 그러니까 19.5 10번, 20 10번 이런식으로요.

처음 19.5 값 일때 10회는 정상적으로 동작합니다. 그러다가 a=20
일때 처음 3번째 seed 까지는 정상적으로 동작하다가, 4번째 seed가 되면서 값을 찾지 못하는 현상이 나옵니다.

현재 linux 머신에서 해당 코드를 실행하고 있는데, 이때 top를 실행해 보면 해당하는 프로세스의 CPU와 Memory 사용률이 계속해서 증가합니다. 예를들어 보통 정상적인 때에는 CPU 102~104%, Memory 0.1 ~ 0.3% 이정도 되는데 문제가 발생할 때는 CPU 500%, 600%, 700% ~(계속증가), Memory 20%, 30% ~(계속증가) 등등 계속 증가하다가 결국 시스템 자원을 다 소모하면 죽습니다.(현재 사용중인 머신은 cpu 12개, memory는 32GB 입니다).

무슨 문제일까요? 혹시 예상되는 문제점이라도 알려주시면 감사하겠습니다.
다시 한번 항상 감사드리고, KSTEC의 무궁한 발전을 기원합니다.

혹시 코드가 필요하시다면 올려보겠습니다. 메모리 해제에 문제가 있는 것일까요?

댓글 3

  • 김반2012-08-13

    안녕하세요..

    기본적으로, 메모리 사용량이 증가하는부분은 쉽게판단 할수 없는 문제입니다. 여러가지 가능성을 염두하고 디버깅이 필요합니다.

    일단, MIP 문제에서 입력 파라미터 값 증가치는 작지만 실제로 문제 풀이 영역은 지수적으로 증가 함으로 메모리 사용량이 많이 증가할수 있습니다.

    말씀하신 메모리 해제 부분은 프로그램 코드를 반복수행 하는 구조일 경우 기존 메모리 사용을 해제가 필요합니다.

    만약, 코딩상의 오류가 아니고 어떤 문제를 증명하려는 프로젝트가 아니라, 실제 실행가능한 해 중 최선을 찾는 프로젝트라면, 해 영역을 제한적으로 설정하는 방법 (1.CPLEX 파라미터 설정 or 2.문제 분할 수행)이 필요해 보입니다.

    감사합니다.
    아이콘삭제
  • 김주범2012-08-14
    친절한 답변에 감사드립니다.

    말씀하신 답변중에
    1. 해 영역을 제한적으로 설정하는 방법(1. CPLEX 파라미터 설정 or 2. 문제 분할 수행)은 어떻게 하는것인지요?

    2. 프로그램 코드를 반복수행하는 구조입니다. 기존 메모리 사용 해제를 한다고 했는데 제대로 되어있는지 검토해줄수 있으신지요?

    혹시 도움이 될까 몰라 소스파일을 올립니다. 문제는 현재 프로젝트의 소스파일의 파일수가 많아 전체를 다 올리지 못하고 CPLEX를 사용하는 부분만 올립니다. 실행은 되지 않을겁니다. CPLEX를 사용하는 함수는 ComputeILP() 입니다.

    너무 막연하게 질문을 해서 죄송합니다.
    다시 한번 감사드리고, 건강하세요.
    아이콘삭제
  • 김반2012-08-14
    안녕하세요

    아래 비슷한 질문에 설명한 내용입니다.

    다음을 확인해 보세요.
    1. 메모리 확장이 설정되지 않았는지
    cplex.setParam(IloCplex::WorkMem,1024); //Default 128MB
    => 1024 메가바이트(1GB)를 할당하도록 변경한 예 입니다.
    .
    cplex.setParam(IloCplex::MemoryEmphasis,1);
    => 메모리 사용을 효율화해서 큰 문제를 풀 수 있습니다.

    2. 구현상의 문제점이 있는지
    -> 소스 코드 내 변수 메모리 해제나, concert library사용시 env.end()를 통한 메모리 해제가 효율적으로 구현되었는지 체크해야 합니다.

    3. 너무 많은 결정변수를 생성하게 구성한 모델링인지
    -> 결정변수의 개수가 너무 많은 경우 많은 메모리를 사용하게 됩니다. 데이터를 확인해 보시고 너무 큰 모델을 구성한 게 아닌지 체크하시고, 모델링 변경을 고려해 보셔야 될 것 같습니다.

    세부적인 사항을 알지 못하니 답변을 드리기가 힘드네요.
    보통 변수개수가 적어도 제약에 의해 바운드가 잘 안되면 tree를 모두 탐색하느라 풀이속도가 늦어질 뿐만 아니라 많은 메모리를 차지합니다. 되도록 바운드 잘 되도록 모델링 조정이 필요할 듯 합니다.

    size가 커져서 생기는 문제라면 다음과 같은 MIP종료 조건을 걸어 풀이해를 찾을 수 있습니다. 참고하세요.

    IloCplex::IntSolLim : MIP solution limit.
    IloCplex::TiLim : Global time limit.
    IloCplex::NodeLim : MIP node limit.
    IloCplex::EpAGap : Absolute mipgap tolerance.
    IloCplex::EpGap : Relative mipgap tolerance.
    IloCplex::TreLim : Tree memory limit.
    아이콘삭제

댓글 입력