포럼
XE성능 100배 올리는 패치
2015.07.09 12:17
https://github.com/xpressengine/xe-core/pull/1598
XE + varnish 캐시서버 + nginx/아파치 웹서버 세팅으로 기존의 XE속도를 100배까지 올리는 패치입니다.
간단한 벤치마크 결과로 100배~200배 성능의 향상이 있지만, 이는 물론 실제 운용의 성능 향상과 거리가 있을 수 있습니다. 다만 위 글에서 밝힌 내용에 따르면 varnish와 같이 사용할 경우에 현실적으로 XE 속도의 몇배의 향상은 가능하리라 생각됩니다.
- 서버 부하 최소화. 서버비 절약.
- 클라우드플레어를 단독 혹은 varnish와 같이 사용 가능하며, DDoS 방어능력 업
- Dom컨텐츠 로딩 타임 단축. 체감 성능 향상.
많은 관심 부탁드리겠습니다~
Varnish 캐시서버 + XE(+패치) + nginx(혹은 아파치) 성능은 위의 링크를 참조하시기 바랍니다. 이어지는 내용은 nginx 리버스 프록시 캐시 성능에 대한 추가적인 내용입니다. (이 글의 덧글로 올라온 질문에 대한 답변)
nginx reverse proxy cache + XE + 아파치 성능 테스트
- nginx 세팅은
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment; # 쿠키가 있으면 캐싱 안함 proxy_cache_valid 200 5s; # 5초간 캐싱. 이 값이 너무 크면 페이지가 제때에 갱신이 안되니 주의
패치 적용하지 않는 경우
Requests per second: 169.03 [#/sec] (mean)
Time per request: 177.487 [ms] (mean)
Time per request: 5.916 [ms] (mean, across all concurrent requests)
Transfer rate: 3503.33 [Kbytes/sec] received
패치를 적용하면
$ ab -n 1000 -c 30 http://localhost/
...
Requests per second: 3488.28 [#/sec] (mean)
Time per request: 8.600 [ms] (mean)
Time per request: 0.287 [ms] (mean, across all concurrent requests)
Transfer rate: 71305.82 [Kbytes/sec] received
...
$ ab -n 10000 -c 100 http://localhost/
Requests per second: 12813.79 [#/sec] (mean)
Time per request: 7.804 [ms] (mean)
Time per request: 0.078 [ms] (mean, across all concurrent requests)
Transfer rate: 261932.47 [Kbytes/sec] received
$ w
14:43:52 up xx days, 22:07, x user, load average: 0.23, 0.25, 0.24
댓글 31
-
다미아빠
2015.07.09 12:50
-
wkp
2015.07.09 13:16
http://helloworld.naver.com/helloworld/textyle/352076 문서를 참고하시기 바랍니다~
XE를 사용할 때에는 특별히 설정할 것이 없습니다.
웹서버 포트를 80=>8080 등으로 바꾸고 vanish 캐시서버의 포트을 80으로 바꿔주면 됩니다. 여기에 IP주소가 127.0.0.1로 나오지 않게 하려면 remoteip 아파치 모듈을 추가로 설정해주어야 하구요
-
Luatic™
2015.07.09 14:02
비슷하게 엔진엑스를 아파치의 캐시서버로 쓸 경우는 적용이 힘들겠군요 동일한 방식으로 셋팅을 하니깐요,, 기존 엔진엑스+아파치+vanish캐시 가 된다면 대박일듯 싶네요 근데 어차피 엑진엑스와 역활이 같으니 성능이 그리 대박날지는 모르겠습니다.
-
wkp
2015.07.09 18:12
nginx cache 서버 세팅을 제가 직접 해봤습니다. 이것이 세팅의 잘못인지 거의 효과가 없더군요. 시간 날때 다시 해볼 작정입니다. 혹시 잘 알고계시는 문서가 있다면 알려주시기 바랍니다. 우분투 환경인데 이상하게 작동을 제대로 안하네요.
-
wkp
2015.07.11 14:47
nginx 리버스 캐시 프록시 테스트 결과를 올렸습니다~ Varnish와 마찬가지로 성능향상이 있습니다~
단 nginx의 경우 세팅을 미세하게 조절해야 하네요. varnish는 설정을 거의 건드리지 않고 기본 설정으로 성능의 향상을 볼 수 있습니다.
-
Luatic™
2015.07.12 11:04
XE공홈에 개발자나 개인 서버 사용자뿐만 아니라 현역 호스팅 관계자분들도 많이 있는걸로 압니다. 즉 이글을 보는이가 여러분류란 말이지요 여러가지 환경을 생각 글을 올리셧다면 반응이 더 좋았을지도 모르겠습니다. 허나 지금은 단지 개인서버 사용자들을 위한 글로 보여질수 있겠습니다.
-
wkp
2015.07.09 13:19
그리고 이 패치는 varnish 캐시서버뿐만 아니라 클라우드플레어를 사용해도 비슷한 효과를 볼 수 있다는 것을 의미합니다.
-
socialskyo
2015.07.09 14:31
뭔가 대단한 내용이네요.... XE에 새로운 길이 열리나요??
@wkp 님 저도 서버는 잘몰라서, 호스팅 사용자가 클라우드플레어를 적용하고 저 패치를 적용해도 지금보다 빨라질까요?
원래 클라우드 플레어가 트래픽을 줄이는거지 속도 향상에는 그리 도움이 안된다고 들었는데요..
-
Luatic™
2015.07.09 14:58
클플은 어차피 엣지서버의 영향이 큽니다.
-
wkp
2015.07.09 18:07
캐시를 쓰니 서버 부하가 떨어지고, 성능에도 도움이 될 수 있지요. 이 패치는 쿠키 헤더를 최소화 해서 캐시 적중률을 높여주는 패치입니다.
-
銀童
2015.07.09 14:40
varnish 를 XE 에 적용하고자 하는 시도는 분명 흥미로운 일입니다만,
한창 git 에서도 토론이 이루어지고 있지만, 큰 기대를 할만한 내용은 아닌것이
varnish 라는건 결국 페이지 자체를 캐싱하는건데, 대부분의 사이트들이 게시판 위주로 이루어져있는 XE 환경에서
게시판 글 조회수 1개만 변해도 어차피 새롭게 만들어야하는 varnish 적용이 전체 XE 에 일괄적으로 적용될 일일까 싶습니다.
결국 사이트 특성에 맞게 써야하는 부분이 되는건데, 그런걸 XE 가 기본적으로 제공해주거나, 혹은 이것만 제공하면 XE 성능 100배 올린다! 라고 말하긴 어렵지 않을까 싶습니다.
-
wkp
2015.07.09 18:09
넵 본문에 이미 써있습니다. 100배는 어렵겠지만 적어도 몇배의 향상은 있을것입니다. 특히나 서버의 접속률이 높아지만 서버의 부하가 최소화되기때문에 서버 자체의 성능이 떨어지는 것을 막을 수 있게 되겠지요.
-
후하니
2015.07.09 17:56
nginx fastcgi cache 쓰는거랑 별반 차이가 없는것 같아보이는데..
-
wkp
2015.07.09 18:10
ngix fastcgi reverse proxy cache 등등의 세팅을 제가 해봤습니다. 제 방법이 틀렸는지 효과가 없더군요.... 시간될때 다시 해볼 작정이입니다.
참고로 github 사이트에 제가 써놓은 벤치마크 결과는 vanish 캐시서버 - nginx + php5-fpm 세팅입니다.
-
wkp
2015.07.11 14:50
nginx 리버스 캐시 프록시 테스트 결과를 올렸습니다~ 이 패치를 쓰면 Varnish와 마찬가지로 성능향상이 있습니다.
본문 참조하시길
이 간단한(?) 패치를 쓰지 않으면 성능향상이 없습니다. (40~80RPS) 이 패치를 쓰면 무려 5000RPS ~ 20000RPS까지 올라갑니다.
단 nginx의 경우 세팅을 미세하게 조절해야 하네요. varnish는 설정을 거의 건드리지 않고 기본 설정으로 성능의 향상을 볼 수 있습니다.
-
XE러버
2015.07.11 22:48
멋지네요!! 정말 좋군요!
-
다미아빠
2015.07.11 23:06
으어어어!! 깃허브 봤는데.. 뭔 말인지 하나도 몰르겠어..ㅋㅋㅋ
-
기진곰
2015.07.12 00:12
[요점정리]
wkp님의 제안을 한 마디로 줄이자면 "로그인하지 않은 방문자에게는 세션을 부여하지 말자"입니다. (지금은 로그인 여부와 관계없이 모든 방문자에게 세션을 부여합니다.) 세션을 부여받지 않은 방문자들은 서로 구별되지 않기 때문에, 다른 사람에게 뿌려주었던 페이지를 통째로 캐싱해 두었다가 다시 뿌려주어도 무방합니다. 대부분의 사이트는 로그인하지 않은 방문자가 다수이므로, 이렇게 하면 페이지 로딩속도를 향상시키고 서버 부하를 대폭 줄일 수 있습니다.
예를 들어 로그인하지 않은 방문자 1000명과 로그인한 방문자 100명이 있다면, 기존의 방식으로는 페이지를 1100번 생성해야 하지만 이 방식대로는 101번만 생성하면 됩니다. 로그인한 방문자들에게 각각 따로 생성해서 뿌려주고, 한 번 더 생성해서 나머지 1000명에게 일괄적으로 뿌려주는 거죠.
깃허브에서 논란이 되고 있는 이유는 XE의 내장 모듈과 애드온들은 물론이고, 자료실의 서드파티 모듈과 애드온들도 죄다 수정이 필요하기 때문입니다. 그렇지 않으면 다 먹통이 되어버릴 우려가 있어요. 예를 들어 로그인하지 않은 방문자 1000명 중 1명이 장바구니에 물건을 담는다면? 다른 999명에게까지 일괄적으로 적용되어선 안되겠죠? 즉, 로그인하지 않더라도 세션을 부여해서 별도의 방문자로 취급해 줘야 하는 경우가 있다는 거죠. 이게 어떤 경우인지 일일이 파악해서 적절히 수정해 주는 것이 관건입니다.
그래서 서드파티 모듈과 애드온을 일일이 수정하지 않고도 코어에서 세션 필요 여부를 자동으로 감지하는 방법도 별도로 (#1613) 논의되고 (#1615) 있습니다.
-
숭숭군
2015.07.13 21:42
대단하네요!! 그리고 해결책을 뚝딱 제시하시는 기진곰님이 부럽기도 하네요.
-
아론1d869
2015.07.13 21:18
Varnish는 SSL을 지원하지 않습니다. wordpress에서 이에 대한 다양한 솔루션 및 동영상이 있는데 대충 살펴보면 서버가 2~3대만 있다면야 좋겠지만 VPS나 웹호스팅에서는 구현이 거의 불가능하죠.(억지로 구현은 불가능한것도 아니지죠. 구글링해도 많이 나오구요)
http://rtcamp.com 에서 이에 대한 부정적인 입장인 회사중의 하나인데
nginx에서 자체 제공하는 캐쉬 기능으로 varnish의 기능을 대체하는것이 좋다라고 조언을 하고 있습니다.
xe로 테스트를 해본것은 아니지만 실제로 varnish를 써보다가 ssl때문에 좌절을 했었고..이것은 두고 두고 varnish의 발목을 잡을것으로 보여집니다.
php7의 출현으로 인해서 많은 환경이 변화할것이 예상되기때문에 개인적으로 실험적인 방법이외에 실제 서비스 적용에는 무리가 있다고 보여집니다.
가장 안전한 방법은 nginx 자체 캐쉬기능 + memcache + php 캐쉬 그리고 뛰어난 xe의 캐쉬 콘트롤 기능의 탄생(?) 등이 좋다고 보여집니다.
varnish가 나쁘다는것이 아니라 치명적인 단점이 존재하는것이구요 정말 좋은 솔루션이긴 합니다.
그리고 varnish는 기본설정으로 쓰는 것이 아닙니다. 최적화를 위해서 환결설정을 해야 합니다. 잘 모르시는 분들은 머리 쥐어짜야 하는 수준입니다. 이 부분을 잘 설정해야 좋은 성능을 내구요.
nginx 캐쉬 설정이 오히려 100배 쉽습니다.
-
기진곰
2015.07.13 21:30
Varnish든 nginx든 cloudflare든, HTTP 캐싱의 기본적인 개념은 똑같죠. 모두 똑같은 헤더로 조종 가능하고요. SSL이 필요한 사이트는 nginx나 cloudflare를 쓰면 그만입니다. 아니면 Varnish 앞단에 로드밸런서를 두고 거기서 SSL termination을 담당하도록 해도 되고요. 어차피 캐싱 서버가 필요한 사이트라면 상당히 큰 규모입니다. 설마 웹호스팅 수준은 아니겠죠.
아무튼 모든 페이지에 일괄적으로 no-store, no-cache, post-check=0, pre-check=0 헤더를 붙이는 버릇은 IE6처럼 캐싱에 대한 기본적인 개념조차 없는 브라우저가 많이 쓰이던 시절에 나온 궁여지책입니다. 이제는 좀더 지능적인 캐싱을 사용할 수 있는 세상이 되었죠. 세부적인 방법에 대해서는 이견이 있을 수 있지만, 언젠가는 바꿔야 하는 부분이긴 합니다.
PHP7은 실행속도가 1.5~2배 빨라지고 개발자를 위한 새로운 문법들이 추가되는 것 외에는 5.6과 크게 다를 것이 없습니다. 대대적인 변화가 있을 거라고 생각되지는 않네요.
-
아론1d869
2015.07.13 22:22
좋은 말씀감사합니다. 말씀하신 큰 규모의 사이트 즉,, varnish까지 앞단에 두고 써야할 규모라면 XE를 쓸 필요가 있을까요? 어차피 큰 규모의 사이트라면 자체 개발을 하겠죠. 아니면 xe를 수정을 해서 쓰겠지만 그것도 개인적으로 비효율적이라고 생각됩니다. 제가 좀 짧은 생각일수도 있겠지만..
cloudflare도 세밀한 조정면에서는 한계가 있던데요. 매우 좋은 서비스이긴 하더라구요. 이것도 사이트와 서비스 규모에 따라서 다른 생각을 가진 분들이 많겠지만요.
varnish가 xe의 속도를 100배 끌어올렸다면 다른 캐싱 서버도 비슷한 성능을 낼수있다고 봅니다.
SSL도 해결 방법이 있죠. apache(or nignx) with ssl > varnish > nginx 이렇게 해버리면 되니까요. 그러나 넘 복잡해지니까 ..치명적인 단점이라고 얘기한거예요 ^^
대형사이트에서 저런 식으로 구성하게 되면 얼마나 많은 리소스가 낭비가 될까요.
네이버 개발자들의 보여준 동영상에서도 varnish는 정말 탁월한 성능을 보여주더군요.
php7이 1.5~2.0배라면 엄청난 성능 향상인데 아닌가요? :)
이런 성능 향상에 더 나은 캐싱 솔루션이 나올것이라고 예상한것인데 제가 글이 좀 짧았나봐요.
그냥 캐시에 대해서 관심이 많아서 글을 적고 가게 되었네요.
좋은 글 잘 보고 갑니다. 감사합니다.
-
wkp
2015.07.14 07:57
클라우드플레어가 있기전에는 그거 왜 필요한가 의문시하시던 분들이
이제는 왠만한 소규모 사이트라 할지라도 클라우드플레어를 쓰시죠. 왜냐면 트래픽이 거의 40~50%까지도 절감을 해주니까요.
varnish의 효과를 알고있었기때문에 6월 즈음부터 XE + varnish + 아파치를 시범 운용할 기회가 있어서 같이 써보고 있던 중이었습니다. 그간 XE에서 varnish같은 캐시 서버를 제대로 지원하지 못하고 있었기때문에 언젠가 고치겠다고 벼르고만 있다가 이번에 XE 패치를 내놓게 되었는데요,
varnish 사용하기 전에는
1. 사이트가 반응속도가 느리다. 좀 개선할 수 없느냐 ? (Dom 컨텐츠 로드타임 800ms 이상. 메인 컨텐츠 ~300ms) - nginx + php5-fpm으로 백엔드 교체 - 반응속도 좀 나아짐
2. 광고 떼자. 그것때문에 좀 느리다. - 광고 일부 제거 (Dom 컨텐츠 로드타임 ~500~800ms, 메인 컨텐츠 ~200ms)
이러던 것이 캐시서버를 위한 XE패치 적용 이후에는 Dom 컨텐츠 로드타임이 ~300~800ms 수준으로 줄어들었으며, 메인 컨텐츠의 로드타임이 50~100ms 이하가 되었습니다.
varnish 쓰기 전에 서버로드 조금은 들쭉날죽 => varnish 쓰고나니 서버 로드가 안정적 => XE패치 적용 이후 체감상 팍팍 뜨고 예전에 비해서 서버 로드도 안정적.
시간되면 예전의 모니터링 자료 + 패치 이전 / 이후의 모니터링 자료를 모아서 공개해야겠네요.
-
기진곰
2015.07.14 09:43
처음부터 크게 갈 생각으로 만든 사이트라면 목적에 맞게 자체개발을 하겠죠. 그러나 작은 규모로 시작된 사이트가 점점 커지다 보면 아주 비효율적인 구조를 그대로 유지하거나 오히려 더 복잡하게 만들어야 하는 경우도 많습니다.
디씨인사이드도 처음에 제로보드로 시작해서 계속 커스터마이징을 하다가 결국 한계에 부딪혀 갈아엎었다고 하죠. 일베는 여전히 XE를 쓰고 있습니다. 마개조했다는 소문이 돌긴 하지만... 해외의 유명 신문사, 잡지사들 중에도 초창기 시절부터 쓰던 워드프레스를 여전히 사용하는 곳이 심심찮게 있습니다.
방문자수 기준으로 세계 10위권 안에 드는 위키백과는 무겁기로 유명한 mediawiki를 사용하지만, varnish와 squid를 사용한 막강한 캐싱으로 버티고 있죠. 얼마 전 HHVM으로 전환하면서 PHP7과 비슷한 2배 정도의 성능 향상을 얻었다고 광고하던데, 그렇다고 100배 이상 빨라지는 varnish를 버릴 생각은 전혀 없어 보이네요.
-
tohappy
2015.07.13 22:01
정말 알찬 정보네요^^
-
꾸링
2015.07.14 19:49
@wkp @기진곰
두분이서 엄청 획기적인 것을 발명하셨는데
도통 일반 유저는 깃허브 참고 주소를 알려주셔도
어디서 부터 작업을 해야하는지 모르겠습니다.
적용을 하고싶어도 중구난방(깃허브를 잘 사용할줄 모르는 이용자입장에선..)으로, 전문 기술내용으로
토론 내용이 적혀있어서 도저희 모르겠네요..
XE와, 서버 설정방법을 차근차근 하나씩 적용할 수 있는 방법을 알려주시면 많은 분들이 적용해서
만들어주신 기능을 잘 사용할 수 있을 것 같습니다..
PS. 깃허브를 봐도 해당 부분은 Nginx 에만 적용이 되는 사안인가요?
일반 Apache를 사용하는 이용자는 적용이 안되는지..?
언급에 엔진엑스만 자꾸 되어있네요..
-
wkp
2015.07.14 20:49
배포판을 알려주시면 더 자세히 설명드리겠습니다~
1. varnish cache 서버를 설치합니다. 최초 설치하면 포트가 번호가 80이 아닌 다른 번호로 설정되어 있습니다.
2. 웹서버(아파치 혹은 nginx) 포트를 80이 아닌 다른 포트 번호로 설정합니다. 예를 들어서 8080 혹은 8000번같은 번호 혹은 아예 다른 번호도 됩니다.
3. varnish 포트 설정을 아파치/nginx에서 설정한 포트번호로 바꿔주고, vanish 캐시서버 자체의 포트를 80으로 맞춰줍니다.
클라이언트 -> http://foobar.com:80 (varnish 캐시서버) -> 로컬 호스트의 8080 혹은 8000포트 (아파치 혹은 nginx 포트)
일단 여기까지가 varnish를 설정하는 일반적인 방법입니다.
이것이 완료된 후에는 캐시친화적으로 만들어주는 이 패치를 적용하시면 됩니다. (현재 개발중인 단계라서 제가 만든 패치와 기진곰님이 만든 두가지 패치가 있습니다만 하는 일은 기본적으로 같다고 보시면 됩니다.)
참고로 현재 이 패치가 직접 적용되고 운용되고 있는 사이트가 리그베다위키입니다.
-
기진곰
2015.07.14 20:53
(제 패치를 기준으로 말씀드리자면) 적용하지 마세요. 아직은 매우 실험적인 기능이고, 특별한 환경이 아니면 작동조차 되지 않습니다. 잘못하면 여기저기 다 망가집니다. 좀 안정화되고 나면 코어에 적용되거나 별도의 매뉴얼이 나오겠지요.
깃허브에서 유통되는 패치들 대부분이 마찬가지입니다. 당장 심각한 버그를 해결하기 위해 필요한 패치가 아니라면 "아, 이런 것이 논의되고 있구나" 정도로만 생각하세요 ^^
-
wkp
2015.07.18 19:59
현재 하위호환성 문제는 모두 제거되었으며, https://github.com/xpressengine/xe-core/pull/1598 패치가 최소한의 변경을 하도록 만들었습니다.
@kijin 님의 #1615 PR에는 여기에 몇가지 기능적인 부분이 더 추가된 부분만 빼놓고 이 패치와 대동소이하다고 보시면 됩니다.
예전 방식
예전에는
session_start()
가 무조건적으로 호출되어 캐시를 방해했었지요. 클라이언트에서 쿠키를 제대로 지원하지 않는 경우 매번PHPSESSID
쿠키가 세팅이 되어 캐싱을 방해하였습니다.이 패치의 방식
- 일반 비 로그인 사용자 -
session_start()
자동 호출 안됨 - 캐시서버에서 캐시가 가능해지고 캐시 HIT율을 높아지게 만듦 - 세션을 사용하는 애드온을 쓸 경우 - 자동으로 판별하여
session_start()
선택적으로 호출됨
session_start()
가 단 한번이라도 호출되어$_COOKIE['PHPSESSIND']
가 세팅되기만 하면session_start()
는 매request
마다 무조건 호출되게 됩니다. (예전 방식과 구분할 수 없게 됨)이 PR을 잘 이해하지 못하신 분들이 있는것 같아서 현재 상태를 요약해보았습니다.
이 PR을 적용할 경우에 다음과 같은 장점을 예상할 수 있습니다.
- 클라우드플레어 캐시 적중률을 높여줍니다.
- nginx 리버스 프록시 캐시를 사용하는 경우에도 캐시 서버의 성능 향상이 가능합니다.
이 패치를 적용하지 않은 상태에서 XE는 현재 아파치 벤치마크로 ~200RPS(Requests per second) 정도 나오고 있는 서버에서, 이 패치를 적용하고 varnish 캐시서버+nginx+php5-fpm을 사용하면 성능이 최소 5000RPS~ 최대 20000RPS까지 향상이 있습니다. 이는 다음을 말해줍니다.
- 패치 미적용시: 200RPS - 1PV당 10리퀘스트로 본다면 하루 최대 2백만 PV까지 커버 가능
- 패치 적용 + varnish 사용: 5000~20000RPS - 1PV를 100 리퀘스트 정도로 낮게 책정한다 해도 5백만 ~ 1천만PV까지 커버가 가능.
- 일반 비 로그인 사용자 -
-
Luatic™
2015.07.18 20:51
이런건 솔직히 깃에서 논의했으면 합니다. 일반 유저분들 서버호스팅도 아닌데 저렇게 셋팅하고 싶다는 분들도 생겨나고 = ㅅ=; 안정성도 입증되지 않았는데 저런 서버 없냐고 문의도 오네요, 이거 적용할려면 XE전용서버를 만들어야 하는데 호스팅업하시는분들은 솔직히 할지.. 의문입니다., 수치상 100배 환경에 따라 다를 수 있는건데..에효
-
wkp
2015.07.18 20:59
이 PR을 적용하면 varnish 캐시서버 지원하지 않더라도 클라우드플레어에서 캐시 적중률을 높이는것이 가능해집니다.
이것보다 몇배는 더 안정적이지 않은 PR이 이미 수차례 적용되어서 호환성깨지고 난리도 아니었던적이 몇번인데 겨우 이정도가지고 뭐라고 하시는게 오히려 이해가 되지 않네요.
이 패치야 말로 서버 호스팅하시는 분들에게 제격인 패치입니다.
서버 대해서는 무지해서.. 좋은 팁인것 같은데..
저 같은 호스팅 이용자로써는 울고 갑니다ㅎㅎ
varnish 캐시서버가 뭔지 찾아 봐야겠..