2014-03-13 1 views
3

가끔씩 DynamoDB에 기록하는 데 여러 초가 걸리는 시스템 성능 로그에서 이상한 증상을 진단하기 위해 노력하고 있습니다. 이 AWS (동부 지역) AWS DynamoDB와 통신 할 때 전체 지연 시간이 있습니다.

  • ELB 한 2 개의 EC2 인스턴스 (c3.2xlarge)
  • 단일 DynamoDB의 테이블에서 호스팅되는 웹 응용 프로그램입니다

    • :

      는 인프라에 대한 몇 가지 배경을 제공합니다 provisioned for 초당 1000 건의 읽기/쓰기

    연결 웹 사이트에서 약간의 요청을받는 EC2 인스턴스에서 PHP 웹 서비스가 실행되고 있습니다. ser, dynamo에 레코드를 쓰고 빈 응답을 반환합니다. 전송 된 데이터의 양은 1kb 미만입니다. ELB에 대한 트래픽 양은 하루 종일 다양하지만 초당 요청 수는 100 개를 넘습니다. 여기서 중요한 점은 AWS SDK가 70ms를 도입 한 이후로 필요한 발전기 작업을 위해 작은 CURL 클라이언트를 직접 작성했기 때문입니다 처리 시간의 오버 헤드.

    은 내가 사용하고있는 유일한 옵션은 다음과 같습니다 제가 보는 동작을에

    CURLOPT_POST 
    CURLOPT_RETURNTRANSFER 
    CURLOPT_TCP_NODELAY 
    

    : 의 경우 99 %를 들면, ELB에 의해 기록 된 응답 시간이 목표 인 30ms의 아래에있다. 그러나 그래프를 변경하여 동일한 범위에서 최대 값을 표시하면 시간이 거의 전체 초 간격으로 떨어지는 매우 다른 그림 (graph)이 표시됩니다. 이 그래프는 트래픽이 적은 밤중에도 발생하기 때문에로드와 상관 관계가 없습니다. 이러한 추세로 인해 더 깊이 파고들 수 있었고 지연을 DynamoDB에 대한 연결로 분리 할 수있었습니다.

    이러한 것들은 프로그래밍 방식 임계 값처럼 보일뿐 일반적인 잡음은 아닙니다. 첫 번째 생각은 기하 급수적 인 백 오프 였지만 다이나모 웹 서비스의 응답에서이 값 (모두 200)을 제안하지는 않을 것이고 현재 처리량은 프로비저닝의 10 %입니다. . 그리고 트래픽이 최소화 된 한밤중에도이 성능 추세를 볼 수 있습니다. 백 오프가 아니라면 어떤 종류의 조절처럼 느껴질 것입니다. 아이디어?

    내 디나모의 API 호출에 CURL의 자세한 출력을 사용하여, 나는 다음과 같은 항목을 참조하십시오

    Line 151190: 2014-03-12T16:48:35-04:00 - INFO - Time: 1.001436, (Start Transfer: 1.001416, DNS: 2.6E-5, Connect: 0.998141, Pre-Transfer: 0.998199) 
    
    Line 196871: 2014-03-12T16:48:42-04:00 - INFO - Time: 1.001528, (Start Transfer: 1.001488, DNS: 3.1E-5, Connect: 0.99694, Pre-Transfer: 0.996981) 
    
    Line 430508: 2014-03-12T16:49:19-04:00 - INFO - Time: 1.002823, (Start Transfer: 1.002807, DNS: 3.2E-5, Connect: 0.998972, Pre-Transfer: 0.999009) 
    
    Line 870236: 2014-03-12T16:50:31-04:00 - INFO - Time: 1.000663, (Start Transfer: 1.000642, DNS: 3.0E-5, Connect: 0.001506, Pre-Transfer: 0.001537) 
    
    Line 950109: 2014-03-12T16:50:43-04:00 - INFO - Time: 1.010762, (Start Transfer: 1.010737, DNS: 3.3E-5, Connect: 0.001357, Pre-Transfer: 0.001394) 
    

    의 핵심은 케이스의 50 %에 연결 시간처럼 보이고, 나머지 50 %를 여기 발견 시간이 어디에서 쓰여지는지는 불분명합니다. 엔드 투 엔드 (end-to-end) 시간에 기여할 수있는 또 다른 구성 요소가있는 것 같지만, 그게 무엇인지 정확히 지적하는 데 어려움을 겪고 있습니다.

    도움이 될 것입니다.

  • +0

    Dynamo DB는 어느 지역에 있습니까? EC2 인스턴스와 동일합니까? – Ray

    +0

    DNS 일 수 있습니까? 주소 또는 IP를 사용하고 있습니까?IP를 사용하면 현재 AWS 설정이 잘 작동하지 않을 수도 있지만 내부 주소를 사용할 수 있습니까? –

    +0

    @ 레이 - 예, 모든 것이 같은 지역에 있습니다 – Jeff

    답변

    0

    Expect: 100-continue 헤더를 전송하지 않도록하십시오. 이렇게하면 ~ 1 초 정도 지연 될 수 있습니다. 저는 cURL이 기본적으로이 헤더를 전송한다고 생각합니다. 따라서 헤더를 제거하려면 무언가를해야합니다.

    PHP 용 AWS SDK를 사용하게 될 경우 APC 또는 Zend Opcache와 같은 opcode 캐시도 사용하고 있는지 확인하십시오.

    +0

    감사합니다. Jeremy - 조사 중에이 가능성을 보았습니다. 헤더에 "Expect :"를 보내어 모든 기본 설정을 무시하도록 코드를 추가했습니다. 내가보고있는 이상한 일, 나는 CURLINFO_HEADER_OUTPUT 플래그를 켰다. 그리고 나는 내 머리글을 보지 않는다. 한 단계 아래로 숨겨져있을 수도 있습니까? 이 모든 말을하는 것입니다 : 나는 이것이 영향을 미쳤다는 것을 확인할 수는 없지만, 헤더에 "Expect :"를 추가하고 비우면, 나는 여전히 1 초의 지연을 본다. – Jeff

    +0

    자세한 출력을 말릴 때 어디서나'

    +0

    DynamoDB 포럼에도 게시해야합니다. https://forums.aws.amazon.com/forum.jspa?forumID=131 –

    관련 문제