우연히 NGinX 에 대해 잠시 접할 기회가 생겼다.


물론 이제는 조금씩 블로그에 포워딩이 될 듯 하고 나 또한 이번 기회에 견문을 넓힐 수 있는 기회가 되었으면 좋겠다.

(이정해 과장님 감사요..!!)


아래는 나무위키에서 소개하는 내용이다.



2002년부터 러시아의 프로그래머 이고르 시쇼브(Игорь Сысоев)가 Apache(아파치)를 코딩하다 Apache의 C10K 문제[1]를 보고 이를 극복하면서 네이티브 Win32환경에도 돌아갈 무설치 웹 서버 프로그램에 대한 개발을 시작하여 2004년 스푸트니크 1호 발사일에 발표한 오픈소스 서버 프로그램. 현재 이고르 시쇼브와 그가 설립한 회사인 Nginx Inc.가 이 프로젝트를 운영중에 있다. 목표는 가벼우면서도 강력한 프로그램이라고... HTTP와 리버스 프록시, IMAP/POP3등의 서버를 구동가능하다. 


읽을때는 엔진엑스라고 읽는다. 역사가 그렇게까진 오래되진 않아서 점유율 면에서 Apache에게 많이 밀린다. 하지만 신규서비스를 중심으로 점유율에 가속이 붙는 중이며, 이미 Apache가 여러가지면에 한계를 많이 보였으므로 특별히 큰 사유가 없다면 nginx로 갈아타는 추세다. 다만 확장 모듈이 Apache에 비해 적다는 것이 흠인데, 어차피 Apache의 이 많은 확장 모듈을 제대로 쓰는 사람은 드물다. 오히려 쓰지도 않으면서 괜히 덕지덕지 리소스만 낭비하는 모듈이 대부분이다. 따라서 호환성 확인 후 별다른 문제가 없다면 Nginx로 갈아타는 것이 현추세. 이미 필수적인 모듈은 Nginx에도 존재하고 그중 몇개는 Apache보다 50배 이상 빠르다(...) 마이크로소프트에게는 GUI관리가 쉬운 IIS에 밀리지만, 이쪽은 취향과 돈의 문제라서 1:1 비교가 힘들다.


구조적으로는 Apache에서 사용하는 스레드/프로세스 기반 구조 대신 비동기 이벤트 기반 구조를 가진다. 이로 인해서 서버 부하시 성능 예측이 쉽다. 덤으로 이로 인하여 10000개의 동시 접속을 하면 그 10000개에 드는 메모리 점유는 2.5MB다(....) 사용하는 리눅스 웹서버의 경우 LAMP(Linux + Apache + MySQL + PHP or Python or Perl)대신 LEMP를 쓴다. Nginx는 여러 서드파티 기능들(SSL, GeoIP등)을 모듈로 덧 붙이는 방식을 쓰고 있으며, 그래서 모듈을 쓰지 않을 경우 제외해 놓을 수 있다, 단, 소스 컴파일시 모듈을 추가하지 않으면, 그 이후에 추가가 안되지만...


Nginx는 현재 HTTP/2.0을 발빠르게 지원하려고 하고 있다. 아마 HTTP/2.0 보급화를 계기로 콩라인 획득(2등 위치)을 목표로 하는 듯하다. 그동안 콩라인은 IIS. 


Nginx를 사용하면서 conf 설정[2]을 바꿀때는 재시작 할필요 없이 reload를 하면 된다. 즉, 프로세스를 재시작 할 필요가 없다는 점이 있다.


넷크래프트의 2013년 1월 웹서버 조사에서, 조사한 사이트중 점유율 3위를 차지[3]하였으며, 아마존닷컴 웹 서비스(AWS)에서는 44%이상의 점유율로 1위, 활동적인 웹 서버중 3위[4]를 차지했으며, 이 속도라면 잘 나가는 사이트쪽에선 콩라인 획득 가능할듯 보여진다.

출처 : https://namu.wiki/w/Nginx#fn-6



다음은 NGinX 에 대한 설명해주는 곳이다.

앞으로 여기서 참고하면서 설치 및 간단한 예제를 만들어 볼 예정이다.


https://opentutorials.org/module/384/3462


그리고 여기는 간단하게 Apach와 NGINX 에서 php 사용 벤치 마크한 소개글이다

http://www.theorganicagency.com/blog/apache-vs-nginx-performance-comparison/


출처 : http://www.theorganicagency.com/blog/apache-vs-nginx-performance-comparison/


더 많은 정보는 아래에서 확인해 보면 좋을 듯 싶다.


http://openwiki.kr/tech/nginx


http://dkatlf900.tistory.com/32


http://blog.grotesq.com/post/414

반응형

'NGINX' 카테고리의 다른 글

[NGINX] php 연동 (Access denied.) & mysql 연동  (0) 2016.08.12
[NGinx] 설치 간단 정리  (0) 2016.08.05

점검하면서 쿼리를 작성 중 재밌는 일이 생겨서 공유해 본다.


select gender from employees group by gender;

select distinct(gender) from employees;


둘 다 gender의 상태(??갑자기 설명이 안되네;;;) 를 확인하기 위해서 동료가 group by로 작성하는 것을 보았다.


순간...왜 저렇게 해야되는 걸까? 간단하게 distinct 를 하면 되지 않느냐로 내가 질문하면서 궁금해서 찾아보게 되었다.


난 성능적인 차이가 더 궁금해서 찾아본 결과 다음과 같이 확인할 수 있었다.


동일한 로직을 이용하기에 성능의 차이는 없을 거지만,

group by는 정렬를 하기에 distinct가 조금 더 성능적으로 빠르다.


라는 결과를 얻을 수 있었다.

하지만 이거는 어디까지나 사람들의 의견만 보았다.


그래서 간단하게 테스트를 아래와 같이 진행 하였다.

아직 MySQL 의 쿼리 튜닝할 정도의 실력이 아니기에..간단하게 explain 으로 확인 하였다.



보는바와 같이 동일한 건수를 참조하며, 마지막에 Using filesort 라는 것을 확인할 수 있다.


Using filesort


쿼리에 ORDER BY가 포함되어있는 경우 DBMS 내부적으로 sort를 한다.(MySQL의 경우 퀵소트 알고리즘을 사용)

소트를 처리하기 위해서 메모리공간을 사용하며, 메모리가 부족할 경우 임시파일을 사용한다.

(임시파일은 HDD등의 저장장치에 생성되며 PC에서 가장 느린 성능을 보여주는 부분이다. 

-> 결과적으로 EXPLAIN시 Extra필드에 Using filesort가 표시된다면 이는 파일을 사용할 가능성이 크다는 것이며, 

가장 느린성능을 보여줄것이다.)


하지만 인덱스 순으로 행을 fetch할수 있으면 Filesort는 필요없게된다. 

이런경우 당연히 Extra필드에도 Using Filesort가 표시되지 않는다.

ORDER BY 구문에 인덱스가 사용되도록 쿼리나 테이블을 튜닝하자.


여기까지는 하나의 테이블에서 ORDER BY를 사용한 경우이다.


2개 이상의 테이블을 JOIN해야 하며 결과는 정렬되어 있어야 하는경우엔 어떻게 될까?

이경우엔 3가지 유형이 있다.


1. 첫 테이블을 인덱스를 이용하여 정렬하고, JOIN하는 경우

2. 첫 테이블을 FileSort해서 Join하는 경우 -> Using filesort

3. JOIN후 Filesort하는 경우(JOIN한 결과는 인덱스가 없으므로 JOIN후 Sort할때는 항상 Filesort이다.) -> Using Temporary, Using filesort

 

뒤로 갈수록 처리가 무거워 지므로 1,2번의 실행계획이 잡히도록 유도하는 것이 좋다.

1번을 유도하는 방법 -> WHERE절의 검색조건과 ORDER BY절의 소트조건을 하나의 테이블에 집중시킨다.

출처 : http://blog.daum.net/billbo/11


비록 적은 중복값에 대해서는 차이가 없을지 모르겠으나 그 값이 많아 진다면 group by로 해서 확인하는 것은 부하를 줄 수도 있을 것 같다.


자세한 Filesort 내용은 아래의 위치에서 확인해 보자

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22505&cat1=827&cat2=963&cat3=980&lang=k


sort를 하는 부분은 tmep를 사용하기에 가급적 sort할 필요가 없다면 distinct 를 사용해서 확인하는 것이 좋을 듯 싶다.


오랜만에 아키텍처까지 한번 더 볼 수 있는 좋은 기회였다.


반응형

Bin Log가 쌓이게 되면 디스크가 증가하기에 이에 대해서 방안을 파이썬으로 지우는 스크립트를 분석하면서

이와 관련된 블로그 찾아서 포워딩해 본다


우리 회사에서는 아래와 같은 쿼리를 사용한다


PURGE MASTER LOGS TO '%s'


%s 에는 binlog의 번호를 확인한다.(파일에서 ls 로 확인)


하지만 서버에서도 확인이 가능하다.


show master logs;


알아서 정렬되어 나오며, 특정 번호를 선정하면 그 하위 번호까지 모두 삭제가 된다.


ex) mysql> purge master logs to 'mysql-bin.001000';

지정된 바이너리 로그 이하의 파일이 삭제됨.
mysql-bin.000001~0000999 까지 삭제됨.


참조 : http://www.ischo.net/mysql/2875


  MySQL Binary Log 는 add, delete, insert, update 등의 query 가 저장되어 있는 파일로서 MySQL 을  설치하게 되면 기본적으로 MySQL Binary Log 가 생성됩니다.
 Binary Log 를 쌓지 않아도 되는 MySQL 구동 환경에서는 Binary Log 를 삭제하므로, 디스크 공간
 여유 공간을 확보할 수 있는데, MySQL Binary Log 를 지우는 방법에 대해서 알아보겠습니다.

1. MySQL Replication 환경에서 지우기

  - MySQL Replication MASTER 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

  - MySQL Replication SLAVE 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

2. MySQL Binary Log sequence number 또는 특정 일자로 지우기

  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS TO 'mysql-bin.000015';
  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS BEFORE '2009-05-01 00:00:00';

3. mysqladmin flush-logs 명령어를 통해서 MySQL Binary Log 지우기

   shell> mysqladmin -u root -p flush-logs

4. MySQL Binary Log 생성을 방지하는 방법

  /etc/my.cnf 파일에서 아래 라인을 주석 처리
  log-bin

5. MySQL Binary Log 를 특정 1주일까지만 생성 및 보관하기
  /etc/my.cnf 파일에서 아래 라인을 추가

  expire_logs_days = 7


출처 : http://faq.hostway.co.kr/Linux_DB/1307

반응형

+ Recent posts