NodeJs 메모리 가 너무 높 은 테스트 실전 기록 을 차지 합 니 다.
온라인 용기 확장 으로 인 한 배 사 는 최종 적 으로 진정한 OOM 이 일 으 킨 것 이 아니 라 는 것 을 알 아 냈 지만 그 중의 배 사 과정 을 총괄 적 으로 기록 해 보 자.전체 과정 은 마치 사건 을 해결 하 는 것 처럼 한 걸음 한 걸음 실 마 리 를 찾 아 한 걸음 한 걸음 결 과 를 검증 해 냈 다.
이 일 을 하 는 의미 와 필요 성 은 개인 적 으로 몇 가지 가 있다 고 생각 합 니 다.
환경:텐 센트 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/298RES 에 더 관심 이 있 습 니 다.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 메모리 가 너무 높 은 내용 을 차지 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js를 AWS서버에서 사용하는 실습간단한 예제와 함께 AWS에서 Node.js를사용하는 법을 배워보도록 하겠다. 해당 github에 있는 레포지토리로 사용을 할 것이다. 3000번 포트로 Listen되는 예제이고 간단히 GET, POST, DELET...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.