← All writing
Development

section 7 part 2

아니 개 복잡하잖아 실제로 프로덕션 들어가면 더 복잡하고 더 방대할거 아니야 아니?

대용량 buffer

  • 거대 버퍼 무단 할당 서버 환경 제약
  • 1 기가 바이트 10억 바이트 1e9 exponent지수 0이 9개
  • 스케일 컨트롤 서버증설: 스케일 아웃
  • 코드 상 버퍼 생성은 가상공간이 아니라 물리적인 램을 점유하는 것
  • 자바스크립트 데이터는 v8엔진으 메모리 제한 1.4기가바이트 내외
  • 하지만, 버퍼는 off heap memory
  • 운영 체제의 순수 빈 공간을 직접 사용

OOM Out of memory crash

  • 필수 여유공간 headroom을 20~30%
  • buffer.fill() 내장 method, js 엔진 표면이 아닌 내부 C++레벨에서 동작
  • fill method 역시 main thread를 멈춰 세우는 동기 sync작업, anti pattern
  • c++ 함수로 작업 처리 시간을 극단적으로 압축
  • 병목으 ㅣ최소화 -> 정상상태로 즉각 복귀
  • node.js buffer alloc의 상한선 4gb(32bit)

allocUnsafe()

  • 메모리 초기화 과정 완전 생략
  • 0으로 지우는 수고 없이 날 것 그대로 던져줌
  • 메모리 노출 취약점 memory disclosure vulnerability
  • chunk 대용량 데이터으 실시간 전송 조각
  • allocUnsafe사용시 빈 공간 반환을 치명적 데이터 유출을 초래
  • 메모리 초기화& system call의 생략 CPU 자원확보
  • allocUnsafe가 진짜 빠른 이유는 node.js의 캐싱 시스템 buffer pool
  • node를 실행하는 그 순간 로우레벨 최적화를 위해 8KiB를 가지게 됨
  • CS의 미세한 계산단위, 로우레벨에서 중요
  • Pooling 자원을 매번 생성하지 않고 떼어다 재사용하는 기법 buffer.poolsize
  • system call mode switch 모드 전환과 컨텍스트 스위칭 유발
  • user mode -> kernel mode mode switch발생, context switching의 시작
  • 하드웨어를 제어하기 위해서는 kernel 모드로 진입을 해야 함
  • 커널 모드란 운영체제만 들어가는 물리적 하드웨어 통제 구역
  • 유저모드를 멈추고 커널모드로 진입하는 system call
  • allocUnsafe를 사용하면 버퍼 풀에서 필요한 만큼 즉시 잘라낸다.
  • 버퍼 풀을 사용하려면 요구크기가 풀 사이즈의 전체 절반보다 작아야만 한다.
  • bitwise right shift 비트 이동 연산자 오른쪽으로 한칸 밀어서 버림

  • 모든 비트가 이동하면 값은 정확히 절반이 됨.
  • 물리적 회로 레벨의 처리 방식이기 때문에 수학 연산보다 훨씬 빠르다.

allocUnsafeSlow()

  • 메모리 풀에서 사용하지 않고 운영체제에 새로운 메모리를 요구한다.
  • memory fragmentation 메모리 단편화
  • 작지만 서버가 죽을 때까지 수명이 엄청나게 긴 데이터를 다룰 때 일부러 공용 버퍼 풀을 건드리지 않는다.

스트림

  • 쉴새없이 데이터를 주고받은 msa에서 유일한 운반 보관함 버퍼
  • 스트림이란 유연한 처리, 무중단 흐름
  • stream wrapper includes buffer chunks
  • http req/res역시 stream itself
  • packets 네트워크 유입 buffer 버퍼 재조립 stream 스트림을 통해 외부로
  • serialization 직렬화
  • 운영체제의 램 안에서 바로 사용가능한 c++ 레벨의 연속된 메모리 공간 버퍼
  • big endian BE , little Endian LE
  • .byteLength 는 메모리가 점유한 바이트 수를 계산
  • zero copy architecture .subarray() 주소만 옮겨서 읽는 기법
  • .copy()는 원본에는 타격이 없음
  • SIMD Single Instruction Multi Data 단일 명령 다중 데이터 처리
  • 매직넘버: png 이미지는 89 50 4E 47로 시작
  • buffer 에서 웹 표준 blob Binary Large Object 이진 대형 객체

소감

  • 미션 하는데 너무 헷갈렸다.
  • 실제 코딩 예제로 보면 생각보다 헷갈린다. 특히 변화과정 같은 것들은 케이스가 다양하기 때문에
  • 많은 것들을 할 수 있을 것 같긴 한데 지금은 그래서 이게 언제 어디 쓰이는지
  • 그리고 컴퓨터에서 물리적으로 어떻게 작동하는 건지는 좀 헷갈림
  • os kernel ram dma? cpu register v8 worker thread 등등 nodejs와 컴퓨터 자체의 개념들이 함께 돌아가는 게 굉장히 헷갈려서 클로드랑 챗지피티한테 모르는 게 생길 때마다 물리적으로 어떤 일이 일어나서 어디로 전달되서 결과적으로 코드가 실행되는 부품은 어디서 영향을 받고 그런 것들을 물어보고 있음.