About This Site

이 사이트는 노드 기술을 공유하는 사이트로 하루프레스를 기반으로 구축되었습니다.

contributors

Rhio Kim
@rhiokim


리오: "아직 공유되지 않는 발표자료가 있어 정리되지 않는 부분도 있습니다. 공유되는 데로 업데이트할 예정입니다."

DTrace, Node.js, and Flame Graphs

Dave Pacheco 는 Joyent 사의 소프트웨어 엔지니어로 있으며 최근까지 프로덕션 레벨의 노드를 위한 런타임 프로파일링과 postmortem 디버깅 도구를 구축하였고 노드의 모듈 의존성을 해결하기 위한 shrinkwrap 패키지 관리 구조를 만들었습니다.

이 발표에서는 DTrace 를 이용한 프로덕션 레벨의 노드 프로파일링에 대해 이야기를 하고 있습니다. 이 발표는 지난 4월에 블로그에 작성한 노드 프로파일링의 내용을 자세히 소개하고 있습니다.

DTrace(Dynamic Trace : 동적 추적)은 썬 마이크로 시스템즈가 개발한 솔라리스 100 및 OpenSolaris, Mac OS X, FreeBSD 에 탑재된 로우레벨 단에서의 시스템 정보를 추적하는 기능입니다. 또한 프로세스내에서 특정 함수가 호출되면서 전달되는 인수와 그에 대한 로그, 특정 파일에 액세스 하는 프로세스의 목록과 같은 보다 세밀한 정보를 추적할 수 있습니다. 노드에서는 Dtrace 를 사용하여 노드 프로세스의 메모리 사용량, CPU 타임, 파일시스템, 네트워크 리소스등의 정보를 수집하고 콜 스택의 트레이싱을 완벽에 가깝게 분석할 수 있는 유용한 도구이다.


Read more...

리오: "아직 공유되지 않는 발표자료가 있어 정리되지 않는 부분도 있습니다. 공유되는 데로 업데이트할 예정입니다.

Influences of Node

Ryan Dahl 는 노드 창시자이고 현재 joyent 에서 다른 일을 진행하며 노드에 계속 기여하고 있습니다.

이번 발표에서는 노드의 탄생 배경에 대해서 매우 자세히 설명해주고 있습니다. PT 자료를 보면 라이언은 웹 사이트 구축을 위해 꾀 오랜 시간동안 다양한 시도와 연구를 해온 흔적들을 모두 확인할 수 있습니다.

노드 탄생은 2004년 11월 10일 뉴욕의 로체스터에서 토폴로지 를 연구하며 Ph.D로 있던 라이언이 졸업 학점을 우수하게 받고나서의 공허감(PQS: Post-Quals Slump)을 느끼고 있던 끝에 클라우드를 통해 노드(토폴로지에서 말하는 노드)간에 통신할 수 있는 방법을 밝혀내기 위해 시작하게 되었습니다. 이 때부터 루비를 배우기 시작했고 새로운 HTML 템플릿 엔진도 개발했다고 합니다.

그러던 중 Ruby on Rails 와 PHP 를 주로 하는 Engine Yard 라는 회사와 HAProxy 와 유사한 Nginx 로드 밸런서를 구축하기 위해 풀 타임으로 일을하게 되고 개인의 연구 결과를 증명하기 위해 시작된 결과가 노드가 탄생하게 되었습니다.

그렇게 연구의 결과를 증명하기 위해 레일즈로 구현체를 만들던 중 레일즈의 한계를 느껴 새로운 시도를 하게 되었고 결국 자바스크립트의 싱글 쓰레드 방식으로 진행하게 되었습니다.

2009-01-26. Cologne. The result is what every system admin knows intuitively: Rails gets worse over time if loaded down with connections. The culprit is most likely MRI’s crappy thread implementation. While Rails serves 1 request, 29 threads are there sitting idle sucking up resources. livejournal

노드는 아래의 기술에 많은 영향을 받았다고 합니다.


Read more...

노드에서 모듈은 굉장히 중요한 역할을 하고 NPM은 에코 시스템으로 노드가 탄생한 이후 노드 플랫폼의 성장에 가장 큰 영향을 주었습니다. 다른 오픈 소스 프로젝트에 비해 급속도로 발전하였고 이 글을 작성하는 시점에서 노드 모듈은 114,000 여개가 등록되고 있습니다.

잘 만들어진 모듈든은 노드 프로젝트에서 굉장히 유용하게 사용되고 또한 새로운 모듈을 만드는데 중요한 역할을 하는 모듈들이 굉장히 많습니다. 이 글에서는 모듈의 의존성이 가장 높은 Top 10 에 대한 소개를 합니다.

