2014-04-24 3 views
3

라거를 사용할 때 문제가 발생합니다. 라거 소스 코드에서 lager_backend_throttle.erl 파일.왜 이런 방식으로 디자인합니까?

handle_event({log, _Message},State) -> 
    {message_queue_len, Len} = erlang:process_info(self(), message_queue_len), 
    case {Len > State#state.hwm, State#state.async} of 
     {true, true} -> 
      %% need to flip to sync mode 
      lager_config:set(async, false), 
      {ok, State#state{async=false}}; 
     {false, false} -> 
      %% need to flip to async mode 
      lager_config:set(async, true), 
      {ok, State#state{async=true}}; 
     _ -> 
      %% nothing needs to change 
      {ok, State} 
    end; 

message_queue_len이 임계 값을 초과하면 동기화 모드로 전환됩니다.

message_queue_len이 Thershold보다 작 으면 비동기 모드로 전환됩니다.

너무 많은 메시지가있을 때 메시지를 더 빨리 처리하기 위해 비동기 모드로 변경해야한다고 생각합니다. 왜 라거 디자인 이런 식으로?

내가 추측하는 이유는 message_queue에 제한 길이가 있다는 것입니다. 너무 많은 메시지가있는 경우 프로세스가 중단 될 수 있습니다. 그래서 lager는 보내는 모드를 변경하여 메시지를 보내는 속도를 조절합니까?

답변

3

나는 github에 대한 답을 찾았습니다.

라거 2.0 이전에는 라거 코어의 gen_event가 순전히 동기 모드로 작동했습니다. 비동기 모드는 빠르지 만 메시지 대기열 과부하에 대한 보호 기능은 없습니다. lager 2.0에서는 gen_event가 하이브리드 방식을 취합니다. 자체 사서함 크기를 폴링하고 사서함 크기에 따라 동기식과 비동기식간에 메시징을 토글합니다.

{async_threshold, 20}, {async_threshold_window, 5} 이 사서함 포인트 동기 메시지가 사용될에서 20 개 개의 메시지를 초과 할 때까지 비동기 메시징을 사용하고 비동기로 전환되며, 크기는 20로 감소 할 때 - 5 = 15.

이 동작을 비활성화하려면 'undefined'로 설정하면됩니다. 메일 함이 한도를 빠르게 넘어서고 문제를 일으키는 것을 방지하려면 기본값이 낮은 숫자로 설정됩니다. 일반적으로 라거는 들어오는 속도만큼 메시지를 처리해야하므로 20 점은 상대적으로 예외적이어야합니다.

당신은 당신이 관련 프로세스 충돌이 많은, 당신은 제한 설정할 수 있습니다 때 메시지의 홍수를 극복하려면 좋은 생각이다 error_logger에서 허용되는 초당 메시지 수 제한하려면 :

을 {error_logger_hwm, 50} 이 숫자를 작게 유지하는 것이 가장 좋습니다.

+0

단 한 노트. 메시지 큐 (시스템 메모리 제외)에 제한이 있다고 생각하지 않습니다. – mpm

+0

@mpm 아마 그들이 말하는 것처럼. 들어오는만큼 빠르게 프로세스 메시지를 작성합니다. 너무 많은 메시지가있는 경우 사용자가 lager : notice()를 호출하면이 로그를 인쇄하는 데 오랜 시간이 걸립니다. 이것은 사용자 친화적 인 경험이 아닙니다. – baotiao

+1

mpm은 시스템 메모리에 의해 제한되는 메시지 큐에 대해 정확합니다. 이것은 사서함을 모니터링하는 주요 이유입니다. 처리 할 수있는 것보다 빠르게 프로세스 메시지를 보내면 사서함이 채워지고 Erlang VM에 메모리가 부족합니다. 이렇게하면 프로세스뿐 아니라 전체 VM이 종료되므로 치명적인 오류가 발생합니다. –

관련 문제