일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- github
- effective
- NoSQL
- reactive
- javascript
- HTTP
- cache
- nodejs
- redis
- mybatis
- AWS
- 데이터통신
- r
- socket
- mongodb
- 네트워크
- ajax
- git
- Static
- Java
- reactor
- Linux
- libuv
- network
- spring
- Lombok
- VCS
- Heap
- html
- Elk
- Today
- Total
목록분류 전체보기 (187)
빨간색코딩
참조문서 : https://www.html5rocks.com/ko/tutorials/speed/static-mem-pools/1. 메모리 누수 원인nodejs는 v8엔진에서 GC를 주기적으로 수행한다. nodejs는 메모리관리가 불완전하고 어려운데, 그 이유는 GC역시 메인스레드(이벤트루프)에서 실행되기 때문이다. 따라서 메인스레드가 바쁜 작업(CPU인텐시브)을 돌릴 경우, 메모리는 급격히 증가하는데.. GC가 낄 틈새가 없는 것이다.2. 메모리 누수 해결방안이러한 메모리 누수를 피하려면 3가지 방법이 있다. 모두 다 이벤트루프를 고려한 프로그래밍이다.process.nextTick과 setTimeout을 활용하여 GC가 낄 틈새를 만들어주는 것이다.클로저와 스택의 빈번한 사용을 자제한다GC를 수동으로 이..
참조문서 : https://www.npmjs.com/package/mongoose-auto-increment시퀀스 넘버키를 편하게 쓸 수 있다. npm install mongoose-auto-increment 를 다운로드받는다.1. 연결const connection = mongoose.connect(....) autoIncrement.initialize(connection); 으로 연결한다. mongoose.connect의 콜백에 autoIncrement.initialize()를 넣으면 Error: mongoose-auto-increment has not been initialized 가 떨어진다.2. 시퀀스넘버 설정const logger = new Schema({..}) logger.plugin(aut..
참조문서 : http://mongoosejs.com/docs/guide.htmlMongoose는 MongoDB의 ODM(Object Data Mapping)으로 nodejs 모듈이다. ODM은 데이터베이스와 객체지향 프로그래밍 언어 사이 호환되지 않는 데이터를 변환하는 프로그래밍 기법을 말한다. 여기서는 4.11버전을 사용중이다.npm install mongoose 로 설치한다.1. mongodb VS mongoose자바로 생각하면 mongodb모듈은 JDBC드라이버고, mongoose는 Hibernate나 Mybatis같은 개념같다. 속도가 예민하다면 mongodb모듈을 쓰라고 말하고 있다.기본적으로 mongoose도 mongodb 모듈 위에서 동작하므로, mongodb의 모든 것을 사용할 수 있다.2..
노드에서 쓰레드를 추적할 일이 생겼다. man ps 으로 확인-e, -A : Select all processes.-L : Show threads, possibly with LWP and NLWP columns.-F : Set extra-full format; implies -f.고로 ps -Lef | grep node로 정보를 확인한다.LWP(Light Weight Process, is thread)는 thread의 IDNLWP(Number Light Weight Process)는 해당 프로세스에서 동작하고 있는 프로세스의 총 갯수 쓰레드가 잘 돌아가는 지는 strace 로 확인할 수 있다고 한다. strace는 애플리케이션들이 사용하는 system call과 signal 등을 추적해서 성능 저하를 일..
참조문서 : http://faq.hostway.co.kr/Linux_ETC/7179 ulimit는 프로세스의 자원 한도를 설정하는 명령으로, soft한도와 hard한도 두가지가 있다.soft : 새로운 프로그램을 생성하면 기본으로 적용되는 한도hard : 소프트한도에서 최대로 늘릴 수 있는 한도 apache와 같이 웹 서비스를 운영 시 동접자가 많은 경우 구동되는 apache 프로세스 수와 해당 프로세스가 처리하게되는 파일 수 또한 증가 하게 된다.ulimit [옵션] 값-a : 모든 제한 사항을 보여줌.-c : 최대 코어 파일 사이즈-d : 프로세스 데이터 세그먼트의 최대 크기-f : shell에 의해 만들어질 수 있는 파일의 최대 크기-s : 최대 스택 크기-p : 파이프 크기-n : 오픈 파일의 최..
참조문서 : https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/ 현재 날짜로 최신버전은 3.4.6이다. 설치할 OS는 CentOS 7이다. 몽고디비를 깔아보자1. 설치홈페이지에서 링크따와서 wget으로 친다. yum으로하면 다 잡아주니 편하겠지만 업데이트하면 버전땜에 골치아플까봐..wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.6.tgz tar zxvf mongodb-linux-x86_64-rhel70-3.4.6.tgz 2. 환경변수 설정환경변수를 잡아준다. /etc/profile에서 path잡고 source해준다.3. 실행실행전에 데이터쌓을 디렉터리를 만들어..
참조문서https://docs.mongodb.com/v3.4/https://velopert.com/mongodb-tutorial-list버전별로 명령어가 조금 바뀌는 것 같다. 나는 3.4버전이다. 자세한건 공식 API문서를 참고하자. MongoDB의 포함관계는 database > collections > documents 이다.1. database1-1. 생성use 데이터베이스명 으로 생성한다. 이미 있는 경우엔 현존하는 데이터베이스를 사용한다. 1개 이상의 Collection이 있어야 데이터베이스 리스트에서 보인다.1-2. 조회db : 현재 사용중인 데이터베이스 확인show dbs : 데이터베이스 리스트 확인db.stats() : 데이터베이스 상태확인1-3. 제거db.dropDatabase() 로 데..
참조문서 http://docs.libuv.org/en/latest/index.html http://nikhilm.github.io/uvbook/index.html nodejs의 핵심이 libuv가 아닐까한다. 여기에 이벤트루프와 쓰레드풀들이 모두 있다. 1. libuv가 무엇인가? libuv는 비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이다. 전통적으로 IO처리는 요청마다 스레드를 사용하는 방식이다. 하지만 libuv는 비동기, 논블로킹 스타일을 사용한다. 이를 이용하기 위해 각 커널의 비동기IO를 이용한다. 리눅스의 경우에는 커널 2.6부터 적용된 AIO가 있고 윈도우에는 IOCP가 있다. 운영체제의 비동기 이벤트는 libuv의 이벤트로 취급된다. 예를들어 파일쓰기가 끝났다고 한다면, libu..
참조문서 : https://docs.mongodb.com/ mongoDB는 C++로 짜여진 오픈소스 데이터베이스이다. 문서지향(Document-Oriented)적이며 뛰어난 확장성과 성능을 자랑한다. NoSQL이다. 1. RDB와 비교 RDBMS MongoDB Database Database Table Collection Tuple / Row Document Column Key / Field Table Join Embedded Documents Primary Key Primary Key (_id) 2. 특징과 장단점 2-1. 특징 Document-oriented storage : MongoDB는 database > collections > documents 구조로 document는 key-value형태의..
참조문서 : NoSQL을 여행하는 히치하이커를 위한 안내서 1. 개념 NoSQL은 Not Only SQL의 약자이다. 기본 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터베이스다. 릴레이션이 아니므로 고정된 스키마가 없고 조인이 힘들다. 빅데이터를 다룰 때, RDBMS로만 트래픽을 감당하기 어려워졌고, 이를 해결하려고 NoSQL이 탄생했다. NoSQL은 분산 환경에서 대용량의 데이터를 빠르게 처리하기 위해서 개발되었다. 핵심은 Horizontal Scalability(수평확장)과 High Availability(고가용성)이다. RDBMS의 한계 많은 데이터량과 데이터 처리량이 계속적으로 증가한다면 RDBMS는 아래와 같은 문제점을 만난다. 스키마 문제 : 빅데이터를 RDB의 스키마에 맞춰..
참조문서 : https://stackoverflow.com/questions/12296910/so-jsonp-or-cors 해당 참조문서는 12년도 글이라서 최신 브라우저일 경우 CORS를, 아니라면 JSONP를 사용하라고 권장하고 있지만, 이제는 대부분 CORS를 지원한다. ※ 브라우저 호환성표 CORS는 웹 표준 CORS는 크로스도메인을 해결하는 웹 표준이고, 보안상 권장되고 있다. JSONP는 script injection으로, GET밖에 지원안한다. CORS는 이와 대비되게 다양한 메소드를 허용하고 있다. 또한 JSONP는 http에서 https는 호출가능하지만, https에서 http는 호출이 불가능하다. This request has been blocked; the content must be..
참조문서 : http://docs.libuv.org/en/latest/threadpool.html 기본적으로 뒤에서 열심히 일하는 워커(IO작업 담당)들은 멀티쓰레드인데, 기본 크기가 4이다. 이는 최대 128까지 늘릴 수 있다. 특정 함수가 쓰레드풀을 사용할 때, libuv는 최대 쓰레드 수를 미리 할당해주는데, 이를 늘려주면 스레딩의 성능이 향상된다. 대신 메모리 오버헤드가 늘어난다. 따라서 적당한 크기의 쓰레드 수를 잡아주면 좋다. nodejs에서 워커 쓰레드의 수는 process.env.UV_THREADPOOL_SIZE 에서 제어할 수 있다. 그러나 동적으로 소스.js 레벨에서 제어할 수는 없다. (소스.js에서process.env.UV_THREADPOOL_SIZE=64 이런거 안된다.) 따라서 ..
참조문서 : https://blog.seotory.com/post/2016/04/understand-jsonp JSONP는 json with padding의 약자이다. 태그는 SOP 정책에 속하지 않는다는 점을 이용해, 서로 다른 도메인간의 javascript 호출을 위하여 jsonp가 사용되었다. 1. 원리 API서버에 데이터를 요청할 페이지에서 서버의 데이터를 받아 처리할 콜백 함수를 준비한다. 그 후에 script 태그를 생성하고 API서버에 request한다. 데이터 요청을 받은 서버에서는 콜백 함수를 실행하는 스크립트를 출력한다. 이 때 callback 함수의 인자에는 요청받은 데이터(기존 JSON)가 들어간다. 즉, 기존에 서버에서 {"key1" : "value1", "key2" : "valu..
참조문서 https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy https://developer.mozilla.org/ko/docs/Web/HTTP/Access\_control_CORS https://www.w3.org/Security/wiki/Same\_Origin_Policy 클라이언트단에서 해결 브라우저에서 옵션 변경 크롬 확장프로그램 플러그인 JSONP 서버단에서 해결 CORS 이외에도 document.domain 속성을 사용하는 방법, Cross-document messaging 등이 있다. 1. 동일 출처 정책(SOP) 만약 나의 API서버를 외부 웹 서비스에서 막 접근해서 가져다 쓴다면 문제가 있다. 따라서 이런 행위를 차..
참조문서https://www.html5rocks.com/ko/tutorials/speed/v8/https://github.com/v8/v8/wiki 자바스크립트 엔진은 javascript로 작성된 코드를 해석하고 실행하는 인터프리터다. js엔진은 브라우저 벤더별로 다양하다. Mozilla의 Monkey시리즈, 자바의 바이트코드로 컴파일해주는 Rhino, 구글 크롬의 V8, Safari의 JavascriptCore, Explorer의 Chakra 등이 있다. 여기서 nodejs는 구글의 V8 JavaScript 엔진을 기반으로 동작한다. 우리가 자주쓰는 크롬브라우저도 V8엔진을 쓴다. 성능좋은 코드를 위해 V8을 알아보자 1. Hidden Class로 빠른 프로퍼티 접근과 정적 룩업 다른 JavaScrip..