(아래 모듈 의존성 정보는 글을 작성하는 시점을 기준으로 하기 때문에 언제든지 변할 수 있습니다. 정확한 정보는 여기 에서 확인하세요.)

underscore

underscore

  • 의존성 : 1035
  • 사이트 : http://documentcloud.github.com/underscore/
  • 소개 : underscore 는 자바스크립트 MVC 프레임웍으로 잘 알려진 백본(backbone.js) 의 코어 라이브러리입니다. 객체 지향 자바스크립트를 위한 핵심중의 핵심만을 잘 추려 구현되어 노드에서 뿐만아니라 클라이언트측 자바스크립트 라이브러리로도 굉장히 잘 알려져 있습니다.

Read more...

Node.js 0.8.0 에서는 v8 및 플랫폼 추상화 라이브러리인 "libuv" 에 많은 노력을 기울여 속도가 크게 개선되었다고 합니다. Node.js 블로그에 공개한 테스트 결과에 따르면 파일 I/O 에서 2 ~ 3배 정도의 성능향상을 보이며 웹 서버의 처리량을 향상시키고 있습니다.

오픈 소스의 가장 중요한 에코시스템인 모듈 시스템이라고 할 수 있습니다.

노드 창시자인 라이언(@ry)은 0.6 버젼 이후 [NPM][npm] 개발자인 아이작(@issac) 에게 넘어가면서 좀더 완벽한 시스템으로 발전해왔습니다. 이번 v0.8 의 주된 목표인 플랫폼 호환성을 향상시키기 위해 파이썬에 의존하던 WafGYP 을 구현한 node-gyp 로 전환하되었습니다.

GYP 는 'Generate Your Projects' 의 약자로 Visual Studio, XCode, SCons 등에서 크롬 프로젝트의 빌드 파일을 생성하기 위한 플랫폼에 독립적인 포맷입니다.

이와 더불어 향후 버젼에서는 기존의 [NPM][npm]]모듈도 npm install module 이 아닌 node install module 형태로 변경하는 작업 진행중에 있습니다. 이번 릴리즈를 통해 노드는 좀더 쉽고 좀더 빠르고 좀더 넓은 플랫폼에서 기존의 솔루션들과 경쟁할 수 있게 되었습니다.


Read more...

더 이상 지원하지 않는

  • http.Client()
  • path {exists, existsSync} 는 fs {exists, existsSync} 로 변경되었습니다.
  • tty.setRawMode (mode) 는 tty.ReadStream # setRawMode() (즉 process.stdin.setRawMode() )로 변경되었습니다.
  • ev_ * 및 eio_ * 함수를 직접 사용하는 것은 권장하지 않습니다. 대신 libuv 가 제공하는 함수를 사용하십시오.
  • eiocustom 에서 uvqueue_work 로 마이그레이션 방법은wiki 페이지 를 참조하십시오.

제거된

  • waf 빌드 시스템 - node.js 은 gyp 를 사용하게 되었습니다.
    • 네이티브 모듈의 저자 경우 즉시 node-gyp 로 마이그레이션 하십시오!
  • require ('sys') 는 예외를 throw 합니다. require('util') 를 사용하십시오. "sys"는 node v0.4에서 deprecated되었습니다.
  • process.installPrefix 삭제되었습니다. ( #3483 ) process.installPrefix 은 v0.6에서는 항상 undefined 입니다.
  • node-vars 삭제되었습니다 ( #3483 ) node-vars 는 v0.6에서는 항상 빈 문자열을 반환했습니다.

Waf 는 python 기반의 메타 빌드 시스템으로 노드 네이티브 모듈을 빌드하기 위해서 사용되어 왔다.

변경된

  • process

    • process.stdin.on('keypress') 내부 API에 기본적으로 생성되지 않습니다.
    • process.stdin.pipe(dest) 가 자동으로 process.stdin.resume() 를 호출합니다.
  • cluster

    • cluster.fork() 은 더 이상 child_process.fork() 가 반환한 개체를 반환하지 않습니다. 그것이 필요하면 cluster.fork().process 를 사용하십시오.
    • cluster 개체 'death' 이벤트는 'exit' 로 변경되었습니다.
    • kill() 메서드는 destroy() 로 변경되었습니다.
    • CLUSTER_WORKER_ID 환경 변수 CLUSTER_UNIQUE_ID 로 변경되었습니다. 이것만 사용해야 하는 것은 아닙니다.
    • worker는 마스터와의 연결이 문제로 인해 유실되면 자신을 종료합니다.

Read more...