동기 I/O 와 비동기 I/O 의 성능 차이 (부록: Node.js 는 좋을게 없다.)
한주의 마지막이네요. 항상 건강 유념하시고~ 주말에는 푹 쉬시고 햇볕도 받으며 적절한 운동하시길 바랍니다.이번 글은 남의 글 2개를 읽고 정리 및 가벼운 코멘트 해보았습니다. 경어가 아닌점 양해해 주십시요. (_._)
비동기와 동기 네트워킹 I/O 에 대한 성능차이
위의 링크 글을 읽어보면 대략 이렇다.
@ 사람이 증가할때의 초당처리율(QPS), 빨리응답해주는능력(Latency), CPU 사용율은 큰 차이 없다.
@ 메모리 사용율은 큰차이로 비동기가 좋다.
CPU 사용량 차이 - 거의 없다.
메모리 사용량 차이 - 심하다.
응답 빨리 해주는 차이 (낮을수록 좋음) - 별로 없다
얼마나 많은 처리를 할 수 있나 (높을수록 좋음) - 큰 차이 없다.
따라서 메모리를 적극적으로 사용해도 문제가 없다면 그냥 동기써라~ 훨씬 코드작성하기도 좋고 가독성도 좋다. 그러니깐 관리하기도 좋고 버그도 줄어들고 버그가 생겨도 더 명확하겠지~ 뭐 이런 내용이다.
나도 비동기를 나름 잘 안다고 생각하는데도 불구하고 거의 대부분의 소켓통신 코드는 동기통신으로 짠다. 즉 SELECT나 IOCP 류를 사용하지 않는 다는 말~ 같은 사람이 아래와 같은 글도 썼다.
Node.js 를 사용 할 이유가 없어요.
Node 를 쓸 필요가 없단다. 다른 좋은것들이 많기 때문에~~뭐 주로 성능 측면( 근데 성능비교를 boost.Asio 랑 해놓아서..좀) 에서 그렇게 바라보는거 같다.그리고 비동기코드가 가지고 있는 비 직관성 때문에~~
내 생각도 비슷하지만 사람들이 많이 사용하는 이유로는 프런트엔드랑 동일한 언어로 개발하는것 , 코드길이가 비교적 짧고, 단일 CPU서도 비교적 좋은 성능을 보인다고 볼 수도 있겠다. 덕분에 사용자층이 두텁다. 공개 모듈도 많고~
빨리 응답해주는 차이 (낮을수록 좋다)
얼마나 많은 처리를 할 수 있나 (높을수록 좋음)
@ 참고로 위의 boost.Asio 는 C++ 라이브러리이며 , 비동기도 사용하지 않은 결과이다.쩐다..
저 블로그 저자의 결론은 이렇다
Node.js 웹싸이트에서 머라고 선전하건 간에, 노드는 쉽게 사용하기 어렵고, 확장하기 어렵고 응답성도 낮은 편인데 노드를 왜 써? 그럼 무엇을 쓰냐고? 내가 생각하는것은 아래와 같아~
Great | C++, Rust |
Pretty Good | Java, C#, Scala, Go |
Meh | Ruby, Python |
Garbage | Javascript, PHP |
음 C++ 빠(단순 성능빠)인거 같은데.. (자바스크립트,노드를 안좋아하는 것에 있어선 나와 비슷함) 성능만으로 선택하기엔 웹개발 세계는 매우 다양한 요소가 버무려져 있다는 거라.... 다만 분명한것은 대부분의 경우 비동기에 목맬 필요는 없다는 것 정도?? 얻는 것보다 잃는게 훨씬 더 크니깐~~
p.s 참고로 저런 벤치마킹은 그냥 벤치마킹으로 받아드리면 된다. 맹신하지 말것이며 본인 스스로의 환경에서 중요 컨텍스트에 맞게 벤치마킹을 직접 해보는게 정확하다.