웹 어플리케이션 성능 향상을 위한 주요 튜닝 항목으로는 시스템, DB, 어플리케이션, 웹 서버 등이 있다.
웹 서버 시스템의 주요 튜닝 포인트는 OS 최적화, 캐시 설정, WAS 성능 개선 등 이다.
어플리케이션 측면의 성능 향상을 위해 살펴볼 것은, 잘못된 어플리케이션 아키텍처, 불필요한 트랜잭션이나 서버와의 통신, 복잡한 비효율적인 데이터 처리, 복잡한 뷰의 구성이 있다.
DB 의 경우에는 잘못 설계된 데이터 모델, 인덱스의 부재 및 비효율적인 사용, Lock-Intention, 잘못된 SQL 쿼리문, 불필요한 트리거 등을 살펴봐야 한다.
웹 어플리케이션의 성능 향상을 위해 위의 튜닝 요소들에 대한 작업을 했음에도 고객들이 성능에 대해 불만을 재기할 수 있다.
데이터 대비 네트워크 대역폭이 충분하지 않거나, 클라이언트 PC 의 성능이 낮다면, 위의 튜닝으로 이 문제를 해결하기가 힘들다.
특히, 우리나라의 경우 외국의 웹 어플리케이션에 비해 컨텐츠가 매우 무거운 편이다.
그래서, 모바일 환경 같이 인터넷 속도가 느리고, 데스크톱 PC 에 비해 성능이 좋지 않은 환경에서는 이러한 문제가 부각될 수 밖에 없다.
이런 문제를 HTTP 1.1 스펙에서는 HTTP 압축 관련 헤더인 Accept – Encoding, Content – Encoding 등을 정의함으로써,
고객은 빠른 HTTP 응답 속도를 기대할 수 있으나, 웹 서버의 부하 증가가 발생하므로 고려할 요소가 많다.
충분한 대역폭을 가진 클라이언트가 주로 접속하는 웹 어플리케이션에서는 HTTP 압축이 오버헤드만 발생할 뿐이다.
또한, 이미지 등 이미 압축이 된 파일의 경우, 만족스러운 압축율을 얻을 수 없다.(해상도)
그러므로, 일반적으로 HTML, XML, 스크립트 등 텍스트 컨텐츠에 대해 압축을 수행하는 것이 좋다.
HTTP 압축은 두 개의 HTTP 헤더 필드에 의해 작동한다.
앞서 설명했듯이, HTTP 헤더 값인 Accept-Encoding, Content-Encoding 을 통해 클라이언트와 서버가 압축 수행여부와 압축 알고리즘을 설정한다.
Accept-Encoding 은 클라이언트가 압축된 컨텐츠를 받아서 압축을 해제할 수 있는 압축 알고리즘을 서버에 알리는 용도로 사용한다.
클라이언트가 HTTP 요청 헤더에서 Accept-Encoding 값을 “gzip, deflate” 로 보내면,
서버는 저 둘중 하나의 알고리즘으로 HTTP 압축을 수행해서 Content-Encoding 헤더에 명시하여 HTTP 응답을 보낸다.
이러한 HTTP 압축이 수행되는 것을 Fiddler 를 통해 테스트할 수 있다.
Composer 탭에서 Request Header 를 정의할 때, Accept-Encoding 을 설정해서 요청을 보내면,
응답 헤더에서 위와 같은 원리로 Content-Encoding 을 받는다.
물론, Accept-Encoding 값을 정의하지 않고 요청을 보내면, Content-Encoding 값도 빈값으로 온다.
또한, 클라이언트가 Accept-Encoding 값을 보냈더라도, 서버 측에서 압축을 구현하지 않았다면,
클라이언트는 Contents-Encoding 값을 받지 않으며 압축이 되지 않은 응답을 받는다.
보통 텍스트 컨텐츠에 대한 압축은 gzip 압축 포맷을 사용한다.
gzip 은 국제 표준으로 등록된 (RFC1952) 무료 압축 포맷이다. 그만큼 많이 사용하며, 성능도 우수하다.
그 외에 deflate, sdch 이라는 압축 포맷도 있지만, gzip 에 비해서 주목 받진 않는다.
웹 서버에 압축을 구현하는 방법으로는 시스템, 어플리케이션 두가지 측면에서 볼 수 있다.
Reverse Proxy 단에서 주요 웹 서버인 nginx, apache 에 모듈을 적용해주는 방법이 있다.
nginx 는 ngx_http_gzip_module 을 제공하고, apache 또한 mod_gzip 을 제공한다.
어플리케이션 단에서의 구현은 response body 에 대해 gzip 으로 압축하고, 응답 헤더를 설정하는 방법 이다.
자바에서는 GZIPOutputStream, GZIPInputStream 이라는 gzip 을 다루는 클래스를 제공한다.
'IT기술 > 시스템' 카테고리의 다른 글
디스크에서 포멧이란? (0) | 2022.11.27 |
---|---|
서버 전원 시퀀스 (0) | 2022.11.27 |
개인정보 처리방침 / 이용약관 작성 방법 (0) | 2021.09.02 |
http 헤더 / 요청 헤더, 응답 헤더 (0) | 2018.10.31 |
오류 0x80070571: 디스크 구조가 손상되었기 때문에 읽을 수 없습니다. (0) | 2018.10.06 |