Node. js 학습 노트 (5)

6761 단어 node.js
메모리 제어
차단 되 지 않 고 이벤트 구동 을 바탕 으로 하 는 Node 서 비 스 는 메모리 소모 가 적은 장점 을 가지 고 대량의 네트워크 요청 을 처리 하기에 매우 적합 하 다.
1. V8 의 쓰레기 수 거 메커니즘 과 메모리 제한
성능 이 민감 한 서버 프로그램 에 대해 메모리 관리의 좋 고 나 쁨, 쓰레기 회수 상황 이 좋 은 지 여 부 는 서비스 에 영향 을 줄 수 있다.Node 에 서 는 이 모든 것 이 Node 의 JavaScript 실행 엔진 V8 과 밀접 한 관 계 를 가진다.
1.1 Node 와 V8
Node 는 크롬의 자 바스 크 립 트 가 실 행 될 때 구 축 된 플랫폼 입 니 다.
V8 의 성능 우 위 는 자 바스 크 립 트 로 고성능 백 엔 드 서비스 프로그램 을 쓸 수 있 게 한다.
Node 는 JavaScript 의 실행 에 있어 V8 에 직접적인 이익 을 얻 을 수 있 습 니 다. V8 의 업그레이드 에 따라 더 좋 은 성능 이나 새로운 언어 특성 을 누 릴 수 있 고 V8 의 일부 제한 도 받 을 수 있 습 니 다. 예 를 들 어 메모리 제한 등 입 니 다.
1.2 V8 메모리 제한
노드 에서 자 바스 크 립 트 를 통 해 메모리 사용 을 하면 일부 메모리 (64 비트 약 1.4GB, 32 비트 약 0.7G) 만 사용 할 수 있 음 을 알 수 있다.
V8 의 메모리 제한 으로 인해 Node 는 큰 메모리 대상 을 직접 조작 할 수 없습니다.
이 문 제 를 일 으 킨 주요 원인 은 Node 가 V8 기반 으로 구축 되 었 기 때문에 Node 에서 사용 하 는 JavaScript 대상 은 기본적으로 V8 자체 의 방식 으로 분배 하고 관리 하 는 것 이다.
1.3 V8 의 대상 배분
V8 에서 모든 자 바스 크 립 트 대상 은 쌓 기 를 통 해 분 배 됩 니 다.
Node 는 V8 의 메모리 사용량 을 보 는 방식 을 제공 합 니 다.
$node > process. memory Usage () {rss: 22044672, heapTotal: 9682944, heapUsed: 5296232, / / 이미 신청 한 메모리 외부: 8860}  //사용 한 메모리 더미
코드 에서 변 수 를 설명 하고 값 을 부여 할 때 사용 하 는 대상 의 메모 리 는 더미 에 분 배 됩 니 다.신청 한 남 은 메모리 가 새 대상 을 할당 하지 못 하면 메모리 더 미 를 계속 신청 하여 V8 의 제한 을 초과 할 때 까지 더 미 를 알 수 있 습 니 다.
V8 은 왜 더미 의 크기 를 제한 합 니까?
  • 표층 의 원인 은 V8 이 처음에 브 라 우 저 를 위해 설계 되 었 기 때문에 대량의 메모 리 를 사용 하 는 장면 을 만 날 수 없다.
  • 심층 원인 은 V8 의 쓰레기 회수 메커니즘 의 제한 이다.

  • 더 많은 메모리 사용 제한 열기:
    node -- max - old - space - size = 1700 test. js / 단 위 는 MB / / 또는 node -- max - new - space - size = 1024 test. js / 단 위 는 KB
    1.4 V8 의 쓰레기 회수 메커니즘
    V8 에 사용 되 는 각종 쓰레기 수 거 알고리즘:
  • V8 의 주요 쓰레기 회수 알고리즘 V8 의 쓰레기 회수 전략 은 주로 세대 별 쓰레기 회수 체 제 를 바탕 으로 한다.현대 의 쓰레기 회수 알고리즘 에 서 는 대상 의 생존 시간 에 따라 메모리 의 쓰레기 수 거 를 서로 다른 세대 로 나 눈 다음 에 서로 다른 세대 의 메모리 에 대해 더욱 효율 적 인 알고리즘 을 사용한다.
  • V8 의 메모 리 는 V8 에서 주로 메모 리 를 신세대 와 노생대 두 세대 로 나눈다.신세대 의 대상 은 생존 시간 이 비교적 짧다.노생대 의 대상 이 생존 시간 이 비교적 길 거나 메모리 에 상주 하 는 대상;V8 더미 의 전체 크기 는 신세대 가 사용 하 는 메모리 에 구세대 의 메모리 공간 이다.
  • Scavenge 알고리즘 은 세 대 를 나 누 는 토대 에서 신세대 의 대상 은 주로 Scavenge 알고리즘 을 통 해 쓰레기 수 거 를 한다.Scavenge 의 구체 적 인 실현 에 있어 서 주로 Cheney 알고리즘 을 사용 합 니 다.Cheney 알고리즘 은 복제 방식 으로 이 루어 진 쓰레기 회수 알고리즘 이다.쓰레기 를 회수 하 는 과정 에서 생존 대상 을 두 개의 semisoace 공간 에서 복사 하 는 것 이다.Scavenge 의 단점: 메모리 의 절반 만 사용 할 수 있 습 니 다.Scavenge 는 전형 적 인 희생 공간 에서 시간 을 바 꾸 는 알고리즘 이기 때문에 모든 쓰레기 회수 에 대규모로 적용 할 수 없습니다.한 대상 이 여러 번 복 제 를 거 쳐 살아 남 을 때, 그것 은 생명주기 가 비교적 긴 대상 으로 여 겨 질 것 이다.이런 긴 생명주기 의 대상 은 나중에 노생대 로 이동 해 새로운 알고리즘 으로 관리 된다.대상 이 신세대 에서 노대 로 이동 하 는 과정 을 승진 이 라 고 한다.
  • 마크 - 스 윗 & 마크 - 컴 팩 트 마크 - 스 윗 은 태그 제거 라 는 뜻 으로 태그 와 제거 두 단계 로 나 뉜 다.Mark - Sweet 의 가장 큰 문 제 는 한 번 의 태그 지우 기 수 거 를 한 후에 메모리 공간 이 연속 되 지 않 는 상태 가 발생 한 다 는 것 입 니 다.Mark - Compact 는 표기 정리 라 는 뜻 으로 Mark - Sweet 을 바탕 으로 변 형 된 것 이다.
  • 인 크 레 멘 탈 마 킹 은 자 바스 크 립 트 애플 리 케 이 션 논리 가 쓰레기 수 거 기와 일치 하지 않 는 상황 이 발생 하지 않도록 쓰레기 수 거 를 위 한 3 가지 기본 알고리즘 을 모두 애플 리 케 이 션 논 리 를 일시 중지 하고, 쓰레기 수 거 를 마치 고 애플 리 케 이 션 논 리 를 재 개 하 는 행 위 를 '올 스 톱' (stop - the - world) 이 라 고 한다.전체 쓰레기 수 거 에 따 른 정지 시간 을 줄 이기 위해 V8 은 태그 단계 부터 시작 해 단숨에 멈 춰 야 했 던 동작 을 증분 태그 (Incremental Marking) 로 변경 했다.


  • 1.5 쓰레기 수 거 로그 보기
    쓰레기 수 거 로 그 를 보 는 방식 은 주로 시작 할 때 - trace 를 추가 합 니 다.gc 매개 변수.쓰레기 수 거 를 진행 할 때 표준 출력 에서 쓰레기 수 거 로그 정 보 를 출력 합 니 다.
    쓰레기 회수 로 그 를 분석 함으로써 쓰레기 회수 의 운행 상황 을 파악 하고 쓰레기 회수 의 어떤 단계 가 비교적 오래 걸 리 고 촉발 되 는 원인 이 무엇 인지 찾 을 수 있다.
    2. 효율 적 인 메모리 사용
    V8 앞에서 개발 자가 갖 춰 야 할 책임 은 어떻게 쓰레기 회수 체 제 를 더욱 효율적으로 일 하 게 하 는 것 입 니까?
    2.1 역할 영역
    JavaScript 에서 역할 영역 을 형성 할 수 있 는 함수 호출, with 및 전역 역할 영역 입 니 다.
  • 식별 자 찾기
  • 역할 도 메 인 체인
  • 변수의 주동 적 인 방출 메모리 상주 대상 을 방출 해 야 할 경우 delete 작업 을 통 해 인용 관 계 를 삭제 할 수 있 습 니 다.또는 변 수 를 다시 할당 하여 오래된 대상 을 인용 관계 에서 벗 어 나 게 합 니 다.delete 작업 과 재 할당 은 같은 효 과 를 가지 지만 V8 에서 delete 를 통 해 대상 의 속성 을 삭제 하면 V8 의 최적화 에 영향 을 줄 수 있 습 니 다. 모든 할당 방식 으로 인용 을 해제 하 는 것 이 좋 습 니 다.

  • 2.2 폐쇄
    자 바스 크 립 트 에서 외부 역할 영역 이 내부 역할 영역 에 접근 하 는 변 수 를 실현 하 는 방법 을 클 로 저 (closure) 라 고 합 니 다.이것 은 고급 함수 의 특성 덕분이다. 함 수 는 매개 변수 나 반환 값 으로 할 수 있다.
    패 키 지 를 닫 는 것 은 자 바스 크 립 트 의 고급 특성 으로 이 를 이용 하면 많은 교묘 한 효 과 를 낼 수 있다.이 중간 함 수 를 인용 하 는 변수 가 있 으 면 이 중간 함 수 는 방출 되 지 않 고 원시 적 인 역할 영역 도 방출 되 지 않 으 며 역할 영역 에서 발생 하 는 메모리 사용량 도 방출 되 지 않 습 니 다.더 이상 인용 하지 않 는 한 점차 풀 려 날 것 이다.
    3. 메모리 지표
    3.1 메모리 사용 현황 보기
  • 프로 세 스 의 메모리 사용량 호출 프로 세 스. memory Usage () 를 보면 노드 프로 세 스 의 메모리 사용량 을 볼 수 있 습 니 다.rss 는 resident set size 의 줄 임 말, 즉 프로 세 스 의 상주 메모리 부분 입 니 다.프로 세 스 의 메모 리 는 모두 몇 부분 이 며, 일 부 는 rss 이 며, 나머지 부분 은 교환 구역 (swap) 이나 파일 시스템 (filesystem) 에 있 습 니 다.
  • 시스템 의 메모리 점용 OS 모듈 의 totalmem () 과 freemem () 을 보면 운영 체제 의 메모리 사용 상황 을 볼 수 있 습 니 다.각각 시스템 의 총 메모리 와 유 휴 메모 리 를 되 돌려 줍 니 다. 단 위 는 바이트 입 니 다. $node > os.totalmem() 8446971904 > os.freemem() 2469531648 >

  • 3.2 외부 메모리
    쌓 여 있 는 메모리 사용량 은 항상 프로 세 스 의 상주 메모리 보다 적 습 니 다. 이 는 Node 의 메모리 사용 이 모두 V8 을 통 해 분 배 된 것 이 아니 라 는 것 을 의미 합 니 다.V8 을 통 해 할당 되 지 않 은 메모 리 를 덤 프 메모리 라 고 합 니 다.
    더미 밖의 메모 리 는 메모리 제한 을 돌파 할 수 있다.
    4. 메모리 유출
    Node 는 메모리 유출 에 매우 민감 합 니 다. 온라인 응용 에 수천 수만 의 데이터 가 있 으 면 한 바이트 의 메모리 유출 도 쌓 일 수 있 습 니 다. 쓰레기 회수 과정 은 대상 스 캔 을 하 는 데 더 많은 시간 을 들 이 고 응용 응답 이 느 려 집 니 다. 프로 세 스 메모리 가 넘 치고 응용 이 무 너 질 때 까지.
    메모리 유출 원인:
  • 캐 시;
  • 대열 의 소비 가 제때에 이 루어 지지 않 는 다.
  • 작용 역 미 방출;

  • 4.1 메모 리 를 캐 시 로 사용 하지 않도록 주의
    캐 시 는 응용 에 있어 서 매우 중요 한 역할 을 하여 자원 을 효과적으로 절약 할 수 있다.캐 시 는 I / O 보다 접근 효율 이 높 고 캐 시 에 명중 하면 한 번 의 I / O 시간 을 절약 할 수 있 습 니 다.
    한 대상 이 캐 시 로 사용 되면 노대 에 상주 한 다 는 뜻 이다.캐 시 에 저 장 된 키 가 많 을 수록 장기 적 으로 살아 남 는 대상 도 많아 지고 쓰레기 수 거 는 스 캔 과 정 리 를 할 때 이 대상 들 을 헛 되 게 만 들 수 있다.
    JavaScript 개발 자 는 일반적으로 대상 의 키 쌍 으로 물건 을 캐 시 하 는 것 을 좋아 하지만, 이것 은 엄격 한 의미 의 캐 시 와 차이 가 있 습 니 다. 엄격 한 의미 의 캐 시 는 완벽 한 만 료 정책 을 가지 고 있 으 며, 일반 대상 의 키 쌍 은 그렇지 않 습 니 다.
    무의식 으로 인 한 메모리 유출 장면: memoize
    memoize 의 원 리 는 매개 변 수 를 키 로 캐 시 하고 메모리 공간 으로 CPU 실행 시간 을 바 꾸 는 것 입 니 다.
  • 캐 시 제한 정책 은 캐 시 에 있 는 대상 이 영원히 풀 수 없 는 문 제 를 해결 하기 위해 캐 시 의 무한 성장 을 제한 하 는 정책 을 추가 해 야 합 니 다.
  • 캐 시 솔 루 션 은 대량의 캐 시 를 어떻게 사용 하 는 지, 현재 비교적 좋 은 솔 루 션 은 프로 세 스 밖의 캐 시 를 사용 하고 프로 세 스 자체 가 저장 되 지 않 는 상태 입 니 다.외부 캐 시 소프트웨어 는 좋 은 캐 시 만 료 도태 정책 과 자체 메모리 관 리 를 가지 고 있 으 며 노드 프로 세 스 의 성능 에 영향 을 주지 않 습 니 다.Node 에서 주로 두 가지 문 제 를 해결 합 니 다.
  • 캐 시 를 외부 로 옮 겨 메모리 에 상주 하 는 대상 의 수 를 줄 이 고 쓰레기 수 거 를 더욱 효율 적 으로 한다.
  • 프로 세 스 간 에 캐 시 를 공유 할 수 있 습 니 다.

  •   ,         Redis Memcached。
    
    

    4.2 대기 열 상태 주목
    대부분의 응용 장면 에서 소비 속 도 는 생산 속도 보다 훨씬 크 고 메모리 유출 이 발생 하기 어렵다.하지만 소비 속도 가 생산 속도 보다 낮 으 면 축적 된다.
    표층 의 해결 방안 은 소비 속도 가 더 높 은 기술 로 바 꾸 는 것 이다.
    깊이 있 는 해결 방안 은 대기 열의 길 이 를 감시 하 는 것 이다.
    5. 메모리 유출 검사
    1.node-heapunp
    2.node-memwatch
    6. 메모리 활용
    Node 는 큰 파일 을 처리 하기 위해 stream 모듈 을 제공 합 니 다.

    좋은 웹페이지 즐겨찾기