검색결과 리스트
오픈소스에 해당되는 글 1건
- 2015.07.19 XE 성능을 100배 향상시키는 속도 패치
https://github.com/xpressengine/xe-core/pull/1598
XE는 느리다는 악평이 많은 편입니다. XE는 여러가지 현대적인 프레임워크 형태이면서 트리거, 애드온 위젯 등등의 여러 인터페이스를 통해서 확장이 가능한 형태이고, 이러한 확장성때문에 느리다고 하더라도 많은 불만이 있지는 않은 것 같습니다.
그러나 XE는 몇가지만 고치더라도 클라우드플레어나 varnish 캐서서버 혹은 nginx 리버스 프록시 캐시서버를 통해서 그 성능을 획기적으로 향상시킬 수 있습니다. 그것도 아주 간단한 패치를 하는 것 만으로 이러한 성능향상이 가능합니다.
그것은 다름아닌 캐시서버의 적중률을 방해하는 대표적인 요소인 Set-Cookie: 헤더를 최소화 하는 것입니다.
Set-Cookie:헤더는 세션이 시작되는 경우 및 쿠키를 설정하는 경우에 설정이 됩니다. 웹 서비스를 하게되면 대부분의 사용자는 로그인사용자가 아닌 익명의 사용자이고, 로봇등에 의해서 상당량의 접속이 있게됩니다. 이러한 상당수의 익명의 클라이언트의 경우 세션을 세팅하지 않거나 쿠키 헤더를 쓰지 않는것 만으로도 캐시서버의 적중률을 높일 수 있습니다.
XE의 경우에도 session_start()
가 무조건적으로 호출되고 있습니다. 이 경우 Set-Cookie:PHPSESSID=... 쿠키가 설정이 되며 varnish 캐시서버가 효율적으로 작동하지 않게 됩니다. 아래는 varnish 캐서서버 + XE + nginix (php5-fpm) 설정을 한 서버에 XE를 설치한 후에 살펴본 헤더입니다.
$ curl -I http://localhost/
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Cache-Control: public, must-revalidate, post-check=0, pre-check=0
Set-Cookie: PHPSESSID=1g12hp22q8r0ojbjog7seaft26; path=/
Accept-Ranges: bytes
Date: Thu, 09 Jul 2015 00:54:35 GMT
X-Varnish: 1471733958
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Backend-Server: nginx/1.4.x (Ubuntu)
Server: nginx/1.4.x (Ubuntu)
X-Cache-Hit: MISS
위에서 보는바와 같이 varnish 캐시서버에서 캐시가 미스가 되고 있습니다.
ab 벤치마크입니다. 1000회를, 동시에 3개 요청하는 경우입니다. 상당히 느리고 이것이 현재 XE를 nginx + varnish 캐시서버로 운용할때의 대략적 성능입니다. (혹은 단순히 nginx 혹은 아파치 웹서버만 운용하는 경우)
$ ab -n 1000 -c 3 http://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
....
Requests per second: 74.85 [#/sec] (mean)
Time per request: 40.079 [ms] (mean)
Time per request: 13.360 [ms] (mean, across all concurrent requests)
Transfer rate: 2533.88 [Kbytes/sec] received
...
그러면 이번에는 XE 성능을 100배 향상시키는 속도 패치를 적용한 후에 테스트를 해보겠습니다. 즉 session_start()
가 기본적으로 호출이 안되고 Set-Cookie
헤더가 붙지 않게 되며, 캐시 적중률이 올라가게 됩니다.
$ curl -I http://localhost/
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Cache-Control: public, must-revalidate, post-check=0, pre-check=0
X-Backend-Status: normal
Date: Thu, 09 Jul 2015 00:59:14 GMT
X-Varnish: 1471735403 1471735392
Age: 6
Via: 1.1 varnish
Connection: keep-alive
X-Backend-Server: nginx/1.4.x (Ubuntu)
Server: nginx/1.4.x (Ubuntu)
X-Cache-Hit: HIT
(몇차례 curl -I
를 실행하면 Cache-Hit
가 HIT
상태임을 나타내고 있습니다.)
ab 벤치마크 측정
$ ab -n 1000 -c 3 http://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
....
Requests per second: 8018.35 [#/sec] (mean)
Time per request: 0.374 [ms] (mean)
Time per request: 0.125 [ms] (mean, across all concurrent requests)
Transfer rate: 269428.95 [Kbytes/sec] received
...
8000 RPS로 아파치 벤치값으로 비교하여 무려 ~100배가 향상되었습니다.
동시에 200개 요청을 하고 20000회 요청을 해면 다음과 같습니다.
$ ab -n 20000 -c 200 http://localhost/
...
Requests per second: 14025.98 [#/sec] (mean)
Time per request: 14.259 [ms] (mean)
Time per request: 0.071 [ms] (mean, across all concurrent requests)
Transfer rate: 473883.72 [Kbytes/sec] received
무려 14000 RPS나 나옵니다. 초당 470MB/s
동시에 500개 요청을 해도 결과는 비슷합니다. (ab -n 20000 -c 500)
더 놀라운 것은 시스템의 부하 상태입니다. (ab -n 20000 -c 500을 처리하고 난 이후)
$ w
10:04:25 up xx days, 17:28, x user, load average: 0.25, 0.19, 0.18
그러면 nginx만의 성능은 어떨까요 ? ab -n 10000 -c 50 http://localhost:8000/
1만회 50개 요청을 동시에 해보았습니다.
$ ab -n 10000 -c 50 http://localhost:8000/ (ngix가 8000 포트로 설정되어 있음)
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
....
Requests per second: 106.64 [#/sec] (mean)
Time per request: 468.850 [ms] (mean)
Time per request: 9.377 [ms] (mean, across all concurrent requests)
Transfer rate: 3570.91 [Kbytes/sec] received
....
~100RPS 수준이고 3MB/s 밖에 안나옵니다.
그리고 시스템 부하상태입니다.
$ w
10:09:01 up xx days, 17:33, x user, load average: 3.64, 1.45, 0.63
현재 이 패치는 https://github.com/xpressengine/xe-core/pull/1598 PR로 등록되어 있으며 반영되기를 기다리고 있습니다. 또한 XE 포럼에도 글을 등록하였습니다. https://www.xpressengine.com/forum/23040664
XE3 개발때문인지 그다지 반응이 시근둥한 편입니다만 많은 관심가져주시기 바랍니다~
참고로 현재 이 패치는 리그베다위키 BBS에 적용되어 운용중입니다.
그누보드5 성능 향상 패치 (캐시 친화적 패치) (0) | 2015.07.19 |
---|---|
10분 안에 PHP 확장 모듈 만들기 (0) | 2015.05.02 |
XE 게시판용 위키 링크 및 URL 매핑 애드온 (2) | 2013.05.10 |
RECENT COMMENT