NodeJs 메모리 가 너무 높 은 테스트 실전 기록 을 차지 합 니 다.

16968 단어 nodejs메모리
머리말
온라인 용기 확장 으로 인 한 배 사 는 최종 적 으로 진정한 OOM 이 일 으 킨 것 이 아니 라 는 것 을 알 아 냈 지만 그 중의 배 사 과정 을 총괄 적 으로 기록 해 보 자.전체 과정 은 마치 사건 을 해결 하 는 것 처럼 한 걸음 한 걸음 실 마 리 를 찾 아 한 걸음 한 걸음 결 과 를 검증 해 냈 다.
이 일 을 하 는 의미 와 필요 성 은 개인 적 으로 몇 가지 가 있다 고 생각 합 니 다.
  • 프로그래머 의 측면 에서 볼 때 코드 의 극치 를 추구 하고 문 제 를 놓 치지 않 으 며 업무 의 안정성 을 확보 해 야 한다
  • 4.567917.자원 측면 에서 볼 때 의미 없 는 자원 비용 을 낮 추기 위해 서 이다4.567917.회사 의 측면 에서 볼 때 서버 의 원 가 를 낮 추고 회사 에 돈 을 절약 합 니 다.
    환경:텐 센트 Taf 플랫폼 에서 실행 되 는 NodeJs 서비스.
    문제 의 발단
    처음에는 정시 기능 이 출시 된 후 온라인 용기 가 자동 으로 확장 되 었 기 때 문 입 니 다.NodeJs 서비스 자체 가 인터페이스 조회 와 socket.io 의 기능 만 있 기 때문에 데이터 가 많 지 않 고 높 지 않 은 서 비 스 는 8 개의 용기(한 용기 가 2G 의 메모리 로 나 뉘 어 져 있 음)를 확대 해 야 하기 때문에 메모리 누 출 이 의심 되 었 습 니 다.동시에 로그 에서 우연히 메모리 가 부족 합 니 다.

    확장 원인
    운 웨 이 학생 에 게 물 어 보 니 메모리 가 임계값 을 차지 해서 생 긴 확장 이라는 것 을 알 수 있 었 다.
    부하 상황
    우선 서비스 스트레스 로 인 한 메모리 점용 이 높 아 지 는 것 은 정상 적 인 업무 현상 일 수 있 습 니 다.

    모니터링 을 통 해 데이터 와 CPU 의 점용 이 높 지 않 고 심지어 매우 낮다 고 할 수 있다.그러면 이렇게 높 은 메모리 의 점용 은 비정상적인 현상 에 속한다.
    메모리 원인 으로 인 한 것 이 고 점차적으로 상승 하 는 현상 이 있 기 때문에 메모리 누 출 방향 을 연상 시 킵 니 다.자주 사용 하 는 방법 은'스냅 샷 쌓 기'즉 hepsnapshot 파일 을 인쇄 하 는 것 입 니 다.
    용기 에 들 어가 기:
    go 노드 이름
    NodeJs 프로젝트 의 폴 더 로 들 어가 기
    /usr/local/app/taf/service_name/bin/src
    스냅 샷 생 성:
    
    const heapdump = require('heapdump');
    heapdump.writeSnapshot('./' + new Date().getTime() + '.heapsnapshot', function(err, filename) {
        console.log('dump written to', filename);
    });
    
    용기 내 에서 lrzsz 명령 을 사용 하여 파일 을 직접 전송 하 는 것 이 느 리 기 때문에 scp 명령 을 사용 하여 정적 자원 서버 에 전송 해 야 하 며 브 라 우 저 를 통 해 다운로드 할 수 있 습 니 다.
    scp 1620374489828.heapsnapshot username@ip:/data/static/snapshot
    대비 hepsnapshot
    서비스 가 시 작 된 후 한 동안 실 행 된 후 두 번 의 스냅 샷 내용 을 생 성 하 는 것 과 비교 한 정렬 도 웹 socket Socket 이라는 키워드 만 볼 수 있 습 니 다.

    더 전개 해도 어떤 함수 로 인 한 것 인지 찾 을 수 없습니다.

    스냅 샷 에서 단 서 를 찾 을 수 없 을 것 같 습 니 다.전체 공정 의 업 무량 코드 가 그리 크 지 않 기 때문에 한 줄 한 줄 리 뷰 를 통 해 검 사 를 합 니 다.그러나 이상 한 작성 방법 도 oom 을 일 으 키 지 않 는 것 같 습 니 다.사실 업무 코드 가 작 아서 좋 습 니 다.큰 공정 이 라면 이런 방법 은 가격 비교 가 되 지 않 습 니 다.아니면 일부 진단 수단 을 통 해 검 사 를 해 야 합 니 다.코드 리 뷰 를 직접 가 는 게 아니 라
    스냅 샷 을 몇 번 반복 해서 인쇄 했 습 니 다.몇 번 을 본 후에 웹 소켓 이라는 글 자 를 보 았 습 니까?그래서 socket 링크 가 풀 리 지 않 아서 생 긴 문제 인지 고려 했 습 니까?
    Google 키 워드 를 찾 아 보 았 습 니 다WebSocket memory leak있 네요.해결 방안 은 permessage Deflate 를 추가 하여 압축 을 사용 하지 않 는 것 입 니 다.현재 낮은 버 전의 socket-io 는 기본적으로 열 려 있 습 니 다.그래서 저 는 추가 한 후에 한동안 메모리 사용량 을 관찰 했 습 니 다.뚜렷 한 하락 이 없 었 습 니 다.발표 후에 도 메모리 사용량 이 높 았 습 니 다.
    설정 문법:
    require('socket.io').listen(server, {perMessageDeflate: false});
    클 라 이언 트 가 보 낸 요청 에 이 필드 가 포함 되 어 있 습 니 다:

    우선 이 매개 변 수 는 데 이 터 를 압축 하 는 데 사 용 됩 니 다.client 단 은 기본적으로 열 려 있 습 니 다.server 단 은 닫 혀 있 습 니 다.어떤 이유 로 열 리 면 메모리 와 성능 의 소 모 를 초래 할 수 있 습 니 다.공식 적 인 제안 은 고려 한 후에 열 릴 지 여 부 를 결정 하 는 것 입 니 다.그러나 낮은 버 전의 socket-io 는 켜 져 있 습 니 다.예 를 들 어^2.3.0 버 전(bug 인 것 같 습 니 다.후속 버 전 은 기본 으로 닫 혔 습 니 다).
    The extension is disabled by default on the server and enabled by default on the client. It adds a significant overhead in terms of performance and memory consumption so we suggest to enable it only if it is really needed.
    https://github.com/socketio/socket.io/issues/3477#issuecomment-610265035
    오픈 후 메모리 가 여전히 높 아 지지 않 습 니 다.

    console.log
    또 다른 현상 은 기 존의 Node 서비스 가 로 그 를 인쇄 하고 인터넷 에 있 는 NodeJs 메모리 가 누 출 된 글 을 뒤 져 서 console 로그 출력 으로 인 한 누 출 을 보 았 기 때문에 console 에 주석 을 달 고 메모리 점용 을 계속 관찰 한 결과 메모리 가 높 은 것 으로 나 타 났 다.
    단서 가 여기까지 오 면 끊 어 질 것 같 아서 두서 가 없다.
    로그
    하루 가 지나 자 본의 아니 게 로그 파일 을 보 았 습 니 다.서비스 가 시 작 될 때 시작 로 그 를 인쇄 하기 때문에 중복 출력 이 있 는 것 을 발 견 했 습 니 다.

    중복 실행 상황 을 설명 합 니 다.이 추측 을 검증 하기 위해 top 명령 으로 봅 니 다.
    TOP 명령
    구체 적 인 메모리 점용 도 보고 싶 습 니 다.이렇게 많은 worker process 가 있 는 것 을 발 견 했 습 니 다.현재 업무 의 실제 사용 상황 에 따라 2~4 개 만 있 으 면 되 지 않 겠 습 니까?왜 이렇게 많은 하위 프로 세 스 를 열 어야 합 니까?
    
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                       
     90359 username       20   0  736m  38m  14m S  0.0  0.0   0:07.30 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90346 username       20   0  864m  38m  14m S  0.3  0.0   0:07.08 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90381 username       20   0  730m  38m  14m S  0.3  0.0   0:08.75 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90366 username       20   0  804m  37m  14m S  0.0  0.0   0:06.94 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90618 username       20   0  730m  37m  14m S  0.0  0.0   0:08.42 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90326 username       20   0  736m  37m  14m S  0.0  0.0   0:08.46 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90542 username       20   0  736m  37m  14m S  0.0  0.0   0:08.85 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90332 username       20   0  799m  37m  14m S  0.0  0.0   0:07.32 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90580 username       20   0  732m  37m  14m S  0.3  0.0   0:08.94 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90602 username       20   0  731m  37m  14m S  0.3  0.0   0:08.33 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90587 username       20   0  735m  37m  14m S  0.0  0.0   0:08.83 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90568 username       20   0  731m  37m  14m S  0.0  0.0   0:08.83 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90544 username       20   0  729m  37m  14m S  0.0  0.0   0:09.07 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90556 username       20   0  729m  37m  14m S  0.0  0.0   0:08.82 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90431 username       20   0  735m  37m  14m S  0.0  0.0   0:08.29 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90486 username       20   0  729m  37m  14m S  0.0  0.0   0:09.06 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90516 username       20   0  735m  37m  14m S  0.0  0.0   0:08.95 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90465 username       20   0  729m  37m  14m S  0.0  0.0   0:09.06 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90527 username       20   0  735m  37m  14m S  0.0  0.0   0:08.46 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90487 username       20   0  732m  37m  14m S  0.3  0.0   0:08.48 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90371 username       20   0  731m  37m  14m S  0.3  0.0   0:08.75 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90423 username       20   0  729m  36m  14m S  0.3  0.0   0:08.09 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90402 username       20   0  729m  36m  14m S  0.3  0.0   0:08.96 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90500 username       20   0  729m  36m  14m S  0.0  0.0   0:08.70 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90353 username       20   0  729m  36m  14m S  0.3  0.0   0:08.95 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90636 username       20   0  729m  36m  14m S  0.0  0.0   0:08.84 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90425 username       20   0  732m  36m  14m S  0.0  0.0   0:08.78 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90506 username       20   0  729m  36m  14m S  0.0  0.0   0:08.84 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90589 username       20   0  729m  36m  14m S  0.3  0.0   0:09.05 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90595 username       20   0  729m  36m  14m S  0.0  0.0   0:09.03 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90450 username       20   0  729m  36m  14m S  0.3  0.0   0:08.97 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90531 username       20   0  729m  36m  14m S  0.0  0.0   0:08.99 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90509 username       20   0  735m  36m  14m S  0.0  0.0   0:08.67 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90612 username       20   0  730m  36m  14m S  0.3  0.0   0:08.84 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90479 username       20   0  729m  36m  14m S  0.0  0.0   0:08.58 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90609 username       20   0  731m  36m  14m S  0.3  0.0   0:09.23 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90404 username       20   0  734m  36m  14m S  0.3  0.0   0:08.78 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90395 username       20   0  736m  36m  14m S  0.0  0.0   0:08.57 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90444 username       20   0  729m  36m  14m S  0.0  0.0   0:09.04 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90438 username       20   0  729m  36m  14m S  0.3  0.0   0:07.78 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90340 username       20   0  736m  36m  14m S  0.3  0.0   0:07.37 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90333 username       20   0  729m  36m  14m S  0.0  0.0   0:07.60 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90563 username       20   0  735m  36m  14m S  0.3  0.0   0:08.93 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90565 username       20   0  734m  36m  14m S  0.3  0.0   0:08.77 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90457 username       20   0  735m  36m  14m S  0.0  0.0   0:08.31 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90387 username       20   0  740m  36m  14m S  0.0  0.0   0:07.59 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90573 username       20   0  728m  35m  14m S  0.0  0.0   0:09.06 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90472 username       20   0  728m  35m  14m S  0.0  0.0   0:08.94 /usr/local/app/service_name/bin/src/index.js: worker process                                                      
     90313 username       20   0  588m  27m  13m S  0.0  0.0   0:00.46 /usr/local/app/service_name/bin/src/index.js: master process
    
    %MEM 이라는 열의 수 치 는 용기 내부 에서 구체 적 인 메모리 사용량 을 볼 수 없 기 때문에 모두 0.0 으로 표시 되 어 있 기 때문에 VIRT,RES,SHR 세 개의 값 을 볼 필요 가 있 습 니 다.그들의 의 미 는 여기 서 볼 수 있 습 니 다.https://www.orchome.com/298
    RES 에 더 관심 이 있 습 니 다.RES 의 의 미 는 프로 세 스 가상 메모리 공간 에 물리 적 메모리 공간 이 비 친 부분의 크기 를 말 합 니 다.따라서 하나의 worker process 가 35~38M 사이 의 메모리 크기 를 차지 하고 모두 48 개의 worker process,하나의 master process 가 있 음 을 알 수 있 습 니 다.
    워 커 프로 세 스 48 개 어떻게 왔어요?CPU 의 논리 개 수 를 조회 해 보면 확실히 48 개다.
    
    #     =   CPU   X     CPU    
    #    CPU  =   CPU   X     CPU    X     
    
    #     CPU  
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    
    #       CPU core   (   )
    cat /proc/cpuinfo| grep "cpu cores"| uniq
    
    #     CPU   
    cat /proc/cpuinfo| grep "processor"| wc -l
    
    
    제어 프로 세 스 수
    Taf 플랫폼 에 대해 잘 모 르 기 때문에 taf 에서 NodeJS 를 실행 하려 면 해당 하 는 package:@tars/node-agent 가 필요 하 다 는 것 을 알 게 되 었 습 니 다.홈 페이지 의 사용 문 서 를 찾 아 보 았 습 니 다.https://tarscloud.github.io/TarsDocs/dev/tars.js/tars-node-agent.html
    인 스 턴 스 를 대표 하 는-i 설정 이 있 습 니 다.
    -i, Cinstances
    node-agent 는 Node.js 원생 의  Cluster모듈 로 부하 균형 을 실현 한다.
    이 설정 가능  node-agent 가 시작 하 는 하위 프로 세 스(업무 프로 세 스)수량:
    설정 되 지 않 음  auto,0)시작 하 는 하위 프로 세 스 의 수 는 다음 과 같 습 니 다.  CPU 물리 핵심 개수.
    설정  max,시작 하 는 하위 프로 세 스 수 는 CPU 개수(모든 핵심 수)와 같 습 니 다.
    하면,만약,만약...  node-agent  tarsnode 가 시작 하면 TARS 프로필 에서 자동 으로 읽 습 니 다.  tars.application.client.asyncthread 설정 절.
    통과  TARS 플랫폼->편집 서비스->비동기 스 레 드 수 를 조정 합 니 다.
    https://tarscloud.github.io/TarsDocs/dev/tars.js/tars-node-agent.html
    이 package 를 통 해 Taf 의 NodeJs 서 비 스 를 시작 하고 부하 균형 을 맞 추 는 능력 을 시작 합 니 다.구체 적 인 하위 프로 세 스(업무 프로 세 스)수량 을 설정 하지 않 았 기 때문에 기본 값 은 CPU 물리 핵심 개 수 를 사 용 했 습 니 다.cpu 2 개 이기 때문에*2,총 48 개의 메모 리 를 생 성 했 습 니 다.♂️,모든 worker process 는 메모 리 를 사용 해 야 하기 때문에 메모리 사용량 이 계속 높 습 니 다.
    "개인 템 플 릿"에서 설정 을 수정 할 수 있 습 니 다:

    그리고 서 비 스 를 다시 시작 하고 메모리 사용량 을 확인 합 니 다.

    이 를 통 해 worker process 수량 이 메모리 점용 에 영향 을 미 쳤 음 을 알 수 있 습 니 다.원래 메모리 사용률 의 추세 도 는 지속 적 으로 증가 할 것 입 니 다(처음에 도 메모리 누 출 이 의심 되 었 습 니 다).이 문 제 는 worker process 를 낮 춘 후에 나타 나 지 않 았 습 니 다.현 재 는 무시 하고 추 후 지속 적 으로 관찰 할 것 입 니 다.
    중복 콘 솔 과 워 커 프로 세 스 의 관 계 를 검증 하기 위해 워 커 프로 세 스 2 개 를 연 상태 에서 로 그 를 보 니 2 번 인쇄 된 것 이 확실 합 니 다.

    총결산
    이번 문 제 를 다시 한 번 말씀 드 리 겠 습 니 다.
    왜 제때에 발견 하지 못 했 습 니까?
    전단 개발 자의 역할 과 일정한 관계 가 있 을 수 있 으 며 백 엔 드 서비스의 일부 특성 에 민감 하지 않 습 니 다.관심 을 갖 지 않 거나 모른다,모른다.
    미리 피 할 수 있 습 니까?
    비슷 한 경고 체 제 를 통 해 Node 서비스의 메모리 가 상승 추 세 를 알 릴 수 있 습 니 다.저 는 아직 Taf 플랫폼 의 기능 에 익숙 하지 않 고 나중에 모색 해 보 겠 습 니 다.
    NodeJs 메모리 가 너무 높 은 검색 을 차지 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 NodeJs 메모리 가 너무 높 은 내용 을 차지 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기