메뉴 건너뛰기

서버/호스팅

휘즈 2018.04.05 08:41
조회 수 : 2692

1. 개요

웹사이트의 속도에 영향을 미치는 것은 크게 3가지로 나눌 수 있다.

  1. 네트워크 속도
  2. 프론트앤드
  3. 백앤드

이중 웹사이트의 속도에 가장 큰 영향을 미치는 것은 네트워크 속도이며 그다음 프론트앤드 그리고 백앤드 부분입니다.
네트워크 속도가 아무리 빨라도 현재까지는 cpu속도를 따라갈 수 없습니다.
프론트앤드, 즉, 웹페이지 용량을 작게, 요청건수를 적게 하라는 이유는 결국 네트워크 속도와 TCP통신의 특성 때문에 웹사이트 속도에 큰 영향을 미치기 때문입니다. 

실제로 아파치는 웹사이트 속도와 거의 관련이 없으며 웹페이지가 사용자의 브라우저에 로드될 때 아주 작은 팩터일 뿐이고
서버측 처리시간의 대부분은 php와 mysql에서 소비됩니다. 
아파치에서 최고의 성능 조정은 mod_expires와 같은 것을 사용하여 이미지, 비디오, css파일 등 정적 파일을 브라우저에 캐싱하는 것입니다. 그외에는 성능 향상을 위한 획기적인 것은 없습니다.

사이트별로 다르겠지만 아래 차트에서 보듯(이 차트는 wiki.mikejung.biz에서 New Relic의 무료서비스를 이용해 측정한 것이다.)  하루 중 유휴 시간 중 웹페이지 응답시간이 100ms(0.1초)가 소요되고 그중에 php가 68ms, mysql이 10ms 소요되었습니다.
아파치를 10배 빠르게 최적화한들 1~2ms 단축시킬 뿐이다. 이 예에서 로딩시간이 길어지는 때는 mysql이 바쁠 때입니다.
php는 Mysql과 통신하기 때문에 php가 실행을 완료할 수 있는 시간은 Mysql 속도에 달려 있습니다. php와 mysql이 통신을 하는 과정에 아파치는 관련이 없습니다. 게다가 아파치는 속도향상에 영향도 거의 없습니다.
Mysql처리속도가 빨라야 php실행이 빨라지고 아파치가 빠른 응답을 할 수 있게되는 것입니다.
따라서 Mysql튜닝이 가장 중요하며 그 다음 php부분입니다. 사실 mysql튜닝이 끝나면 웹서버 튜닝이 끝났다고 해도 과언이 아닙니다.

Wiki_app_response_time.png

<출처 : https://wiki.mikejung.biz/Apache >

이 예의 100ms는 아피치가 http요청을 처리한 시간과 php가 fcgi를 통해 mysql과 대화한 후 아파치에 다시 보내고 다시 브라우저로 전송하는 시간을 포함하고 있다.
여기까지가 서버에서 응답을 생성하는 걸리는 시간이고 브라우저에서 페이지를 로드하는데 걸리는 시간을 살펴보기로 한다.

Wiki_page_load_time.png

<출처 : https://wiki.mikejung.biz/Apache >

위 차트에서 보듯 페이지를 로드하는 시간은 매우 다를 수 있지만 페이지를 완전히 로드하는데 대략 평균 3초정도 걸린 것을 알 수 있습니다.
100ms와 3초, 일반적으로 웹사이트의 응답 속도와 관련하여 서버측 처리는 웹사이트 성능에 큰 요인은 아닌 것을 알 수 있습니다.

2. 아파치 

웹서버 성능에 가장 큰 영향을 주는 것은 메모리입니다. 스왑은 요청당 지연시간을 사용자가 "왜 이렇게 느려"라고 생각할 정도로 늘리기때문에 웹서버는 스왑을 하면 안됩니다.
느려지면 사용자는 정지하고 다시 접속하여 부하가 계속 증가하는 악순환에 빠지될 가능성이 있습니다.
MaxRequestWorkers(MaxClients) 지시어를 조절하여 웹서버가 스왑을 할 정도로 많은 자식을 만들지 않도록 해야 합니다. 

운영체제는 보통 각자 알아서 선택할 일이지만. 그러나 일반적으로 유용하다고 판명된 몇가지 지침이 있습니다.
선택한 운영체제의 최신 안정 버전과 패치를 실행합니다. 대부분 운영체제가 최근 TCP 스택과 쓰레드 라이브러리에 많은 속도향상을 했기 때문에 최신 OS를 사용해야합니다.
하드웨어를 최신제품으로 또는 부품을 추가하는데에는 비용이 들지만,
신 OS나 응용프로그램은 사용하는 것은 비용이 들지 않기 때문에 최신 제품을 사용하지 않는 것이 오히려 이상하다 하겠습니다.

