Node.js 를 이용 하여 HTTP 를 이해 하고 측정 하 는 데 걸 리 는 시간 에 대한 상세 한 설명

머리말
HTTP 시간 을 이해 하고 측정 하 는 것 은 클 라 이언 트 가 서버 나 서버 에서 서버 간 의 통신 성능 병목 을 발견 하 는 데 도움 이 된다.본 고 는 HTTP 요청 의 시간 비용 을 소개 하고 Node.js 에서 측정 하 는 방법 을 보 여 준다.
우리 가 HTTP 시간 비용 을 이해 하기 전에 기본 적 인 개념 을 살 펴 보 자.
  • IP(인터넷 프로 토 콜):IP 는 네트워크 계층 프로 토 콜 로 네트워크 주소 와 경로 와 관련된다.IP 는 하나 이상 의 IP 네트워크 의 데이터 패 킷 에 따라 데이터 패 킷 을 원본 호스트 에서 대상 호스트 로 전송 하 는 것 을 책임 집 니 다.전달 할 데 이 터 를 봉인 하 는 패 킷 구조 도 정의 했다.
  • DNS(도 메 인 네 임 서버):DNS 는 risingstack.com 과 같은 인간 이 읽 을 수 있 는 호스트 이름 을 기계 가 읽 을 수 있 는 IP 주소 로 해석 하 는 분 층 분산 식 네 임 시스템 입 니 다.
  • TCP(전송 제어 프로 토 콜):TCP 표준 은 응용 프로그램 간 에 네트워크 대 화 를 구축 하고 유지 하 며 데 이 터 를 교환 하 는 방법 을 정의 합 니 다.TCP 는 IP 네트워크 를 통 해 통신 되 는 호스트 에서 실행 되 는 프로그램 사이 에 신뢰 할 수 있 고 질서 있 으 며 오류 검사 가 있 는 8 개의 바이트 흐름 을 제공 합 니 다.HTTP 클 라 이언 트 는 TCP 연결 을 만들어 요청 합 니 다.
  • SSL/TLS(전송 층 보안):TLS 는 컴퓨터 네트워크 를 통 해 통신 안전성 을 제공 하 는 암호 화 프로 토 콜 입 니 다.SSL(보안 소켓 층)은 TLS 의 권장 되 지 않 는 전신 이다.TLS 와 SSL 은 모두 인증 서 를 사용 하여 안전 한 연결 을 만 듭 니 다.SSL 인증 서 는 암호 화 프로 토 콜(예:TLS)에 의존 하지 않 습 니 다.인증 서 는 키 쌍:공개 키 와 비밀 키 를 포함 합 니 다.이 키 들 은 암호 화 된 연결 을 만 들 기 위해 함께 작 동 합 니 다.
  • 이제 보통 HTTP 요청 시간 표를 살 펴 보 겠 습 니 다.
  • DNS 검색:DNS 검색 을 수행 하 는 데 걸 리 는 시간.DNS 는 도 메 인 이름 을 IP 주소 로 해석 하 는 것 을 찾 습 니 다.모든 새로운 도 메 인 은 DNS 검색 을 위해 완전한 왕복 일정 이 필요 합 니 다.목적지 가 IP 주소 일 때 DNS 가 찾 지 않 습 니 다.
  • TCP 연결:원본 호스트 와 대상 호스트 사이 에 TCP 연결 을 만 드 는 데 걸 리 는 시간 입 니 다.여러 걸음 악 수 를 하 는 과정 에서 정확 한 연결 을 만들어 야 한다.TCP 연결 은 운영 체제 에서 관리 합 니 다.기본 TCP 연결 이 이 루어 지지 않 으 면 OS 범위 의 TCP 연결 시간 이 초과 되면 우리 프로그램의 시간 초과 설정 에 들 어 갑 니 다.
  • TLS 악수:TLS 악 수 를 완성 하 는 시간.악수 과정 에서 터미널 에서 인증 과 키 를 교환 하여 안전 세 션 을 만 들 거나 복원 합 니 다.HTTPS 요청 이 없 는 사람 은 TLS 악수 가 필요 없습니다.
  • 첫 번 째 바이트 의 시간(TTFB):초기 응답 을 기다 리 는 시간 입 니 다.이 시간 은 서버 처리 요청 과 응답 전달 을 기다 리 는 데 걸 리 는 시간 외 에 왕복 서버 의 지연 도 포착 할 수 있다.
  • 내용 전송:응답 데 이 터 를 받 는 데 걸 리 는 시간.응답 데이터 의 크기 와 사용 가능 한 네트워크 대역 폭 이 지속 시간 을 결정 합 니 다.
  • 어떻게 HTTP 시간 비용 을 통 해 성능 병목 을 발견 하 는 데 도움 을 줍 니까?
    예 를 들 어 DNS 조회 에 예상 보다 오래 걸 리 면 문 제 는 DNS 공급 자 나 DNS 캐 시 설정 일 수 있 습 니 다.
    느 린 콘 텐 츠 전송 은 효율 이 낮은 반응 기구 에서 일어 날 수 있 습 니 다.예 를 들 어 너무 많은 데이터(사용 되 지 않 은 JSON 속성 등)를 보 내 거나 느 린 연결 등 입 니 다.
    Node.js 의 HTTP 시간 소 비 를 측정 합 니 다.
    Node.js 의 HTTP 시간 비용 을 측정 하기 위해 서 는 특정한 요청,응답,소켓 이 벤트 를 구독 해 야 합 니 다.이것 은 Node.js 에서 이 동작 을 수행 하 는 방법 을 보 여 주 는 간단 한 코드 세 션 입 니 다.이 예 는 순서 에 만 관심 을 가 집 니 다.
    
    const timings = {
     // use process.hrtime() as it's not a subject of clock drift
     startAt: process.hrtime(),
     dnsLookupAt: undefined,
     tcpConnectionAt: undefined,
     tlsHandshakeAt: undefined,
     firstByteAt: undefined,
     endAt: undefined
     }
    
     const req = http.request({ ... }, (res) => {
     res.once('readable', () => {
      timings.firstByteAt = process.hrtime()
     })
     res.on('data', (chunk) => { responseBody += chunk })
     res.on('end', () => {
      timings.endAt = process.hrtime()
     })
     })
     req.on('socket', (socket) => {
     socket.on('lookup', () => {
      timings.dnsLookupAt = process.hrtime()
     })
     socket.on('connect', () => {
      timings.tcpConnectionAt = process.hrtime()
     })
     socket.on('secureConnect', () => {
      timings.tlsHandshakeAt = process.hrtime()
     })
     }) 
    DNS 찾기 는 도 메 인 이름 이 있 을 때 만 발생 합 니 다.
    
    / There is no DNS lookup with IP address
    const dnsLookup = dnsLookupAt !== undefined ? 
     getDuration(startAt, dnsLookupAt) : undefined
    TCP 연결 은 호스트 분석 후 즉시 발생 합 니 다:
    
    const tcpConnection = getDuration((dnsLookupAt || startAt), tcpConnectionAt)
    TLS 악수(SSL)는 https 프로 토 콜 만 사용 할 수 있 습 니 다.
    
    // There is no TLS handshake without https 
    const tlsHandshake = tlsHandshakeAt !== undefined ? 
      getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined
    서버 가 첫 번 째 바이트 보 내 기 를 기다 리 고 있 습 니 다:
    
    const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)
    총 지속 시간 은 시작 과 종료 날짜 로부터 계산 합 니 다.
    
    const total = getDuration(startAt, endAt)
    전체 예 를 보고 우리 의 https://github.com/RisingStac... 창 고 를 보 세 요.
    시간 측정 도구
    이제 Node 를 사용 하여 HTTP 시간 을 측정 하 는 방법 을 알 고 있 습 니 다.HTTP 요청 을 알 수 있 는 기 존 도 구 를 토론 합 니 다.request module유명한 request module 은 HTTP 의 시간 을 측정 하 는 내장 방법 을 가지 고 있다.time 속성 을 사용 하여 사용 할 수 있 습 니 다.
    
    const request = require('request')
    
    request({ 
     uri: 'https://risingstack.com',
     method: 'GET',
     time: true
    }, (err, resp) => {
     console.log(err || resp.timings)
    })
    분산 추적
    분산 추적 도 구 를 사용 하여 HTTP 시간 을 수집 하고 시간 축 에서 시각 화 할 수 있 습 니 다.이렇게 하면 귀 하 는 배경 에서 발생 하 는 상황 과 분포 식 시스템 을 구축 하 는 실제 비용 이 얼마 인지 전면적으로 파악 할 수 있 습 니 다.
    Risingstack 의 opentracing-auto 라 이브 러 리 는 내 장 된 플래그 가 있 으 며 OpenTracing 을 통 해 모든 HTTP 시간 을 수집 할 수 있 습 니 다.

    Jaeger 에서 opentracing-auto 를 사용 하 는 HTTP 요청 순서 입 니 다.
    총결산
    Node.js 를 사용 하여 HTTP 시간 을 측정 하면 성능 병목 을 발견 할 수 있 습 니 다.Node 생태 시스템 은 응용 프로그램 에서 이 지 표를 추출 할 수 있 는 좋 은 도 구 를 제공 합 니 다.
    자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
    번역

    좋은 웹페이지 즐겨찾기