아파치의 경우 2.4 최신버전의 event mpm과 php-fpm을 사용합니다.
apache 2.4는  event mpm, php-fpm에서 최적화되므로 별다른 노력없이 최상의 결과를 얻을 수 있고,또한 event mpm은 적은양의 메모리를 사용하므로 더 많은 프로세스를 생성할 수 있습니다.

Apache DirectoryIndex 우선순위 튜닝

XE를 포함하여 대부분의 cms가 대부분 디렉토리 인덱스를 index,php를 사용하는데, 만일 Apache DirectoryIndex가 다음과 같이 설정되어 있다면

DirectoryIndex index.html.var index.htm index.html index.shtml index.xhtml index.wml index.perl index.pl index.plx index.ppl index.cgi index.jsp index.js index.jp index.php4 index. php3 index.phtml default.htm default.html home.htm index.php5 Default.html Default.htm home.html index.php

아파치는 일치하는 항목을 찾을 때까지 검색을 합니다.
위와 같이 설정되어 있다면 매번 20가지 유형을 검색하게됩니다. 
사용하지 않는 유형은 제거하고 사용하는 index.html 또는 index.php를 목록 맨앞에 위치하도록합니다.

Apache Threads 와 Processes

프로세스는 스레드보다 빠르지만 메모리에 제한이 됩니다.
스레드는 프로세스에 적제된 라이브러리를 공유하므로 메모리를 적게 사용합니다.
동접수를 늘리고자 할 때 프로세스를 늘리는 것 보다는 스레드 수를 늘리도록 합니다.

Apache MPM

현재 아파치는 3개의 MPM이 있습니다.

  • Prefork : 각 자식 프로세스는 한 번에 하나의 연결 만 처리합니다. 이는 오랫동안 Apache의 기본 MPM이었습니다.
  • Worker : 각각 여러 스레드가있는 여러 하위 프로세스를 사용합니다.
  • Event : 처리 속도를 높이고 동시에 처리의 일부를 지원 스레드로 전달하여 주 스레드가 더 많은 요청을 수용 할 수있게 유지하도록 설계되었습니다.

Prefork는 각 요청을 격리하므로 non-thread-libraries 호환성을 확보하기 위한 MPM입니다.
하지만 프로세스별로 메모리 사용량이 많으므로 현재의 웹환경에서는 특별한 경우를 제외하고는 사용할 이유가 별로없습니다.

Worker는 다중 프로세스 다중 스레드 서버를 구현합니다. 
프로세스 기반 서버보다 적은 서버자원으로 많은 수의 요청을 처리할 수 있습니다. 
하지만 기능이 보다 향상된 event MPM이 있으므로 Worker를 사용해야할 이유도 별로 없습니다.

Event는 요청을 처리하기 위해 스레드를 사용합니다. 소량의 메모리를 사용하여 많은 요청을 처리할 수 있으므로 트레픽이 많은 사이트에 적합합니다.
다만 php는 스레드에 안전하지 않으므로 프로세스에 적재할 수 없어 php-fpm을 사용해야 합니다.

3. Mysql

mysql 스토리지 엔진은 innodb를 사용합니다.

InnoDB : InnoDB는 transaction-safe 하며, 커밋과 롤백, 그리고 데이터 복구 기능을 제공하므로 데이터를 효과적으로 보호 할 수 있습니다. InnoDB는 기본적으로 row-level locking 제공하며, 또한 데이터를 clustered index에 저장하여 PK 기반의 query의 I/O 비용을 줄입니다. 또한 FK 제약을 제공하여 데이터 무결성을 보장합니다.

MyISAM : 트랜잭션을 지원하지 않고 table-level locking을 제공한다. 따라서 multi-thread 환경에서 성능이 저하 될 수 있습니다. 특정 세션이 테이블을 변경하는 동안 테이블 단위로 lock이 잡히기 때문입니다.

cpu 와 memory

mysql만 놓고 보면 cpu성능 보다는 memory양이 더 중요합니다.
빠른 웹사이트를 원한다면 데이타베이스 전부를 메모리에 올려 놓아야합니다.
데이타베이스가 1G라면 mysql에 최소 1G 이상 메모리를 할당해야 합니다. 이것은 비용이 드는 것이지만 mysql성능을 향상시키는데 가장 중요한 것입니다. 서버에 충분한 메모리가 없다면 my.cnf 설정과 관계없이 성능은 저하됩니다. 

만일 충분한 메모리를 확보할 수 없다면 빠른 하드디스크라도 확보하는 것이 좋습니다.

   

 

사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )